我正在尝试使用R运行重复测量ANOVA。我已经在各种网站上浏览过各种各样的例子,但他们似乎从来没有谈过我遇到的错误。我认为我误解了一些重要的事情。
我试图运行的ANOVA是使用人类参与者进行的实验的一些数据。它有一个DV和三个IV。所有IV的所有级别都在所有参与者上运行,使其成为三向重复测量/受试者内部ANOVA。
我在R中运行的代码如下:
aov.output = aov(DV~ IV1 * IV2 * IV3 + Error(PARTICIPANT_ID / (IV1 * IV2 * IV3)),
data=fulldata)
当我运行时,我收到以下警告:
Error() model is singular
任何想法我可能做错了什么?
答案 0 :(得分:13)
尝试使用lme4包中的lmer函数。这里的aov函数可能不合适。寻找Dougles Bates的参考资料,例如: http://lme4.r-forge.r-project.org/book/Ch4.pdf(其他章节也很棒,但这是重复的措施章节,这是介绍:http://lme4.r-forge.r-project.org/book/Ch1.pdf)。 R代码在同一个地方,对于纵向数据,这些天似乎通常认为只是适合OLS而不是像lme4包中的方差模型的组件,或者在nlme中,这对我来说似乎是错误的Lme4最近大受欢迎。您可能会注意到Brian Ripley在上面评论部分中引用的帖子只是建议切换到lme。
顺便说一下,跳跃的一个巨大优势是你可以通过典型语法调整每个效果的等级作为对平均值的调整:
lmer(DV ~ 1 +IV1*IV2*IV3 +(IV1*IV2*IV3|Subject), dataset))
请注意,您的随机效果将为矢量值。
答案 1 :(得分:9)
我知道这篇文章已经选择了答案。我仍然希望指出在将aov
或lmer
模型拟合到多向重复测量数据时如何指定正确的误差项/随机效应。我假设两个自变量(IVs)是固定的,并且彼此交叉并与受试者交叉,这意味着所有受试者都暴露于IV的所有组合。我将使用来自Kirk的实验设计:行为科学程序(2013)的数据。
library(lme4)
library(foreign)
library(lmerTest)
library(dplyr)
file_name <- "http://www.ats.ucla.edu/stat/stata/examples/kirk/rbf33.dta" #1
d <- read.dta(file_name) %>% #2
mutate(a_f = factor(a), b_f = factor(b), s_f = factor(s)) #3
head(d)
## a b s y a_f b_f s_f
## 1 1 1 1 37 1 1 1
## 2 1 2 1 43 1 2 1
## 3 1 3 1 48 1 3 1
## 4 2 1 1 39 2 1 1
## 5 2 2 1 35 2 2 1
在这项研究中,5名受试者接受2次治疗 - 搏动类型(a)和训练持续时间(b) - 每次3个等级。结果变量是对少数群体的态度。在#3中,我将a,b和s变为因子变量a_f,b_f和s_f。设 p 和 q 为a_f和b_f(每个3)的级别数, n 为样本大小(5)。< / p>
在此示例中,a_f,b_f及其交互测试的自由度( dfs )应为 p -1 = 2, q -1 = 2,( p -1)*( q -1)= 4。 s_f错误项的 df 是( n -1)= 4,而within(s_f:a_f:b_f)错误项的df是( ñ -1)( PQ -1)= 32。所以正确的模型应该给你这些 dfs 。
aov
现在让我们使用aov
尝试不同的模型规范:
aov(y ~ a_f*b_f + Error(s_f), data=d) %>% summary() # m1
aov(y ~ a_f*b_f + Error(s_f/a_f:b_f), data=d) %>% summary() # m2
aov(y ~ a_f*b_f + Error(s_f/a_f*b_f), data=d) %>% summary() # m3
只需在m1中将错误指定为Error(s_f)
,即可获得与本书中的值匹配的正确 dfs 和F比率。 m2也给出与m1相同的值,但臭名昭着的“警告:错误()模型是单数”。 m3正在做一些奇怪的事情。它进一步将m1(634.9)中的残差划分为三个误差项的残差:s_f:a_f(174.2),s_f:b_f(173.6)和s_f:a_f:b_f(287.1)。这是错误的,因为当我们运行双向的主体间方差分析时,我们不会得到三个错误项!多个误差项也与使用块因子设计相反,这使我们可以使用相同的误差项来测试A,B和AB,这与需要2个误差项的分裂图设计不同。
lmer
我们如何使用lmer获得相同的dfs和F值?如果您的数据是平衡的,lmerTest
中使用的Kenward-Roger近似值将为您提供精确的 dfs 和F比率。
lmer(y ~ a_f*b_f + (1|s_f), data=d) %>% anova() # mem1
lmer(y ~ a_f*b_f + (1|s_f/a_f:b_f), data=d) %>% anova() # mem2
lmer(y ~ a_f*b_f + (1|s_f/a_f*b_f), data=d) %>% anova() # mem3
lmer(y ~ a_f*b_f + (1|s_f:a_f:b_f), data=d) %>% anova() # mem4
lmer(y ~ a_f*b_f + (a_f*b_f|s_f), data=d) %>% anova() # mem5
再次简单地将随机效果指定为(1|s_f)
可以得到正确的 dfs 和F比率(mem1)。 mem2-5甚至没有给出结果,大概是它需要估计的随机效应数量大于样本量。