我正在使用python进行双向方差分析,该方差分析包含两个变量(var_A
和var_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()
函数的参数来求平方和?还是有另一种方法可以将效果分解为正交对比?
任何帮助将不胜感激!