ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

statsmodels GMM 广义矩估计框架完全指南:从矩条件自定义到工具变量回归

statsmodels GMM 广义矩估计框架完全指南:从矩条件自定义到工具变量回归 数据分析数据科学科研【免费下载链接】statsmodelsStatsmodels: statistical modeling and econometrics in Python项目地址https://gitcode.com/gh_mirrors/st/statsmodels点击查看免费下载本指南系统讲解 statsmodels 中基于广义矩估计Generalized Method of MomentsGMM的模型类与函数实现其核心源码位于 statsmodels/sandbox/regression/gmm.py对应官方文档 docs/source/gmm.rst。当前实现覆盖通用的非线性矩条件情形并内置了标准的线性工具变量IV模型作为测试用例。读完本文你将掌握如何通过子类化GMM定义自己的矩条件、配置 one-step / 迭代 / CUE 三种估计策略、选择合适的权重矩阵与优化器以及如何使用LinearIVGMM/NonlinearIVGMM完成工具变量回归与过度识别检验。一、模块定位statsmodels 中的 GMM 实现根据 gmm.rst 的说明statsmodels.gmm实际代码位于statsmodels.sandbox.regression.gmm包含基于 GMM 估计的模型类和函数。模块的定位要点如下当前已实现通用非线性情形GMM接受任意非线性矩条件moment conditions进行估计线性工具变量模型作为测试用例模块内置了标准线性 IV 模型的示例类IV2SLS。文档明确指出该类的引入主要是作为测试用例虽然运行正确但并未利用线性结构线性情形未来将引入专门的实现以获得更快、数值上更精确的结果估计方式灵活既可以针对给定的权重矩阵weighting matrix一次性估计也可以通过迭代方式在“估计最优权重矩阵”与“估计参数”之间交替进行直至收敛扩展机制明确实现具有不同矩条件的模型只需子类化GMM并定义矩条件方法momcond——这是最小化的实现要求。模块的:synopsis:将其概括为A framework for implementing Generalized Method of Moments (GMM)即一个用于实现广义矩估计的框架而非单一模型。二、类层次与模块架构从源码结构看statsmodels/sandbox/regression/gmm.py该模块由三组类构成工具变量 2SLS 类、通用 GMM 框架类、以及 IV-GMM 特化类。其层次关系可以概括如下类父类定位源码位置IV2SLSLikelihoodModel两阶段最小二乘 IV 估计gmm.py#L76IVRegressionResultsRegressionResultsIV2SLS 的结果类含 Hausman 设定检验gmm.py#L189GMMModel通用 GMM 框架基类需子类化定义momcondgmm.py#L442GMMResultsLikelihoodModelResults通用 GMM 结果类提供 J 检验等gmm.py#L1185IVGMMGMM工具变量 GMM 基类矩条件为z * ugmm.py#L1429LinearIVGMMIVGMM线性 IV 模型的闭式解 GMMgmm.py#L1476NonlinearIVGMMIVGMM非线性 IV 模型 GMM需提供funcgmm.py#L1580IVGMMResultsGMMResultsIVGMM 结果类补充 fittedvalues / resid / ssrgmm.py#L1677DistQuantilesGMMGMM基于分位数匹配估计分布参数的示例gmm.py#L1749此外模块还提供了独立的函数spec_hausmangmm.py#L1698用于 Hausman 设定检验。结果类通过文件末尾的results_class_dict字典gmm.py#L1888完成模型类到结果类的映射。三、先用 IV2SLS 上手两阶段最小二乘IV2SLS是该模块中最容易上手的类用于工具变量Instrumental Variables的两阶段最小二乘估计。其构造函数签名与参数含义如下gmm.py#L102IV2SLS(endog, exog, instrumentNone)endog内生被解释变量一维或二维数组nobs × 1exog解释变量一维或二维数组nobs × kinstrument工具变量数组必须同时包含未工具化的外生解释变量和工具变量本身。这里有一个关键的约定需要特别注意根据类文档gmm.py#L91-L99计算中exog里的所有变量都被视为被工具化如果exog中的某些变量不应被工具化那么这些变量同样必须被包含在instrument数组中。另外标准误差计算使用df_resid nobs - k_vars这与 Stata 中ivreg2的small选项相对应。调用fit()gmm.py#L119即可完成估计其内部按照 Greene《计量经济分析》第 5 版第 78 页第 5.4 节的教科书公式计算import statsmodels.sandbox.regression.gmm as gmm # endog: 被解释变量, exog: 解释变量, instrument: 工具变量含未工具化的外生变量 mod gmm.IV2SLS(endog, exog, instrument) res mod.fit() print(res.summary())fit()返回一个RegressionResultsWrapper包装的IVRegressionResults实例。参数估计与协方差是准确的但结果中的其他统计量是否无需修改即可适用尚未经过完整测试源码注释对此有明确提醒见 gmm.py#L128-L134。IVRegressionResults在RegressionResults基础上提供了两个特殊方法spec_hausman(dofNone)gmm.py#L220Hausman 设定检验。它将 IV 估计与 OLS 估计的参数差和协方差差构造为统计量H并按chi2分布计算 p 值自由度为cov_diff的秩当dof未指定时。测试逻辑可对照独立函数 spec_hausmansummary(...)输出包含 Omnibus、Skew、Kurtosis、Durbin-Watson、Jarque-Bera、条件数等诊断信息的摘要表gmm.py#L252。四、GMM 核心类子类化与矩条件定义GMM类是整个框架的核心gmm.py#L442它必须被继承使用子类需要定义矩条件方法momcond。这是最小化实现的唯一硬性要求。构造函数gmm.py#L497签名GMM(endog, exog, instrument, k_momsNone, k_paramsNone, missingnone, **kwds)参数含义参数说明endog内生被解释变量数组exog外生解释变量数组instrument工具变量数组k_moms矩条件个数为None时自动取instrument的列数主要用于确定起始参数与起始权重矩阵的形状k_params参数个数为None时自动取exog的列数**kwds任意附加变量供矩条件计算使用会以属性形式存储到实例上源码中的一个重要设计是GMM 类本身并不直接使用数据endog、exog、instrument与kwds只是被存储起来供矩条件访问gmm.py#L475-L481。哪些数据是必需的、如何使用完全取决于子类矩条件的定义。一个自定义子类的最小骨架如下import numpy as np import statsmodels.sandbox.regression.gmm as gmm class MyGMM(gmm.GMM): def momcond(self, params): # 返回 (nobs, nmoms) 形状的矩条件数组 # 例如矩条件 E[z * (y - f(x, params))] 0 return instrument * (self.endog - self.predict(params))[:, None] def fitstart(self): # 提供数值优化的起始值 return np.zeros(self.exog.shape[1]) mod MyGMM(endog, exog, instrument) res mod.fit(maxiter10)其中momcond(params)返回每个观测对应的矩条件矩阵形状nobs × nmomsfit内部会通过momcond_meangmm.py#L1121求均值后构造目标函数。五、fit() 参数详解从 one-step、迭代到 CUEfit()是估计的入口gmm.py#L582其完整签名fit(start_paramsNone, maxiter10, inv_weightsNone, weights_methodcov, wargs(), has_optimal_weightsTrue, optim_methodbfgs, optim_argsNone)5.1maxiter估计策略的选择maxiter直接决定采用哪一种 GMM 估计方式源码在 gmm.py#L690-L722 中分支处理maxiter取值估计方式说明0或1one-step一步估计使用给定的或默认的起始权重矩阵只做一次加权矩最小化。源码注释提醒一步估计仍与 Stata 的gmm存在差异默认使用异方差稳健协方差但假设权重矩阵是最优的2、10等正整数iterated GMM迭代估计在估计参数 → 用参数重估最优权重矩阵 → 再估计参数之间循环最大迭代次数为maxiter同时满足收敛条件可提前停止cueCUE连续更新 GMM在最小化 GMM 目标函数的过程中同步更新权重矩阵起始值取自 one-step 参数对应fitgmm_cu见 gmm.py#L809迭代流程由fititergmm.py#L909实现其收敛判据是当迭代次数大于 2 且参数变化的绝对最大值maxabs(resgmm - start) self.epsilon_iter时提前终止默认epsilon_iter 1e-6可在实例上修改。5.2inv_weights起始权重矩阵inv_weights是起始权重矩阵的逆。若未提供则调用子类的start_weights方法通用GMM默认返回单位矩阵np.eye(nmoms)gmm.py#L853IVGMM子类返回zz / nobs其逆为pinv(zz / nobs)见 gmm.py#L1450。5.3weights_method与wargs权重矩阵估计方法weights_method定义了用于构造最优权重矩阵的方法其可用选项在类文档gmm.py#L400-L411与calc_weightmatrixgmm.py#L997中有详细说明方法含义备注cov矩条件的简单协方差HC0默认可通过ddof做自由度校正hac异方差自相关一致估计Newey-West 类需在wargs中指定maxlag默认使用 Bartlett 核weights_bartlett可通过kernel传入自定义核函数iid独立同分布假设仅Z*u情形未充分测试仅适用于工具变量情形误差与工具独立需传入params以重算误差项flatkernel均匀截断窗口试验版本要求maxlagac自相关一致估计尚不可用cluster聚类稳健尚未接入wargs是传递给权重矩阵方法的参数gmm.py#L415-L424centeredbool是否对矩条件做中心化去均值后计算权重与协方差适用于所有方法默认 True见 gmm.py#L1044-L1049ddofint自由度校正当前仅适用于cov取k_params时按nobs - k_params校正gmm.py#L1059-L1067maxlagintHAC 计算包含的滞后阶数仅适用于hac/flatkernel。5.4has_optimal_weights协方差矩阵计算假设has_optimal_weightsTrue默认时参数协方差矩阵按最优 GMM权重矩阵W S⁻¹的公式计算cov (GΩ⁻¹G)⁻¹ / nobs否则采用 sandwich 形式(GWG)⁻¹(GWΩWG)(GWG)⁻¹ / nobs实现见 calc_cov_params。对于 one-step 估计协方差计算仍假定权重矩阵最优这正是源码在注释中提醒的已知问题之一gmm.py#L662-L666。5.5optim_method与optim_args数值优化配置optim_method指定参数最小化所用的 scipy 优化器fitgmm 中的映射取值scipy 优化器是否使用解析梯度bfgs默认scipy.optimize.fmin_bfgs是scorenmscipy.optimize.fminNelder-Mead否ncgscipy.optimize.fmin_ncg是cgscipy.optimize.fmin_cg是fmin_l_bfgs_bscipy.optimize.fmin_l_bfgs_b是powellscipy.optimize.fmin_powell否slsqpscipy.optimize.fmin_slsqp否梯度由数值差分实现scoregmm.py#L1163通过approx_fprime对目标函数求导。optim_args为优化器关键字参数默认会注入disp1gmm.py#L687-L688在测试中常见用法是{gtol: 1e-6, disp: 0}以抑制输出并收紧收敛容差。六、GMM 目标函数与得分理解了估计流程后其数学内核值得单独说明。GMM 的目标函数为二次型gmmobjectiveJ(θ) m̄(θ) · W · m̄(θ)其中m̄(θ)是矩条件在参数 θ 处的样本均值momcond_meangmm.py#L1121W是当前权重矩阵。CUE 版本gmmobjective_cugmm.py#L879则在每次目标函数求值内部重新调用calc_weightmatrix计算权重矩阵并取伪逆pinv从而实现权重随参数连续更新这是 CUE 与普通迭代 GMM 的本质区别。七、结果对象 GMMResults推断与检验GMMResultsgmm.py#L1185是fit()的返回类型提供以下核心成员q目标函数在参数估计处的值gmmobjective(params, weights)缓存属性jvalq * nobs_moms即 J 统计量的原始值gmm.py#L1207。注意源码注释提醒jtest的归一化是否乘以或除以 nobs作者本人也不完全确定缩放不影响估计但影响检验量大小gmm.py#L34-L38jtest()gmm.py#L1315过度识别检验Hansen J 检验。返回(jstat, pvalue, df)其中df nmoms - nparamsp 值基于卡方分布stats.chi2.sf(jstat, df)compare_j(other)gmm.py#L1327比较两个嵌套 GMM 估计的过度识别检验用于检验某个矩条件被移除的情形。该方法未经过测试且由于两个模型使用不同权重矩阵差值不保证为正使用时需谨慎cov_params(**kwds)/bse/get_bse()参数协方差与标准误支持通过关键字覆盖weights_method、wargs、has_optimal_weights重算summary(...)输出摘要表右上角显示Hansen J统计量及其 p 值gmm.py#L1383-L1405。IVGMMResultsgmm.py#L1677在GMMResults基础上补充了fittedvalues、resid与ssr残差平方和前提是模型具有加性误差结构y - f(x, params)。八、工具变量 GMM 家族IVGMM、LinearIVGMM 与 NonlinearIVGMM8.1 IVGMM工具变量 GMM 基类IVGMMgmm.py#L1429为工具变量 GMM 提供默认实现其核心矩条件为momcondE[ z · (y - f(x, β)) ] 0即误差 × 工具变量。默认的predict为线性形式x·βstart_weights返回zz / nobsfitstart返回零向量。文档同时说明该类的方法应由子类覆盖——目前实现了LinearIVGMM与NonlinearIVGMM两个子类。8.2 LinearIVGMM线性闭式解LinearIVGMMgmm.py#L1476针对线性工具变量模型E[z·(y - xβ)] 0用闭式表达式替代数值优化器在每个迭代步中直接求解params pinv(xz W zx) · (xz W zy) # 见 fitgmm 实现因此它的fitgmm会忽略start与optim_method参数仅保留签名一致性显著提高速度与数值精度。此外它重写了gradient_momcond为解析形式-zx / nobsgmm.py#L1558score也使用解析表达式。需要注意的命名约定这里的exog指解释变量right-hand side variables既包含外生变量也包含被工具化的内生解释变量而instrument指工具变量需同时包含已含的外生变量与排他外生变量gmm.py#L1490-L1504。8.3 NonlinearIVGMM非线性条件均值NonlinearIVGMMgmm.py#L1580面向非线性条件均值函数f(X, β)矩条件为E[z·(y - f(X, β))] 0。构造时需要额外传入可调用对象func调用约定为func(params, exog)def func(params, exog): return np.exp(exog params) # 例如指数均值函数 mod gmm.NonlinearIVGMM(endog, exog, instrument, func) res mod.fit(maxiter2)该类的导数默认通过数值差分获得jac_func/jac_errorgmm.py#L1642-L1657如果条件均值函数的 Jacobian 已知可以通过子类化并定义jac_func方法来提供解析导数。九、测试验证与 Stata ivreg2 结果对标该模块的可靠性通过一组与 Stata 对照的测试用例得到验证是理解正确用法的绝佳范本。9.1 Griliches76 数据集测试test_gmm.pytest_gmm.py 使用经典的 Griliches 1976 数据集griliches76.dta构建了受教育年限内生的工资方程工具变量模型并与 Stataivreg2的输出结果存储于 results_ivreg2_griliches.py逐项比对。测试矩阵覆盖不同估计策略TestGMMStOnestepmaxiter0、TestGMMStOneitermaxiter1、TestGMMStTwostepmaxiter2、TestGMMSt1maxiter10迭代至收敛对应 results_gmm_griliches.py 与 results_gmm_griliches_iter.py 中保存的参考结果权重矩阵差异TestGMMStTwostepNO/TestGMMStOnestepNO等后缀NO的类对应不同的has_optimal_weights设定与 OLS 一致性TestGMMOLStest_gmm.py#L326将exog同时作为工具变量IVGMM(endog, exog, exog)maxiter0此时 GMM 估计应还原出 OLS 结果参数与 HC0 标准误在5e-4相对容差内一致线性与非线性setup_class中分别构造LinearIVGMMtest_gmm.py#L714与NonlinearIVGMMtest_gmm.py#L766参与同一基准的比对。测试还展示了标准的调用方式先用OLS拟合获取起始值再以w0inv instrument.T instrument / nobs作为初始权重矩阵调用fit(start, maxiter..., inv_weightsw0inv, optim_methodbfgs, optim_args{gtol: 1e-6, disp: 0})见 test_gmm.py#L303-L317。9.2 非线性 Poisson 测试test_gmm_poisson.pytest_gmm_poisson.py 进一步验证非线性矩条件使用NonlinearIVGMM配合指数加性moment_exponential_add与指数乘性moment_exponential_mult两类均值函数估计计数模型比较 one-stepmaxiter0与两步maxiter2估计参考结果保存在 results_gmm_poisson.py。测试类名如TestGMMAddOnestep、TestGMMMultTwostepDefault、TestGMMMultTwostepCenter也验证了wargs{centered: ...}等参数组合对结果的影响。十、进阶示例DistQuantilesGMM 分位数匹配DistQuantilesGMMgmm.py#L1749是另一个演示子类化用法的示例通过匹配理论分位数与经验分位数来估计分布参数。其矩条件定义为理论 CDF 与目标分位数的差momcond distfn.cdf(xquant, *params) - pquant默认分位点为[0.01, 0.05, 0.1, 0.4, 0.6, 0.9, 0.95, 0.99]每个分位点对应一个矩条件。该类还演示了fitonce方法gmm.py#L1835当最优权重矩阵无法数值计算时例如矩条件只有一行、无法构造逐观测协方差使用给定权重矩阵或单位矩阵做单次估计的便捷途径has_optimal_weights默认取False。十一、已知问题与使用注意事项源码头部注释gmm.py#L5-L41与类文档中记录了一系列已知限制使用前应有所了解one-step 估计maxiter0/1与 Stata 存在差异默认使用异方差稳健协方差但假设权重矩阵最优gmm.py#L662-L666权重矩阵无法数值计算的情形如DistQuantilesGMM只有一行矩条件时协方差计算会失效iter1可退化为单位权重矩阵fitonce正是为此设计gmm.py#L10-L19jtest的归一化作者对jval是否应乘以/除以nobs存疑缩放不影响参数估计但影响检验统计量的绝对大小gmm.py#L34-L38Hausman 检验自由度基于协方差差矩阵的秩且该差矩阵常常是半正定/奇异矩阵负特征值现象在 IV 示例中已被观察到gmm.py#L30-L33fitonce情形下的 bse 偏大无最优权重矩阵时的calc_cov_params公式被认为有误因为没有对应的omega估计gmm.py#L38-L41CUE 与compare_j标注为未充分测试iid、ac、cluster等权重方法尚未完整实现或接入gmm.py#L395各方法的选项参数尚未完全实现多个方法中仍有缺失gmm.py#L483-L486例如wargs中拼写错误的键不会被检测。结语statsmodels 的 GMM 模块statsmodels/sandbox/regression/gmm.py提供了一个结构清晰、扩展性强的广义矩估计框架向上GMM基类把定义矩条件与数值估计彻底解耦用户只需实现momcond即可接入 one-step、迭代与 CUE 三种估计流程向下IV2SLS、LinearIVGMM、NonlinearIVGMM覆盖了从教科书两阶段最小二乘到非线性工具变量模型的常见计量场景并经 Griliches 数据与 Stataivreg2结果的测试对标验证。对于需要处理内生性、或需要自定义矩条件做结构性估计的 Python 计量任务这是一个值得熟悉的高价值工具。需要特别留意的是该模块目前位于statsmodels.sandbox沙盒命名空间下部分功能如 CUE、HAC 权重、compare_j仍标注为未充分测试生产使用前建议对照 test_gmm.py 中的用法与已知问题逐项评估。赞分享数据分析数据科学科研【免费下载链接】statsmodelsStatsmodels: statistical modeling and econometrics in Python项目地址https://gitcode.com/gh_mirrors/st/statsmodels点击查看免费下载相关推荐Statsmodels广义矩估计工具变量过度识别检验与权重选择Statsmodels广义矩估计工具变量过度识别检验与权重选择 你是否在处理经济数据时遇到过变量内生性问题是否为工具变量选择和模型有效性检验而困扰本文将通数据分析数据科学科研告别矩形限制LabelImg自定义形状工具完全指南告别矩形限制LabelImg自定义形状工具完全指南 你是否还在为标注不规则物体烦恼使用矩形框标注圆形物体时是否觉得不够精确本文将带你掌握LabelImg的数据标注计算机视觉人工智能5分钟掌握raylib游戏开发零依赖跨平台游戏编程终极指南5分钟掌握raylib游戏开发零依赖跨平台游戏编程终极指南 你是否曾经梦想过创建自己的游戏却被复杂的图形库和繁琐的配置吓退raylib游戏开发库就是为像你数据分析数据科学科研上一篇16GB显存高效部署MiniMax H3量化模型INT4与INT8配置全攻略下一篇plexe数据生成与模式推断让AI自动处理数据科学难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表