绘图以检查 R 中重复测量方差分析的同方差假设

机器算法验证 r 方差分析 数据可视化 重复测量 假设
2022-04-07 13:16:31

我已经使用该aov()函数运行了一个完全受试者内重复测量方差分析。我的因变量不是正态分布的,所以我对对我的分析进行假设测试非常感兴趣。似乎仅调用plot()输出对重复测量不起作用,因此我手动获取了感兴趣模型的残差和拟合值,并将它们相互绘制。我假设这就是我将如何测试同方差假设的方式。

该图带有 2 个垂直带(请参见下图)。事实证明,拟合值都以 2 个值为中心(尽管根据==它们并不完全相等),其中一个是另一个的负数。

我有两个问题:

1)这是手动测试假设同方差的正确方法吗?如果没有,我将如何从重复测量设计中解决它(因为只是调用plot()不起作用)?

2)如果它是正确的,这个情节告诉我什么?为什么拟合值如此聚集?我能从中得出什么结论?

非常感谢这里的任何输入。此外,如果您知道更好的方法来检查(最好是绘图)rm-ANOVA 中的假设,那也将是有用的信息。

我在这里包含了一些模拟数据来复制场景:

#Create mock data (there's probably a more efficient way to do this.. would also be nice to know! :) )
p <- sort(rep(1:20,8))
y <- rep(rep(1:2,4),20)
z <- rep(rep(c(1,1,2,2),2),20)
w <- rep(c(1,1,1,1,2,2,2,2),20)
x <- rnorm(160,10,2)

d <- data.frame(x,p=factor(p),y=factor(y),z=factor(z),w=factor(w))

#Run repeated-measures ANOVA
ex.aov <- aov(x ~ y*z*w + Error(p/(y*z*w)), d)

#Try to plot full object (doesn't work)
plot(ex.aov)

#Try to plot section of object (doesn't work)
plot(ex.aov[["p:y:z"]])

#Plot residuals against fitted (custom "skedasticity" plot - works)
plot(residuals(ex.aov[["p:y:z"]])~fitted(ex.aov[["p:y:z"]]))

在此处输入图像描述

开始编辑

根据@Stefan 提供的信息,我在下面添加了一些额外的细节,使用他提出的改进的数据结构:

# Set seed to make it reproducible
set.seed(12)

#New variable names and generation
subj <- sort(factor(rep(1:20,8)))
x1 <- rep(c('A','B'),80)
x2 <- rep(c('A','B'),20,each=2)
x3 <- rep(c('A','B'),10, each=4)
outcome <- rnorm(80,10,2)

d3 <- data.frame(outcome,subj,x1,x2,x3)

#Repeated measures ANOVA
ex.aov <- aov(outcome ~ x1*x2*x3 + Error(subj/(x1*x2*x3)), d3)

#proj function
ex.aov.proj <- proj(ex.aov)

# Check for normality by using last error stratum
qqnorm(ex.aov.proj[[9]][, "Residuals"])
# Check for heteroscedasticity by using last error stratum
plot(ex.aov.proj[[9]][, "Residuals"])

结果图如下:

重复测量正常性检查?

重复测量同方差性检查?

谁能解释上面的图片(尤其是最后一张)?看起来有聚类和模式结构。它可以用来推断异方差的存在吗?

2个回答

我假设使用 inError()函数拟合的模型aov()在使用 in 时将不起作用,plot()因为您将获得多个可以选择的错误层。现在根据这里的信息应该使用该proj()函数将为您提供每个错误层的残差,然后可以将其用于诊断图。

编辑 1 开始

有关多层模型和函数的更多信息,请proj()参见 Venables 和 Ripley,第 284 页(但从第 281 页开始):多层分析中的残差:预测在他们写的第二句话中(我用粗体突出显示):

因此fitted(oats.aov[[4]])resid(oats.aov[[4]])是长度为 54 的向量,表示来自最后一层的拟合值和残差,基于原始数据向量的 54 个正交线性函数。不可能将它们唯一地与原始实验的图相关联。该函数proj采用拟合模型对象并找到原始数据向量在方差分析表中每条线定义的子空间的投影(包括,对于多层对象,仅具有总均值的抑制表)。结果是一个矩阵列表,每个层一个,其中每个列的名称是方差分析表中的组件名称。

对于您的示例,这意味着:

ex.aov.proj <- proj(ex.aov)

