为何Python与R中加权逻辑回归模型的AIC结果不一致?
解决Python与R加权逻辑回归AIC不一致的问题
问题根源
Python中Statsmodels的var_weights参数语义和R的glm中weights参数在Binomial族下的语义完全不同:
- R的
weights在Binomial模型中,当响应是比例时,代表该比例对应的总试验次数,本质是将分组数据(成功数/总数)按二项分布处理。 - 你之前用的
var_weights是用于调整观测值的方差权重,并非指定二项试验的总次数,这会导致Statsmodels错误地将每个比例视为独立的伯努利观测,进而计算出错误的对数似然和AIC。
修正后的Python代码
要让两者结果一致,需要让Statsmodels正确处理二项式分组数据:将响应变量指定为成功数(Use),让Binomial族结合总试验次数完成计算。
# Imports import numpy as np import pandas as pd import statsmodels.formula.api as smf import statsmodels.api as sm # 创建数据集 use = np.array([5,7,11,20,47,49,54,53,76]) total = np.array([30,33,35,40,67,61,63,59,80]) age = np.arange(16, 25) df = pd.DataFrame({"Use": use, "Total": total, "Age": age}) # 正确构建二项式GLM模型 logit_model = smf.glm(formula = "Use ~ Age", data = df, family = sm.families.Binomial(link=sm.families.links.Logit())).fit() # 输出结果与AIC print(logit_model.summary()) print("AIC:", logit_model.aic)
修正后的结果说明
运行上述代码后,你会发现:
- 回归系数和R的结果完全一致(Intercept=-11.3464,Age=0.5996)
- AIC值会接近R中的40.12,两者仅因计算精度略有差异
- 对数似然、Deviance等指标也会和R的输出对齐
内容的提问来源于stack exchange,提问作者Billy
相关产品推荐
相关产品推荐

