R中的aov()错误术语:bw错误(id)和错误(id / timevar)规范的差异是什么?

时间:2016-05-28 10:34:24

标签: r anova

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)) 

为什么会这样?哪种变体是正确的?

2 个答案:

答案 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的随机效果,但随后timevartimevar嵌套在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的主要效果,因为它是嵌套的基础,而idtime1之间的互动,因为time1嵌套在{ {1}}(对id Error也会产生Within效果,这是模型的基本剩余项,即各个观察本身的随机效应)。

那么您的数据的正确方法是什么?

这取决于1)您的数据实际结构如何以及2)您打算运行的模型。注意:没有确定的测试可以运行数据来确定结构或正确的模型;这是一个思考练习而不是计算练习。

在您提供的示例模型中,您有一个结果var,然后看似是分组变量groupid,然后是两个时间变量time1time2。每个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是指单个参与者,time1time2上的9个测量值是每个参与者的受试者内测试(即每个参与者都被测量9 var上的时间,因此这是repeated measures design)。

为了使其具体,让我们说var是一个解决问题任务的分数,time1time2是参与者被允许研究问题的分钟数和他们分别得到完成问题的时间。由于time1time2交叉,每个参与者在每种情况下完成任务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

的其他指南