拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Statsmodels miscmodels 模块实战指南:用 GenericLikelihoodModel 快速搭建自定义 MLE 模型

数据分析数据科学科研【免费下载链接】statsmodelsStatsmodels: statistical modeling and econometrics in Python项目地址https://gitcode.com/gh_mirrors/st/statsmodels点击查看免费下载statsmodels.miscmodels是 Statsmodels 中用于收纳尚未归入正式模块的模型类的实验性专区。它收录了一批基于通用极大似然框架GenericLikelihoodModel构建的模型包括带偏移量与零膨胀的泊松回归族、以及残差服从 t 分布的线性模型TLinearModel。本文以 docs/source/miscmodels.rst 为骨架结合 statsmodels/miscmodels/ 的源码与测试讲解如何只定义对数似然函数、用三行代码搭出一个新模型并系统梳理这些模型的参数、数学形式、数值注意事项与使用陷阱。模块定位待打磨模型与通用 MLE 的实验场根据文档的定位miscmodels收录的是尚不适合放入任何正式类别、或者基础实现尚未打磨、未来很可能继续变动的模型类。它承担着三重职责过渡区把还不稳定的实现暂存于此成熟后再迁往正式模块例如离散计数模型discretemod、GLM 等教学样板为通用极大似然框架Generic Maximum Likelihood提供可直接阅读、可运行的示例新模型孵化器未来可能出现基于广义矩方法GMM的其他实现。模块本身通过 statsmodels/miscmodels/api.py 对外暴露四个类其__all__声明为__all__ [PoissonGMLE, PoissonOffsetGMLE, PoissonZiGMLE, TLinearModel]即三个泊松计数模型与一个 t 分布误差线性模型分别位于 statsmodels/miscmodels/count.py 与 statsmodels/miscmodels/tmodel.py。需要特别说明的是文档明确给出了精度警告这些模型只做了基本场景的检查比正式实现更容易暴露数值问题。例如miscmodels.count.Poisson仅依赖通用 MLE 框架标准误基于 Hessian 的数值求值而discretemod.Poissonstatsmodels/discrete/discrete_model.py使用解析梯度与解析 Hessian在自变量存在较强多重共线性时精度更高。因此正式场景应优先选择discretemod与 GLM 实现miscmodels更适合学习、验证与定制。核心基座GenericLikelihoodModel 的架构与设计miscmodels中所有模型都继承自 statsmodels/base/model.py 中的GenericLikelihoodModel。它的设计哲学是允许拟合任意似然函数子类只需指定对数似然若对数似然是按观测逐个给出的即nloglikeobs那么需要雅可比矩阵的结果如score_obs、bsejac都会自动可用。初始化与关键参数GenericLikelihoodModel.__init__的签名源码如下参数类型说明endogarray_like一维因变量exogarray_likenobs x k自变量矩阵默认不含截距需用户自行添加loglikecallable若提供则本实例用它替代类的loglike/loglikeobs方法scorecallable若提供则替代类的score方法梯度hessiancallable若提供则替代类的hessian方法missingstrnone不检查 nan、drop丢弃含 nan 观测、raise报错默认noneextra_params_nameslist of str不在exog中的附加参数名会追加到exog_names末尾**kwds—公式接口下用于设置模型属性的额外参数值得注意的是exog参数An intercept is not included by default and should be added by the user——这与常规建模习惯不同是新手最常踩的坑。默认的数值微分管线如果子类不覆写梯度、雅可比与 Hessian则全部基于数值前向差分计算源码score(params)对loglike做approx_fprime中心差分score_obs(params)对loglikeobs逐观测求数值雅可比hessian(params)调用statsmodels.tools.numdiff.approx_hess数值求 Hessian。这带来两个直接后果文档与源码Notes均明确提示数值微分可能导致精度问题Hessian 可能不正定即使 Hessian 不正定基于雅可比外积outer product of the Jacobian的参数协方差矩阵仍可能有效——这正是GenericLikelihoodModelResults中bse、bsejac、bsejhj三种标准误并存的原因。优化器选择规则文档在Notes中给出了优化方法依赖矩阵优化器所需信息nmNelder-Mead、powell仅需似然函数bfgs、cg、ncg似然函数 score/梯度ncg的 Hessian 可选newton似然函数 score/梯度 Hessianfit方法的默认参数为methodnm、maxiter500当未传入start_params时若类属性start_params存在则使用它否则退化为0.1 * np.ones(self.nparams)源码。此外fit默认注入cov_typenonrobust源码。参数固定机制expandparams / reduceparamsGenericLikelihoodModel提供一套参数固定parameter fixing机制源码expandparams(params)用self.fixed_params中固定位置的值填充完整参数向量掩码self.fixed_paramsmask标记哪些位置是自由的reduceparams(params)其逆操作从完整参数中取出自由参数。tmodel.py在固定自由度时正是借助fix_df构造fixed_params而在 test_generic_mle.py 中test_reduceparams_expandparams_roundtrip验证了二者互为逆运算reduceparams(expandparams(p)) p。参数命名与自由度调整_set_extra_params_names(extra_params_names)源码把附加参数名追加进exog_names设置k_extra并自动从df_resid中扣减k_extra。TestTLinearModelMixin.test_dftest_tmodel.py验证了自由度关系df_resid nobs - k_vars - k_extra df_model k_vars - 1 # -1 表示截距 len(params) k_vars k_extradf_model k_vars - 1的前提是设计矩阵含常数项无 exog 的模型如TwoPeakLLHNoExog则手工设置df_model 0。计数模型族PoissonGMLE / PoissonOffsetGMLE / PoissonZiGMLE文档在 Count Models 一节通过 autosummary 列出三个类PoissonGMLE、PoissonOffsetGMLE、PoissonZiGMLE。三者构成递进关系朴素泊松 → 带偏移量 → 零膨胀。PoissonGMLE三行代码定义模型的最小示例PoissonGMLEcount.py的注释直言copied from discretemod.Poisson其核心是唯一的模型定制点nloglikeobsdef nloglikeobs(self, params): XB np.dot(self.exog, params) endog self.endog return np.exp(XB) - endog*XB np.log(factorial(endog))这对应泊松对数似然对单观测$$\ln L \sum_{i1}^{n}\left[-\lambda_{i} y_{i}x_{i}\beta - \ln y_{i}!\right],\quad \lambda_{i}e^{x_{i}\beta}$$其中factorial(endog)来自scipy.special。该方法返回逐观测的负对数似然向量框架负责求和、数值微分与优化。这正是文档强调的通过继承GenericLikelihoodModel可以很容易地添加新模型的直观体现——PoissonGMLE除对数似然外没有覆写任何统计方法。类还提供了predict_distribution(exog)给定新的解释变量返回一个mu exp(exog params)的冻结scipy.stats.poisson分布对象可直接用于概率查询与抽样frozen_dist mod.predict_distribution(exog_new) frozen_dist.pmf(k) # 预测分布下 k 的概率PoissonOffsetGMLE在线性预测子中加入偏移量PoissonOffsetGMLEcount.py在泊松模型之上加入 offset。其__init__处理偏移量的形状转换一维转为列向量再ravel对数似然变为XB self.offset np.dot(self.exog, params)在建模已知暴露量/人口基数的计数场景如发病率、事故率中offset 通常取log(exposure)使模型从计数建模转为比率建模。无 offset 时self.offset 0.行为与PoissonGMLE一致。PoissonZiGMLE零膨胀泊松ZIPPoissonZiGMLEcount.py处理过多零的计数数据。它通过extra_params_names[zi]引入一个额外的膨胀概率参数并用 logistic 变换保证其落在 (0,1)gamm 1 / (1 np.exp(params[-1])) # 膨胀概率 XB self.offset np.dot(self.exog, beta) nloglik -np.log(1 - gamm) np.exp(XB) - endog*XB np.log(factorial(endog)) nloglik[endog 0] -np.log(gamm np.exp(-nloglik[endog 0]))对非零观测使用标准泊松负对数似然对零观测概率是膨胀部分 泊松零概率之和取负对数。其__init__还做了几件关键初始化count.pyself.k_extra 1并在调用super().__init__时传入extra_params_names[zi]若exog is None退化为仅含常数项的设计矩阵np.ones((self.nobs, 1))设置start_params np.hstack((np.ones(self.nparams), 0))回归系数取 1、zi 取 0并放入cloneattr以便拟合时同步手工将nparams加 1容纳膨胀参数。已知数值问题务必注意文档与源码注释共同揭示 ZIP 的已知问题若真实模型不存在零膨胀则数值 Hessian 中膨胀概率对应的行列接近零、不可逆删除对应行列后 Hessian 可逆且bse正常pinv伪逆也可用BFGS 优化器过于脆弱可能无法收敛返回nm慢但似乎可靠数值 Hessian 需要更好的缩放start_params的合理设置至关重要。测试方面test_poisson.py 的CompareMixin展示了这套实现的验证基准PoissonGMLE的参数、bse、tvalues、pvalues与discretemod.Poisson及 GLM 泊松结果对比精度达DEC5 5位小数参数与协方差或DEC4 4位t 值与 p 值并断言自由度关系df_resid nobs - k_vars - k_extra。TLinearModelt 分布误差线性模型文档在 Linear Model with t-distributed errors 一节指出仅需指定对数似然方法即可定义一个新模型所有结果统计量均从通用似然模型与结果类继承且简单场景下的结果已与 R 对照验证。这正是TLinearModeltmodel.py的写照。动机厚尾与稳健性由于 t 分布比正态分布有更厚的尾部它适合建模重尾数据与含离群值的观测能为均值或均值参数提供更稳健的估计。模块 docstring 引用了经典文献Lange, Little Taylor (1989) 发表于Journal of the American Statistical Association的 Robust Statistical Modeling Using the t Distribution。对数似然与参数布局nloglikeobstmodel.py实现单观测负对数似然$$\ln f(x)\ln\Gamma\left(\frac{df1}{2}\right)-\ln\Gamma\left(\frac{df}{2}\right)-\frac{1}{2}\ln(df\pi)-\frac{df1}{2}\ln\left(1\frac{x^{2}}{df}\right)-\ln(scale)$$其中 $x(y-X\beta)/scale$。关键细节这里用的是标准 t 分布而非标准化 t 分布因此scale参数并不等于标准差两者关系为 $\sigma scale \cdot \sqrt{df/(df-2)}$df 2 时。参数向量布局为位置含义说明前k_vars个回归系数betaloc exog beta倒数第 2 个自由度df决定尾部厚度df 越小尾部越厚倒数第 1 个scale代码中取np.abs(params[-1])保证正值实现中还通过self.fixed_params/self.expandparams支持固定部分参数源码注明该路径在本模型中测试有限。initialize参数名、起始值与自由度控制initializetmodel.py完成了建模所需的全部簿记工作读取self.fix_df可通过构造函数传入。若为False默认df与scale均自由估计k_params k_vars 2附加参数名[df, scale]若fix_df为数值则固定自由度k_params k_vars 1用np.nan标记自由位置、fixdf[-2] self.fix_df固定 df附加参数名仅[scale]调用super().initialize()后再执行_set_extra_params_names因基类初始化会设置默认df_resid与_set_start_params。_set_start_paramstmodel.py的起始值策略若显式传入start_params直接使用否则先用 OLS 拟合endog ~ exog回归系数取 OLS 参数df的起始值若use_kurtosisTrue用 OLS 残差峰度估算df 6/kurt 4否则默认 5scale起始值取np.sqrt(res_ols.scale)。预测与结果验证predict(params, exogNone)tmodel.py仅使用前exog.shape[1]个系数返回线性预测值exog beta。测试 test_tmodel.py 提供了完整的验证链条TestTModel使用 60 个月度的 Martin Marietta 股票收益与 CRSP 市场收益数据源自m_marietta/CRSP数组见 test_tmodel.py以methodbfgs拟合test_basic将参数、标准误、t 值、p 值、自由度、scale 与 R 参考结果results_tmodel.py对比位置参数精度达atol3e-5test_bse验证bsejac与bse大致一致rtol 0.10~0.15印证了数值微分的合理性TestTModelFixed以fix_df3固定自由度验证参数固定路径此时k_extra 1test_formula验证from_formula公式接口与直接构造结果一致atol1e-4注意测试中该调用触发DeprecationWarning以pytest.warns捕获。如何自定义一个新模型通用 MLE 三步法综合miscmodels的三个模型与基类设计自定义模型的标准流程可归纳为三步继承GenericLikelihoodModel实现nloglikeobs(self, params)返回逐观测负对数似然或实现loglike但逐观测版本能解锁更多结果在__init__或initialize中声明附加参数调用_set_extra_params_names([...])或通过extra_params_names传参必要时覆写initialize设置合理的start_params如TLinearModel用 OLS 初值、PoissonZiGMLE用全 1/全 0 初值调用fit(method...)按需选择优化器纯似然用nm/powell有梯度可用bfgs追求二次收敛精度用newton。test_generic_mle.py 还给出了两个极具教学价值的自建模型范例MyParetotest_generic_mle.py用 3 个附加参数[shape, loc, scale]拟合 Pareto 分布TestMyParetoRestriction演示了把loc固定为 -0.1 的参数限制用法TwoPeakLLHNoExogtest_generic_mle.py完全不含exog的双组分信号/背景混合模型仅靠extra_params_names声明参数名fit()后参数可恢复到真值rtol1e-1并支持res.bootstrap(nrep50)自举标准误。此外 test_generic_mle.py 中的test_summary_after_remove_data验证了summary()在res.remove_data()之后仍可工作说明结果对象的内存管理与标准 Statsmodels 结果类保持一致。总结与使用建议statsmodels.miscmodels的价值不在于替代正式实现而在于以最小代码量展示通用 MLE 框架的全部能力。使用前请记住以下几点精度取舍数值梯度/Hessian 是默认配置强共线性下精度劣于discretemod.Poisson的解析实现需要高精度时以正式模块结果为准数值稳定性ZIP 模型在无真实零膨胀时 Hessian 奇异BFGS 可能不收敛nm更稳妥合理的start_params是收敛的关键截距不自动添加GenericLikelihoodModel与常规模型不同构造时记得sm.add_constant或add_constant见 test_tmodel.py附加参数需声明任何超出exog的参数zi、df、scale、shape等都必须通过extra_params_names或_set_extra_params_names注册否则自由度与结果表都会出错调试入口充分test_poisson.py、test_tmodel.py、test_generic_mle.py 三套测试覆盖了与 R 结果比对、与正式模块比对、参数固定往返、公式接口等所有关键路径是学习数值 MLE 实现的现成教材。如果读者希望深入了解基类的更多细节可直接阅读 statsmodels/base/model.py 中GenericLikelihoodModel与GenericLikelihoodModelResults的完整实现这两个类是miscmodels一切能力的地基。赞分享数据分析数据科学科研【免费下载链接】statsmodelsStatsmodels: statistical modeling and econometrics in Python项目地址https://gitcode.com/gh_mirrors/st/statsmodels点击查看免费下载相关推荐BongoCat自定义模型快速上手指南BongoCat自定义模型快速上手指南 想要让桌面上的BongoCat变得与众不同吗本文将通过简单三步帮助你将任何Live2D模型转化为能够响应键盘鼠标操作桌面应用PHP Font Lib 实战案例构建企业级字体管理系统完整教程PHP Font Lib 实战案例构建企业级字体管理系统完整教程 想要为您的企业构建一个专业的字体管理系统吗PHP Font Lib 是您的完美解决方案这开发工具VSS Sparse4D多相机3D检测详解如何重建空间并跟踪3D目标VSS Sparse4D多相机3D检测详解如何重建空间并跟踪3D目标 VSSNVIDIA AI Blueprint for Video Search and人工智能大模型AI AgentRAG计算机视觉视频后端上一篇PyFluent终极指南5分钟上手Python驱动的CFD仿真自动化下一篇如何快速集成React-Toastify为您的React应用添加精美通知的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门