Python中如何通过statsmodels提取零广义线性模型AIC、BIC
statsmodels 提取GLM零模型AIC、BIC值的方法
statsmodels拟合广义线性模型返回的GLMResults对象默认没有直接存储零模型(仅含截距的基准模型)的AIC、BIC属性,仅提供了零偏差null_deviance的直接调用入口,你可以通过以下两种方式拿到需要的值:
方法1:显式拟合截距-only零模型直接提取(准确率最高,推荐优先使用)
零模型本质是不纳入任何自变量、仅保留截距项的同参数GLM,你只需要用和原模型完全一致的因变量、模型家族、连接函数、权重/偏移项配置,拟合一个仅含截距的模型,就能直接读取它内置计算好的AIC、BIC,不会出现计算偏差。
参考代码:import statsmodels.api as sm # 以下是原模型拟合的示例逻辑,替换成你自己的建模代码即可 # y = 你的因变量序列 # X = 你的自变量矩阵(原模型中通常已经通过add_constant添加了截距) # glm_model = sm.GLM(y, X, family=sm.families.Poisson()) # glm_res = glm_model.fit() # 构造零模型的自变量:仅1列全1的截距项 X_null = sm.add_constant([0]*len(y)) # 复用原模型的家族配置拟合零模型 null_res = sm.GLM(y, X_null, family=glm_res.family, offset=glm_res.model.offset, freq_weights=glm_res.model.freq_weights).fit() # 直接提取目标值 null_aic = null_res.aic null_bic = null_res.bic这个方法适配所有GLM家族,不管是固定离散度的泊松/二项模型,还是需要估计尺度参数的高斯/Gamma/负二项模型,结果都和statsmodels内置计算逻辑完全一致。
方法2:基于现有null_deviance手动计算(无需重拟合模型)
如果你不想额外跑一次模型拟合,可以根据GLM信息准则的定义,结合结果对象里已有的属性手动计算,注意要对应不同模型类型调整参数计数:计算规则说明:
- 泊松、二项这类固定离散度为1的家族:零模型仅估计1个截距参数,AIC = 偏差 + 2参数个数,BIC = 偏差 + 参数个数ln(样本量),代入零偏差即可算出
- 高斯、Gamma、逆高斯、负二项这类需要额外估计离散/尺度参数的家族:零模型共估计2个参数,计算时需要先把零偏差除以模型估计的尺度值,再代入AIC/BIC公式
这个方法的问题是如果你的模型加了偏移项、自定义权重、特殊链接函数,很容易漏算调整项,非极简场景不推荐用。
内容的提问来源于stack exchange,提问作者lostwanderer
相关产品推荐
相关产品推荐

