时间:2019-08-20 18:57:10

标签: python r statsmodels anova

我正在使用python进行双向方差分析,该方差分析包含两个变量(var_Avar_B)及其相互作用(var_A:var_B)。变量A是具有三个级别的变量,变量B是具有三个级别的有序分类变量。我正在寻找变量B的正交多项式对比的F统计量。

我通常会在R中进行这种类型的分析,但是我正在与其他喜欢Python的人一起工作。

在R中,用正确的对比度设置aov模型后,我将执行以下操作来拆分var_B的平方和,以获得具有单独F统计量的ANOVA表报告每种对比。 here中提供了有关使用R summary.aov函数的更多详细信息和示例。

# Create data
df <- data.frame(target = c(449, 413, 326, 409, 358, 291, 341, 278, 312),
                 var_A = rep(c(1, 2, 3), each = 3),
                 var_B = rep(c(1, 2, 3), 3))

# Make var_B an ordered factor
df$var_B <- factor(df$var_B, ordered = TRUE)

# Set contrasts
options(contrasts=c('contr.sum','contr.poly'))

# Create model
aov_model <- aov(target ~ var_A * var_B, data = df)

# Run summary with the F-test shown for the orthogonal polynomial contrasts
summary(aov_model, 
        split = list(var_B = list(linear = 1, quadratic = 2)))

有人知道在Python中是否可以做同样的事情?

到目前为止,我可以使用var_B包中的Poly()函数为patsy添加正确的对比度。我在线性模型的摘要中看到了对比,并且能够生成具有var_B整体效果的ANOVA表。

但是,我不确定如何在ANOVA表中“拆分” var_B的平方和以查看每个对比的F统计量。

import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

from patsy.contrasts import Poly

# Create data frame
df = pd.DataFrame({'target': [449, 413, 326, 409, 358, 291, 341, 278, 312],
                  'var_A': [1, 1, 1, 2, 2, 2, 3, 3, 3],
                  'var_B': [1, 2, 3, 1, 2, 3, 1, 2, 3]})

# Fit the linear model
overall_model = smf.ols(formula= "target ~ var_A * C(var_B, Poly())",
                        data=df).fit()

# Conduct an ANOVA on the model
overall_anova = sm.stats.anova_lm(overall_model, type=3, robust="hc3")

是否可以传递给sm.stats.anova_lm()函数的参数来求平方和?还是有另一种方法可以将效果分解为正交对比?

任何帮助将不胜感激!

0 个答案:

没有答案