多循环中的Python-Anova测试
在我的数据框架中,我几乎没有分类变量和连续变量。我想对分类变量和连续变量的每个组合进行方差分析(Anova_lm)。到目前为止,我只能为1个目标类别创建循环,所有连续变量都作为预测值,如下所示:多循环中的Python-Anova测试,python,pandas,loops,statsmodels,anova,Python,Pandas,Loops,Statsmodels,Anova,在我的数据框架中,我几乎没有分类变量和连续变量。我想对分类变量和连续变量的每个组合进行方差分析(Anova_lm)。到目前为止,我只能为1个目标类别创建循环,所有连续变量都作为预测值,如下所示: sum_sq df F PR(>F) AGE EDUCATION EDUCATION 0.358636 2.0 0.196421 0.821993
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
我的原始数据集pima包含以下列:
性别-分类
年龄连续性
教育-分类
收入-分类
利率/利息-连续
SPD-范畴
TPD-分类
年金金额-连续
下行MPERC-连续
从数据集中我定义了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向我显示相同的输出,但将所有分类变量作为目标
非常感谢!
Adam您需要一个多索引,只需使用下面的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
非常感谢你的帮助!它像一个符咒一样工作:-)。