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

Python回归:statsmodels GEE模型如何保留分类变量所有水平不删除参考水平

解决方法

你遇到的是statsmodels中GEE模块公式解析的默认逻辑和OLS存在差异的问题:仅添加-1去除截距的写法,在OLS单分类变量场景下可以保留全部水平,但GEE对多分类变量的默认编码逻辑始终会删除一个参考水平避免完全共线性,哪怕已经去掉了截距。

你可以通过以下两种方式实现保留State变量所有分类水平的需求:

方法1:显式指定分类变量的编码规则

利用patsy的Dummy对比度配置,强制不对State变量删除参考水平,修改代码如下:

import statsmodels.formula.api as smf
import statsmodels.api as sm
import patsy # 需额外导入patsy用于指定编码规则

fam = sm.families.Binomial()
# 仅修改C(State)的参数,指定Dummy编码且不删除参考水平
mod = smf.gee(
    formula='indicator ~ Income + Unemployment + Debt + C(State, contrast=patsy.contrasts.Dummy(drop=False)) + C(History) -1 ',
    groups='Employee id',
    data=train_set,
    family = fam,
    cov_struct = sm.cov_struct.Exchangeable()
)
res = mod.fit()
# 打印参数验证所有State水平是否保留
print(res.params)

如果你需要History变量也保留所有水平,对C(History)也添加相同的contrast参数即可。

方法2:提前手动生成独热编码

如果你不想修改公式写法,可以先对State变量做独热编码且不删除首列,再直接放入模型公式:

import pandas as pd
# 生成State的全水平独热编码
state_dummies = pd.get_dummies(train_set['State'], prefix='State', drop_first=False)
train_set = pd.concat([train_set, state_dummies], axis=1)

fam = sm.families.Binomial()
# 公式中直接写入所有生成的State独热列名,不需要再用C()包裹
mod = smf.gee(
    formula='indicator ~ Income + Unemployment + Debt + ' + ' + '.join(state_dummies.columns) + ' + C(History) -1 ',
    groups='Employee id',
    data=train_set,
    family = fam,
    cov_struct = sm.cov_struct.Exchangeable()
)

注意事项

保留全部分类水平后,需要确保你已经通过-1去掉了模型截距,否则会出现完全共线性问题导致模型无法拟合。

内容的提问来源于stack exchange,提问作者Jojo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:27:03