14

我正在尝试使用 R 运行重复测量方差分析。我已经浏览了各种网站上的各种示例,但他们似乎从未谈论过我遇到的错误。我想我误解了一些重要的事情。

我试图运行的方差分析是基于使用人类参与者的实验中的一些数据。它有一个DV和三个IV。所有 IV 的所有级别都在所有参与者上运行,使其成为三向重复测量/受试者内 ANOVA。

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

aov.output = aov(DV~ IV1 * IV2 * IV3 + Error(PARTICIPANT_ID / (IV1 * IV2 * IV3)),
                 data=fulldata)

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

Error() model is singular

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

4

2 回答 2

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

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

于 2011-04-18T04:04:33.813 回答
9

我知道已经为这篇文章选择了答案。我仍然想指出在将模型拟合到多路重复测量数据时如何指定正确的误差项/随机aov效应lmer。我假设两个自变量 (IV) 都是固定的,并且相互交叉并与受试者交叉,这意味着所有受试者都暴露于 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。设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

只需在 m1 中指定错误,即可得到与书中值匹配的Error(s_f)正确dfs和 F 比率。m2 也给出与 m1 相同的值,但也给出了臭名昭著的“警告:Error() 模型是奇异的”。m3 正在做一些奇怪的事情。它进一步将 m1 (634.9) 中的残差内划分为三个误差项的残差:s_f:a_f (174.2)、s_f:b_f (173.6) 和 s_f:a_f:b_f (287.1)。这是错误的,因为当我们运行 2 路主体间方差分析时,我们不会得到三个错误项!多个误差项也与使用块因子设计的观点相反,这允许我们对 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

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

于 2014-08-08T15:18:57.517 回答