如何使用对比代码在 R 中进行 Type-III SS ANOVA?

机器算法验证 r 方差分析 对比 平方和
2022-02-09 08:33:24

请提供 R 代码,该代码允许进行具有 -3、-1、1、3 对比的受试者间方差分析。我知道对于此类分析的适当平方和 (SS) 类型存在争议。但是,作为 SAS 和 SPSS(III 型)中使用的默认 SS 类型被认为是我所在地区的标准。因此,我希望此分析的结果与这些统计程序生成的结果完美匹配。要被接受的答案必须直接调用 aov(),但其他答案可能会被投票(特别是如果它们易于理解/使用)。

sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))

编辑:请注意,我要求的对比不是简单的线性或多项式对比,而是由理论预测得出的对比,即 Rosenthal 和 Rosnow 讨论的对比类型。

4个回答

ANOVA 的 III 型平方和可通过car包中的Anova()函数轻松获得。

对比度编码可以通过多种方式完成,使用C()contr.*系列(如@nico 所示)或直接使用contrasts()函数/参数。这在Modern Applied Statistics with S(Springer,2002,第 4 版)的第 6.2 节(第 144-151 页)中有详细说明。请注意,这aov()只是该函数的包装lm()函数。当人们想要控制模型的误差项时(例如在主题内设计中),这很有趣,但除此之外它们都会产生相同的结果(并且无论您以何种方式拟合模型,您仍然可以输出 ANOVA 或 LM-像带有summary.aov的摘要summary.lm)。

我没有 SPSS 来比较两个输出,但是类似

> library(car)
> sample.data <- data.frame(IV=factor(rep(1:4,each=20)),
                            DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))
> Anova(lm1 <- lm(DV ~ IV, data=sample.data, 
                  contrasts=list(IV=contr.poly)), type="III")
Anova Table (Type III tests)

Response: DV
            Sum Sq Df F value    Pr(>F)    
(Intercept)  18.08  1  21.815  1.27e-05 ***
IV          567.05  3 228.046 < 2.2e-16 ***
Residuals    62.99 76                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

值得一试。

关于 R 与 SAS 中的因子编码:R 将基线或参考级别视为字典顺序中的第一个级别,而 SAS 考虑最后一个级别。因此,要获得可比较的结果,您必须使用contr.SAS()或使用relevel()R 因子。

这可能看起来有点自我推销(我想是的)。但是我为 R 开发了一个lsmeans包(可在 CRAN 上获得),旨在处理这种情况。以下是它对您的示例的工作方式:

> sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))
> sample.aov <- aov(DV ~ factor(IV), data = sample.data)

> library("lsmeans")
> (sample.lsm <- lsmeans(sample.aov, "IV"))
 IV    lsmean        SE df   lower.CL  upper.CL
  1 -3.009669 0.2237448 76 -3.4552957 -2.564043
  2 -3.046072 0.2237448 76 -3.4916980 -2.600445
  3  1.147080 0.2237448 76  0.7014539  1.592707
  4  3.049153 0.2237448 76  2.6035264  3.494779

> contrast(sample.lsm, list(mycon = c(-3,-1,1,3)))
 contrast estimate       SE df t.ratio p.value
 mycon    22.36962 1.000617 76  22.356  <.0001

如果您愿意,可以在列表中指定其他对比。对于此示例,您将使用内置的线性多项式对比得到相同的结果:

> con <- contrast(sample.lsm, "poly")
> con
 contrast   estimate        SE df t.ratio p.value
 linear    22.369618 1.0006172 76  22.356  <.0001
 quadratic  1.938475 0.4474896 76   4.332  <.0001
 cubic     -6.520633 1.0006172 76  -6.517  <.0001

要确认这一点,请注意"poly"规范将其定向到 call poly.lsmc,这会产生以下结果:

> poly.lsmc(1:4)
  linear quadratic cubic
1     -3         1    -1
2     -1        -1     3
3      1        -1    -3
4      3         1     1

如果您希望对多个对比进行联合测试,请使用testwith 函数joint = TRUE例如,

> test(con, joint = TRUE)

这将产生“III 型”测试。与 不同car::Anova()的是,无论模型拟合阶段使用的对比编码如何,它都会正确执行。这是因为被测试的线性函数是直接指定的,而不是通过模型简化隐式指定的。另一个特点是检测到被测试的对比度线性相关的情况,并产生正确的测试统计量和自由度。

你可能想看看这篇博文:

在 R 中获得与 SPSS 中相同的 ANOVA 结果 - II 型和 III 型平方和的困难

剧透:options(contrasts=c("contr.sum", "contr.poly"))在脚本开头添加)

当您进行对比时,您是在适当的误差项的上下文中对单元均值进行特定的、声明的线性组合。因此,“SS 类型”的概念在对比中没有意义。每个对比本质上是使用 I 型 SS 的第一个效果。“SS 的类型”与其他术语部分排除或解释的内容有关。对于对比,没有任何东西被部分排除或解释。对比本身就存在。