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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:42:34