如何在Python中估计Poisson拟极大似然(Quasi-MLE)模型?
自定义Poisson拟极大似然模型的方差实现
需求背景
标准Poisson MLE假设条件均值等于方差,而拟极大似然(Quasi-MLE)允许放松这一约束,比如设定条件方差为a*(条件均值)(其中a为待估计的离散参数)。
错误代码问题分析
你之前的尝试存在三个核心问题:
- 自定义方差函数中使用了未定义的变量
z,逻辑不符合Quasi-Poisson的方差形式 - 调用GLM时错误引用了未定义的
sm.families.pois()(应为实例化后的对象,且类名是Poisson而非小写) - Python代码缩进不规范,导致函数定义无效
正确实现方案
方案一:手动自定义方差函数(匹配你参考的二项式示例思路)
# 导入依赖库 import numpy as np import statsmodels.api as sm # 加载样本数据 data = sm.datasets.star98.load() data.exog = sm.add_constant(data.exog, prepend=False) # 定义Quasi-Poisson方差函数:基础方差为mu,后续由scale参数估计a,最终方差=a*mu class QuasiPoissonVariance(sm.families.varfuncs.VarianceFunction): def __call__(self, mu): return mu # 返回均值mu,作为方差的基础项 def deriv(self, mu): return np.ones_like(mu) # 方差对mu的导数为1,保持与mu同形状 # 实例化Poisson家族并替换自定义方差函数 pois_family = sm.families.Poisson() pois_family.variance = QuasiPoissonVariance() # 拟合拟Poisson模型,scale="X2"表示用Pearson卡方估计离散参数a model = sm.GLM(data.endog.NABOVE, data.exog, family=pois_family) results = model.fit(scale="X2") print(results.summary())
方案二:直接使用内置QuasiPoisson家族(更简便)
Statsmodels已内置封装好的QuasiPoisson家族,无需手动定义方差函数:
# 导入依赖库 import numpy as np import statsmodels.api as sm # 加载样本数据 data = sm.datasets.star98.load() data.exog = sm.add_constant(data.exog, prepend=False) # 直接使用内置QuasiPoisson家族拟合模型 model = sm.GLM(data.endog.NABOVE, data.exog, family=sm.families.QuasiPoisson()) results = model.fit(scale="X2") print(results.summary())
关键说明
- 两种方案的核心逻辑一致:方差为
a*mu,其中a是通过scale="X2"参数估计的离散参数(基于Pearson卡方统计量) - 自定义方差函数时,
deriv方法必须返回方差对均值mu的导数,确保模型拟合时的梯度计算正确 - 内置
QuasiPoisson家族已经默认实现了方差=scale*mu的逻辑,是生产环境中的首选方式
内容的提问来源于stack exchange,提问作者Simon Firestone
相关产品推荐
相关产品推荐

