在statsmodels的logit模型中能否合并分类变量的水平?
在statsmodels的logit模型中能否合并分类变量的水平?
当然可以!你有两种靠谱的方法可选,不用非得手动加一堆哑变量——既可以在statsmodels的公式里直接处理,也可以先修改你的DataFrame,看哪种更适合你的需求:
方法一:在公式内直接合并水平(无需修改原数据)
你可以利用numpy的np.where()函数在公式里直接对income变量进行重新编码,把代表0-49,999的1和50,000-99,999的2合并成一组,100,000-199,999的3单独成一组。比如你的logit模型公式可以写成:import statsmodels.formula.api as smf import numpy as np model = smf.logit("hair_color ~ np.where(income <= 2, 1, 2) + gender", data=df).fit()如果想让分组更具可读性,也可以用分类标签代替数字,再用
C()函数明确指定分类变量的水平,这样模型输出的结果会更清晰,一眼就能看懂分组含义:model = smf.logit( "hair_color ~ C(np.where(income <= 2, 'low_mid_income', 'high_income'), levels=['low_mid_income', 'high_income']) + gender", data=df ).fit()这种方法的好处是不用改动原始数据集,适合快速测试不同的分组方式。
方法二:先修改DataFrame,添加新的分组列
如果你需要反复使用这个合并后的分组,或者想让代码逻辑更直观,可以先在DataFrame里新增一列专门存储合并后的分组:import numpy as np # 用数字标记分组 df['income_grouped'] = np.where(df['income'] <= 2, 1, 2) # 或者用可读性更强的标签 # df['income_grouped'] = np.where(df['income'] <= 2, '0-99,999', '100,000-199,999')之后直接在公式里使用这个新列就行:
model = smf.logit("hair_color ~ income_grouped + gender", data=df).fit()这种方式更适合需要长期复用分组,或者需要对分组进行后续调整、检查的场景。
两种方法都能让你得到想要的回归结果,至于选哪种,完全看你的工作流程和代码可读性需求~
备注:内容来源于stack exchange,提问作者hulio_entredas




