You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

在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

火山引擎 最新活动