Statsmodels中sm.GLM与smf.glm系数符号相反问题咨询
sm.GLM与smf.glm系数符号相反的原因解析
问题重现
作为statsmodels新手,发现使用sm.GLM和smf.glm拟合二项GLM时,系数符号完全相反。例如用《Python统计学习导论》的Default数据集,sm.GLM得到balance系数为0.0056,smf.glm得到的却是-0.0056,其余系数符号也全部翻转。
代码示例
sm.GLM实现
import numpy as np import pandas as pd import statsmodels.api as sm np.random.seed(0) Default = pd.read_csv('../data/Default.csv') X = Default[["balance", "income"]] Y_ = Default.default == 'Yes' X = sm.add_constant(X) glmtest = sm.GLM(Y_, X, family=sm.families.Binomial()).fit() glmtest.summary()
smf.glm实现
import statsmodels.formula.api as smf mod1 = smf.glm( formula="default~income+balance", data=Default, family=sm.families.Binomial() ).fit() mod1.summary()
核心原因:响应变量的编码逻辑差异
两者系数符号相反的本质是模型拟合的响应事件不同:
sm.GLM中,Y_ = Default.default == 'Yes'将响应变量编码为1(Yes)和0(No),模型拟合的是**logit(P(default=Yes))**,系数反映变量对“违约(Yes)”概率的影响。smf.glm中直接传入分类列default时,statsmodels公式接口默认将分类变量的第一个类别(通常是字母顺序或数据中首次出现的类别,这里是No)作为参考类别,模型拟合的是**logit(P(default=No))**。
由于P(default=No) = 1 - P(default=Yes),对应的logit变换满足:
logit(P(No)) = log[(1-P(Yes))/P(Yes)] = -logit(P(Yes))
因此两个模型的系数符号会完全翻转。
解决方法
要让两者结果一致,只需统一响应变量的编码逻辑:
方法1:修改smf.glm的响应变量定义
显式指定拟合P(default=Yes),和sm.GLM的逻辑对齐:
mod1 = smf.glm( formula="I(default=='Yes')~income+balance", data=Default, family=sm.families.Binomial() ).fit()
方法2:修改sm.GLM的响应变量定义
将响应变量改为拟合P(default=No),和smf.glm默认逻辑对齐:
Y_ = Default.default == 'No' glmtest = sm.GLM(Y_, X, family=sm.families.Binomial()).fit()
内容的提问来源于stack exchange,提问作者tinfangwarble
相关产品推荐
相关产品推荐

