aov(depvar~timevar+Error(id))
和aov(depvar~timevar+Error(id/timevar))
公式规范之间有什么区别?这两种变体产生的结果略有不同。
这里曾经问过同样的问题:https://stats.stackexchange.com/questions/60108/how-to-write-the-error-term-in-repeated-measures-anova-in-r 但是,我想用一个更恰当的例子来重复它。
以下是我创建的示例:
var=rep(NA,180)
id=rep(1:20,each=180/20)
group=rep(rep(1:2,each=9),180/(9*2))
time1=rep(rep(1:3,each=3),180/(3*3))
time2=rep(c(8,15,20),180/3)
var[group==1&time1==1&time2==8]=runif(10,105,115)
var[group==2&time1==1&time2==8]=runif(10,105,115)
var[group==1&time1==1&time2==15]=runif(10,95,105)
var[group==2&time1==1&time2==15]=runif(10,95,105)
var[group==1&time1==1&time2==20]=runif(10,85,95)
var[group==2&time1==1&time2==20]=runif(10,85,95)
var[group==1&time1==2&time2==8]=runif(10,95,105)
var[group==2&time1==2&time2==8]=runif(10,95,105)
var[group==1&time1==2&time2==15]=runif(10,85,95)
var[group==2&time1==2&time2==15]=runif(10,75,85)
var[group==1&time1==2&time2==20]=runif(10,75,85)
var[group==2&time1==2&time2==20]=runif(10,65,75)
var[group==1&time1==3&time2==8]=runif(10,95,105)
var[group==2&time1==3&time2==8]=runif(10,95,105)
var[group==1&time1==3&time2==15]=runif(10,85,95)
var[group==2&time1==3&time2==15]=runif(10,75,85)
var[group==1&time1==3&time2==20]=runif(10,75,85)
var[group==2&time1==3&time2==20]=runif(10,65,75)
df=data.frame(id,var,group,time1,time2)
df$id=factor(df$id)
df$group=factor(df$group)
df$time1=factor(df$time1)
df$time2=factor(df$time2)
对此执行aov()会产生稍微不同的结果,具体取决于Error()术语规范:
只有一个时期:
> summary(aov(var~time1+Error(id),data=df))
Error: id
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 19 958.4 50.44
Error: Within
Df Sum Sq Mean Sq F value Pr(>F)
time1 2 7538 3769 30.41 6.72e-12 ***
Residuals 158 19584 124
> summary(aov(var~time1+Error(id/time1),data=df))
Error: id
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 19 958.4 50.44
Error: id:time1
Df Sum Sq Mean Sq F value Pr(>F)
time1 2 7538 3769 211.5 <2e-16 ***
Residuals 38 677 18
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Error: Within
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 120 18907 157.6
或者两个时间段(为了空间而不在这里输入输出,你可以自己检查):
summary(aov(var~group*time1*time2+Error(id/(group*time1*time2)),data=df))
summary(aov(var~group*time1*time2+Error(id),data=df))
为什么会这样?哪种变体是正确的?
答案 0 :(得分:6)
这是一篇博客文章,它将帮助分解“经典方差分析中的随机效应”部分中的每个含义。
在博客中,这是Error
术语中“划分”含义的摘要。
aov(Y ~ Error(A), data=d) # Lone random effect
aov(Y ~ B + Error(A/B), data=d) # A random, B fixed, B nested within A
aov(Y ~ (B*X) + Error(A/(B*X)), data=d) # B and X interact within levels of A
所以从你的问题来看,
aov(depvar~timevar+Error(id/timevar))
表示您具有来自id
的随机效果,但随后timevar
将timevar
嵌套在id
级别与
aov(depvar~timevar+Error(id))
只是将id
作为随机效应而不对其他变量进行约束。
来源:http://conjugateprior.org/2013/01/formulae-in-r-anova/
This也可能有用,这是一些代码分析方差,对学习ANOVA有一些建议。
答案 1 :(得分:1)
aov(depvar~timevar+Error(id))
和aov(depvar~timevar+Error(id/timevar))
之间的区别在于您是否将timevar
包含为随机效果。
请注意,将变量包含为随机效果的方法不止一种。您也可以使用aov(depvar~timevar+Error(id*timevar))
或aov(depvar~timevar+Error(id + timevar))
。这些中的每一个都意味着完全不同,但它可能会令人困惑,因为由于数据本身的限制,它们在应用于同一数据集时通常会给出类似的结果。
/
中使用的斜杠aov()
表示nesting。当您使用/
时,R会自动将其扩展为底部变量的主效果以及底部和顶部之间的交互。例如,A/B
会自动扩展为A + A:B
。这类似于A*B
自动扩展到A + B + A:B
的方式,但是通过嵌套,嵌套中的变量永远不会出现在它的嵌套之外(即B
对它的主要影响不大拥有)。
您可以在输出中看到此扩展:
> summary(aov(var~time1+Error(id / time1)))
Error: id
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 1 52.24 52.24
Error: id:time1
Df Sum Sq Mean Sq
time1 1 4291 4291
Error: Within
Df Sum Sq Mean Sq F value Pr(>F)
time1 1 1239 1238.7 10.19 0.00167 **
Residuals 176 21399 121.6
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Error
术语表示随机效应。请注意,您获得id
的主要效果,因为它是嵌套的基础,而id
和time1
之间的互动,因为time1
嵌套在{ {1}}(对id
Error
也会产生Within
效果,这是模型的基本剩余项,即各个观察本身的随机效应)。
这取决于1)您的数据实际结构如何以及2)您打算运行的模型。注意:没有确定的测试可以运行数据来确定结构或正确的模型;这是一个思考练习而不是计算练习。
在您提供的示例模型中,您有一个结果var
,然后看似是分组变量group
和id
,然后是两个时间变量time1
和time2
。每个id
只在一个组中,而不是在两个组中,这表明id嵌套在组中。
> table(group, id)
id
group 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0
2 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9
我假设id
是指单个参与者,time1
和time2
上的9个测量值是每个参与者的受试者内测试(即每个参与者都被测量9 var
上的时间,因此这是repeated measures design)。
为了使其具体,让我们说var
是一个解决问题任务的分数,time1
和time2
是参与者被允许研究问题的分钟数和他们分别得到完成问题的时间。由于time1
和time2
交叉,每个参与者在每种情况下完成任务9次。
> table(time1, time2)
time2
time1 8 15 20
1 20 20 20
2 20 20 20
3 20 20 20
> table(time1, time2, id)
, , id = 1
time2
time1 8 15 20
1 1 1 1
2 1 1 1
3 1 1 1
, , id = 2
time2
time1 8 15 20
1 1 1 1
2 1 1 1
3 1 1 1
(output truncated)
参与者分组进行测试,其中一半参与者在第1组,另一半在第2组。也许该研究是在课堂上进行的,第1组是一类,第2组是第二类。可能,群体身份实际上并不是感兴趣的变量,但我们不应该将其排除在模型之外,因为群体之间的差异可能会导致一些滋扰变化。例如,也许第一个教室有更好的照明,给予第1组的所有成员,并且比第2组的成员更有机会在谜题上得分。
分数,ID和组应该都是随机效果,time1和time2应该是固定效果(请注意,如果您在模型中有不同的想法,这可能会因同一数据而异;例如,您可能希望将组视为固定的取决于你的研究问题)。
鉴于该模型,使用aov()
:
aov(var~time1*time2 + Error(group/id/(time1*time2)),data=df)
这是输出:
> summary(aov(var~time1*time2 + Error(group/id/(time1*time2)),data=df))
Error: group
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 1 771.7 771.7
Error: group:id
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 18 243.8 13.55
Error: group:id:time1
Df Sum Sq Mean Sq F value Pr(>F)
time1 2 7141 3571 181.6 <2e-16 ***
Residuals 38 747 20
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Error: group:id:time2
Df Sum Sq Mean Sq F value Pr(>F)
time2 2 16353 8176 434.6 <2e-16 ***
Residuals 38 715 19
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Error: group:id:time1:time2
Df Sum Sq Mean Sq F value Pr(>F)
time1:time2 4 214.5 53.63 5.131 0.00103 **
Residuals 76 794.3 10.45
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Warning message:
In aov(var ~ time1 * time2 + Error(group/id/(time1 * time2)), data = df) :
Error() model is singular
(除上述链接外,还有一些关于random vs. fixed effects)
的其他指南