问题描述
在我的数据框中,我没有几个分类变量,也没有几个连续变量。我想对分类变量和连续变量的每种组合执行Anova分析(anova_lm)。到目前为止,我只能为1个目标分类创建循环,并将所有连续变量作为预测变量,如下所示:
我具有这些列的原始数据集pima:
GENDER-分类 年龄-连续 绝对教育 收入-分类 RATE_INTEREST-连续 SPD-分类 TPD-绝对的 AMT_ANNUITY-连续 DOWNPERMPERC-连续
根据数据集,我定义了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会向我显示相同的输出,但将我所有的分类变量作为目标?
非常感谢! 亚当
解决方法
您需要一个multiIndex,只需使用下面的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'],'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','GENDER')],'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