# Check number of strata 
summary(ex.aov.proj)

# Check for normality by using last error stratum
qqnorm(ex.aov.proj[[9]][, "Residuals"])
# Check for heteroscedasticity by using last error stratum
plot(ex.aov.proj[[9]][, "Residuals"])

但是,这也会导致我无法完全解释的情节(尤其是第二个情节)。

在他们的情况下,最后一个阶层是Within阶层。由于您的模型无法估计这一点(可能是由于您的错误项),我不确定仅使用您的最后一层是否有效。

希望其他人可以澄清。

编辑 1 结束

编辑 2 开始

根据这个来源检查残差以评估正态性和异方差性应该在没有Error()函数的情况下执行。

为了检查假设,您不需要使用错误术语。您可以添加项而不会出错,但 F 检验是错误的。但是,假设检查是可以的。

这对我来说似乎很合理,但我希望其他人能澄清一下。

编辑2结束

我的替代建议:

首先,我稍微更改了您的数据集并设置了一个种子以使其可重现(对于您将来遇到的一些问题可能会很方便):

# Set seed to make it reproducible
set.seed(12)

# I changed the names of your variables to make them easier to remember
# I also deleted a few nested `rep()` commands. Have a look at the `each=` argument.
subj <- sort(factor(rep(1:20,8)))
x1 <- rep(c('A','B'),80)
x2 <- rep(c('A','B'),20,each=2)
x3 <- rep(c('A','B'),10, each=4)
outcome <- rnorm(80,10,2)

d3 <- data.frame(outcome,subj,x1,x2,x3)

其次,我使用了线性混合效应模型,因为您有重复测量,因此您可以使用随机项:

require(lme4)
# I specified `subj` as random term to account for the repeated measurements on subject.
m.lmer<-lmer(outcome ~ x1*x2*x3 + (1|subj), data = d3)
summary(m.lmer)

# Check for heteroscedasticity
plot(m.lmer)

在此处输入图像描述

# or
boxplot(residuals(m.lmer) ~ d3$x1 + d3$x2 + d3$x3)

在此处输入图像描述

# Check for normality
qqnorm(residuals(m.lmer))

在此处输入图像描述

使用该afex包,您还可以获得 ANOVA 表格式的固定效果(您也可以使用包中的Anova()函数car作为另一种选择):

require(afex)
mixed(outcome ~ x1*x2*x3 + (1|subj), data = d3, method="LRT")

Fitting 8 (g)lmer() models:
[........]
    Effect df    Chisq p.value
1       x1  1     0.04     .84
2       x2  1     2.53     .11
3       x3  1  7.68 **    .006
4    x1:x2  1  8.34 **    .004
5    x1:x3  1 10.51 **    .001
6    x2:x3  1     0.31     .58
7 x1:x2:x3  1     0.12     .73

检查?mixed您可以选择的各种选项。同样关于混合模型,这里有很多关于交叉验证的信息。

完全免责声明:我喜欢将 R 用于许多不同的分析,但我不喜欢在 R 中进行 ANOVA。

问题 1:在 ANOVA 的分析背景下,我更熟悉通过方差同质性测试来评估这个假设,而不是绘制同质/异方差性并对其进行视觉评估。尽管有多种方差齐性检验,但我看到最多的是 Levene 检验。在 R 中,您似乎可以使用该函数通过car包来执行此操作。leveneTest

根据您的数据,它看起来像这样:leveneTest(x ~ y*z*w, d). 请注意,我认为您无法在此函数中指定重复测量错误结构,老实说,我不确定这是否/在多大程度上对 Levene 的测试很重要。与其他统计分析软件相比,Levene 在重复测量方差分析中的检验方式似乎存在一些差异。例如,SPSS 为您的重复测量的每个级别提供单独的组间 Levene 测试,而该leveneTest功能提供对所有变量的所有级别的全面测试——其他软件可能也有替代方法。无论如何,SPSS 方法似乎也通过仅评估组间方差的同质性来忽略数据的依赖性。

问题 2:如果您要使用方差同质性检验(Levene 或其他方法),按变​​量的每个级别创建简单的条形图可能会提供更多信息(因为这就是您的方差检验的同质性正在明确评估)。您可以通过估计变量级别的每个组合的结果方差来轻松做到这一点,然后将它们绘制在基础 R 中,或使用ggplot2包。