【问题标题】:Python - Anova test in multiple loopsPython - 多个循环中的 Anova 测试
【发布时间】:2020-10-20 09:57:03
【问题描述】:

在我的数据框中,分类变量和连续变量很少。我想对分类变量和连续变量的每种组合执行 Anova 分析 (anova_lm)。到目前为止,我只能为 1 个目标分类创建循环,并将所有连续变量作为预测变量,如下所示:

我的原始数据集 pima 包含这些列:

性别 - 分类 年龄 - 连续 教育 - 分类 收入 - 分类 RATE_INTEREST - 连续 SPD - 分类 TPD - 分类 AMT_ANNUITY - 连续 DOWNPAYMPERC - 连续

从数据集中我定义了 pima_cont,它只包含连续变量。 从数据集中我还定义了 pima_categ,它只包含分类变量。

keys = []
tables = []
for variable in pima_cont.columns:
    model = ols('{} ~ EDUCATION'.format(variable), data=pima).fit()
    anova_table = sm.stats.anova_lm(model, typ=2)

    keys.append(variable)
    tables.append(anova_table)

df_anova = pd.concat(tables, keys=keys, axis=0)
print(df_anova)

这里我必须手动编辑我的目标在这部分语句model = ols('{} ~ EDUCATION'.format(variable), data=pima).fit()

任何提示如何实现自动化,以便 Python 向我显示相同的输出,但将我的所有分类变量作为目标?

非常感谢! 亚当

【问题讨论】:

    标签: python pandas loops statsmodels anova


    【解决方案1】:

    您需要一个多索引,只需使用下面的 2 x 2 示例:

    import pandas as pd
    import statsmodels.api as sm
    import numpy as np
    from statsmodels.formula.api import ols
    
    pima = pd.DataFrame({'EDUCATION':np.random.choice(['A','B','C'],100),
                         'GENDER':np.random.choice(['M','F'],100),
                        'AGE':np.random.randn(100),
                        'RATE_INTEREST':np.random.randn(100)})
    

    为可能的组合创建多索引:

    index = pd.MultiIndex.from_product([['AGE','RATE_INTEREST'],['EDUCATION','GENDER']],
                                       names=['cont', 'cat'])
    index
    
    MultiIndex([(          'AGE', 'EDUCATION'),
                (          'AGE',    'GENDER'),
                ('RATE_INTEREST', 'EDUCATION'),
                ('RATE_INTEREST',    'GENDER')],
               names=['cont', 'cat'])
    

    然后类似于您上面的内容:

    tables = []
    for cont_var,cat_var in index:
        model = ols('{} ~ {}'.format(cont_var,cat_var), data=pima).fit()
        anova_table = sm.stats.anova_lm(model, typ=2)
    
        tables.append(anova_table)
    
    df_anova = pd.concat(tables, keys=index, axis=0)
    

    最终表格如下所示:

                                          sum_sq    df         F    PR(>F)
    AGE           EDUCATION EDUCATION   0.358636   2.0  0.196421  0.821993
                            Residual   88.554164  97.0       NaN       NaN
                  GENDER    GENDER      0.258418   1.0  0.285659  0.594226
                            Residual   88.654382  98.0       NaN       NaN
    RATE_INTEREST EDUCATION EDUCATION   0.021586   2.0  0.012325  0.987752
                            Residual   84.942705  97.0       NaN       NaN
                  GENDER    GENDER      0.656981   1.0  0.763684  0.384315
                            Residual   84.307310  98.0       NaN       NaN
    

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2018-02-08
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多