You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中估计Poisson拟极大似然(Quasi-MLE)模型?

自定义Poisson拟极大似然模型的方差实现

需求背景

标准Poisson MLE假设条件均值等于方差,而拟极大似然(Quasi-MLE)允许放松这一约束,比如设定条件方差为a*(条件均值)(其中a为待估计的离散参数)。

错误代码问题分析

你之前的尝试存在三个核心问题:

  1. 自定义方差函数中使用了未定义的变量z,逻辑不符合Quasi-Poisson的方差形式
  2. 调用GLM时错误引用了未定义的sm.families.pois()(应为实例化后的对象,且类名是Poisson而非小写)
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:17:48