0

我无法让我的对比从 aov() 和 lm() 在 R 中匹配。我很确定这是因为我不完全理解发生了什么或如何指定适当的对比,但我想反正我会问。

默认情况下,R 对 lm() 和 aov() 都使用处理对比,这意味着它将因子的每个水平与基线水平进行对比。我可以在 lm() 的结果中看到这一点:

data(InsectSprays)

lmMod <- lm(count ~ spray, data=InsectSprays)
summary(lmMod)

将截距添加到每个系数中会得到与 tapply() 计算的相同的平均值。然而,尝试用 aov() 重现这些对比会得到不同的结果。

model1 <- aov(count ~ spray, data = InsectSprays)

summary(model1, split=list(spray=list("Cont1"=1, "Cont2"=2, 
        "Cont3" = 3,  "Cont4" = 4, "Cont5" = 5)))

在这里,最后一个 p 值与 lm 中的对比度相同(p = 0.181),但 aov() 对比表明喷雾 B 与喷雾 A 不同(p < 0.0001),而 lm 表示它们是没有不同(p = 0.604)。

我尝试使用归零效应自己重新编码对比:

c1 <- c(-1, 1, 0, 0, 0, 0)
c2 <- c(-1, 0, 1, 0, 0, 0)
c3 <- c(-1, 0, 0, 1, 0, 0)
c4 <- c(-1, 0, 0, 0, 1, 0)
c5 <- c(-1, 0, 0, 0, 0, 1)

contMat <- cbind(c1, c2, c3, c4, c5)
contrasts(InsectSprays$spray) <- contMat

model2 <- aov(count ~ spray, data = InsectSprays)

summary(model2, split=list(spray=list("Cont1"=1, "Cont2"=2, 
        "Cont3" = 3,  "Cont4" = 4, "Cont5" = 5)))

现在,第一个对比给出了与 lm 相同的 p 值(p = 0.604),但最后一个对比表明治疗 F 与 A 显着不同(p < 0.0001),而 lm 表示不是(p = 0.181)。

我觉得我错过了一些基本的东西,但我一直无法弄清楚。任何帮助,将不胜感激。

4

1 回答 1

1

aov正在做顺序平方和(类型 I);lm正在做调整后的平方和(类型 II)。

要进行比较,请使用lm手动计算的虚拟变量。

d2 <- data.frame(cbind(count=InsectSprays$count, model.matrix(~spray, data=InsectSprays)))
m2 <- lm(count~0+.,d2)
anova(m2)
summary(m2)

anova为您提供与您的结果相同的结果aov,而summary为您提供与您的结果相同的lm结果。

于 2013-07-03T04:20:50.120 回答