配对 t 检验作为线性混合效应建模的特例

机器算法验证 r 混合模式 t检验 重复测量 lme4-nlme
2022-01-23 23:41:34

我们知道配对t检验只是单向重复测量(或对象内)方差分析以及线性混合效应模型的特例,可以用 lme() 函数和 R 中的 nlme 包来证明如下所示。

#response data from 10 subjects under two conditions
x1<-rnorm(10)
x2<-1+rnorm(10)

# Now create a dataframe for lme
myDat <- data.frame(c(x1,x2), c(rep("x1", 10), rep("x2", 10)), rep(paste("S", seq(1,10), sep=""), 2))
names(myDat) <- c("y", "x", "subj")

当我运行以下配对 t 检验时:

t.test(x1, x2, paired = TRUE)

我得到了这个结果(由于随机生成器,你会得到不同的结果):

t = -2.3056, df = 9, p-value = 0.04657

使用 ANOVA 方法,我们可以得到相同的结果:

summary(aov(y ~ x + Error(subj/x), myDat))

# the F-value below is just the square of the t-value from paired t-test:
          Df  F value Pr(>F)
x          1  5.3158  0.04657

现在我可以使用以下模型在 lme 中获得相同的结果,假设两个条件的正定对称相关矩阵:

summary(fm1 <- lme(y ~ x, random=list(subj=pdSymm(form=~x-1)), data=myDat))

# the 2nd row in the following agrees with the paired t-test
# (Intercept) -0.2488202 0.3142115  9 -0.7918878  0.4488
# xx2          1.3325786 0.5779727  9  2.3056084  0.0466

或者另一个模型,假设两个条件的相关矩阵具有复合对称性:

summary(fm2 <- lme(y ~ x, random=list(subj=pdCompSymm(form=~x-1)), data=myDat))

# the 2nd row in the following agrees with the paired t-test
# (Intercept) -0.2488202 0.4023431  9 -0.618428  0.5516
# xx2          1.3325786 0.5779727  9  2.305608  0.0466

通过配对 t 检验和单向重复测量方差分析,我可以将传统的细胞均值模型写为

Yij = μ + αi + βj + εij, i = 1, 2; j = 1, ..., 10

其中 i 索引条件,j 索引主题,Y ij是响应变量,μ 是整体平均值的固定效应的常数,α i是条件的固定效应,β j是 N(0, σ 之后的主题的随机效应p 2 )(σ p 2是总体方差),ε ij是 N(0, σ 2 ) 之后的残差(σ 2是主体内方差)。

我认为上面的单元平均模型不适合 lme 模型,但问题是我无法为具有相关结构假设的两种 lme() 方法提出合理的模型。原因是 lme 模型似乎比上面提供的单元平均模型具有更多的随机分量参数。至少 lme 模型也提供了完全相同的 F 值、自由度和 p 值,而 gls 不能。更具体地说,gls 给出了不正确的 DF,因为它没有考虑每个受试者有两个观察结果的事实,从而导致 DF 大大膨胀。lme 模型很可能在指定随机效应时过度参数化,但我不知道模型是什么以及参数是什么。所以这个问题对我来说仍然没有解决。

2个回答

模型的等价性可以通过计算来自同一个体的两个观察值之间的相关性来观察,如下所示:

如您的符号所示,让Yij=μ+αi+βj+ϵij, 在哪里 βjN(0,σp2)ϵijN(0,σ2). 然后 Cov(yik,yjk)=Cov(μ+αi+βk+ϵik,μ+αj+βk+ϵjk)=Cov(βk,βk)=σp2,因为所有其他项都是独立的或固定的,并且Var(yik)=Var(yjk)=σp2+σ2,所以相关性是 σp2/(σp2+σ2).

请注意,这些模型并不完全等效,因为随机效应模型强制相关性为正。CS 模型和 t-test/anova 模型没有。

编辑:还有另外两个区别。首先,CS 和随机效应模型假设随机效应的正态性,但 t-test/anova 模型不假设。其次,CS和随机效应模型使用最大似然拟合,而anova使用均方拟合;当一切都平衡时,他们会同意,但不一定在更复杂的情况下。最后,我会警惕使用来自各种拟合的 F/df/p 值作为模型同意程度的度量;有关详细信息,请参阅 Doug Bates 在 df 上的著名熨平板。(结束编辑)

您的代码的问题R在于您没有正确指定相关结构。您需要使用gls相关corCompSymm结构。

生成数据,以便有主题效果:

set.seed(5)
x <- rnorm(10)
x1<-x+rnorm(10)
x2<-x+1 + rnorm(10)
myDat <- data.frame(c(x1,x2), c(rep("x1", 10), rep("x2", 10)), 
                    rep(paste("S", seq(1,10), sep=""), 2))
names(myDat) <- c("y", "x", "subj")

那么这里是你如何拟合随机效应和复合对称模型。

library(nlme)
fm1 <- lme(y ~ x, random=~1|subj, data=myDat)
fm2 <- gls(y ~ x, correlation=corCompSymm(form=~1|subj), data=myDat)

随机效应模型的标准误为:

m1.varp <- 0.5453527^2
m1.vare <- 1.084408^2

CS模型的相关性和残差方差为:

m2.rho <- 0.2018595
m2.var <- 1.213816^2

它们等于预期的值:

> m1.varp/(m1.varp+m1.vare)
[1] 0.2018594
> sqrt(m1.varp + m1.vare)
[1] 1.213816

其他相关结构通常不适合随机效应,而只是通过指定所需的结构;一个常见的例外是 AR(1) + 随机效应模型,该模型在同一随机效应的观察之间具有随机效应和 AR(1) 相关性。

EDIT2:当我适合三个选项时,我得到完全相同的结果,只是 gls 不会尝试猜测感兴趣术语的 df 。

> summary(fm1)
...
Fixed effects: y ~ x 
                 Value Std.Error DF   t-value p-value
(Intercept) -0.5611156 0.3838423  9 -1.461839  0.1778
xx2          2.0772757 0.4849618  9  4.283380  0.0020

> summary(fm2)
...
                 Value Std.Error   t-value p-value
(Intercept) -0.5611156 0.3838423 -1.461839  0.1610
xx2          2.0772757 0.4849618  4.283380  0.0004

> m1 <- lm(y~ x + subj, data=myDat)
> summary(m1)
...
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  -0.3154     0.8042  -0.392  0.70403   
xx2           2.0773     0.4850   4.283  0.00204 **

(这里的截距不同,因为使用默认编码,它不是所有主题的平均值,而是第一个主题的平均值。)

值得注意的是,较新的lme4包给出了相同的结果,但甚至没有尝试计算 p 值。

> mm1 <- lmer(y ~ x + (1|subj), data=myDat)
> summary(mm1)
...
            Estimate Std. Error t value
(Intercept)  -0.5611     0.3838  -1.462
xx2           2.0773     0.4850   4.283

您还可以考虑使用mixedafex中的函数以使用 Kenward-Roger df 近似值返回 p 值,该近似值返回相同的 p 值作为配对 t 检验:

library(afex)
mixed(y ~ x + (1|subj), type=3,method="KR",data=myDat) 

或者

library(lmerTest)
options(contrasts=c('contr.sum', 'contr.poly'))
anova(lmer(y ~ x + (1|subj),data=myDat),ddf="Kenward-Roger")