R中的重复测量/受试者内ANOVA

viz*_*ize 13 r anova

我正在尝试使用R运行重复测量方差分析.我已经在各种网站上浏览了各种各样的例子,但他们似乎从来没有谈过我遇到的错误.我认为我误解了一些重要的事情.

我试图运行的ANOVA是来自使用人类参与者的实验的一些数据.它有一个DV和三个IV.所有IV的所有水平都在所有参与者上运行,使其成为三向重复测量/受试者内部ANOVA.

我在R中运行的代码如下:

aov.output = aov(DV~ IV1 * IV2 * IV3 + Error(PARTICIPANT_ID / (IV1 * IV2 * IV3)),
                 data=fulldata)
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到以下警告:

Error() model is singular
Run Code Online (Sandbox Code Playgroud)

我有什么想法可能做错了吗?

Pat*_*ann 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))
Run Code Online (Sandbox Code Playgroud)

请注意,您的随机效果将是矢量值.


Mas*_*awa 8

我知道这篇文章已经选择了答案.我仍然希望指出在将一个aovlmer模型拟合到多向重复测量数据时如何指定正确的误差项/随机效应.我假设两个自变量(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
Run Code Online (Sandbox Code Playgroud)

在该研究中,5名受试者接受2次治疗 - 搏动类型(a)和训练持续时间(b) - 每次3个级别.结果变量是对少数群体的态度.在#3中,我将a,b和s变为因子变量a_f,b_f和s_f.设pq为a_f和b_f(每个3)的级别数,n为样本大小(5).

在这个例子中,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是(n -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
Run Code Online (Sandbox Code Playgroud)

只需Error(s_f)在m1中指定错误,即可获得与书中值相匹配的正确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值?如果您的数据是平衡的,那么使用的Kenward-Roger近似lmerTest将为您提供精确的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
Run Code Online (Sandbox Code Playgroud)

再简单地指定随机效果为(1|s_f)您提供正确的dfs和F比率(mem1).mem2-5甚至没有给出结果,可能是它需要估计的随机效应数量大于样本量.