我知道已经为这篇文章选择了答案。我仍然想指出在将模型拟合到多路重复测量数据时如何指定正确的误差项/随机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。设p和q是 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 甚至没有给出结果,大概它需要估计的随机效应的数量大于样本量。