1

如何在统计测试中解释成对观察,而不是t-test?下面我将讨论两个示例,在这些示例中,我尝试使用混合效果的方法来做到这一点并失败了。

示例1:如何t.test(..., paired=T)重现lm()

# simulate data
set.seed(66)
x1 <- rnorm(n=100, mean=30, sd=6)
x2 <- rnorm(n=100, mean=60, sd=6)

# arrange the data in a dataset
dd <- data.frame(ID=rep(paste("ID", seq(1,100, by=1), sep="_"),2),
                        response=c(x1,x2),
                        group=c(rep("A", 100), rep("B", 100))
                        )
t.test(x1,x2, paired=F)
summary(lm(response~group, data=dd)) # same outcome

如果观察结果是配对的,则可以解释它,t.test()但如何lm()(如果可能)这样做?我尝试使用混合效应模型方法,但是:

summary(lmerTest::lmer(response~group + (1+group|ID), data=dd))

给出一个错误:

Error: number of observations (=200) <= number of random effects (=200) for term (1 + group | ID);
the random-effects parameters and the residual variance (or scale parameter) are probably unidentifiable

尽管:

summary(lmerTest::lmer(response~group + (1|ID), data=dd))

运行但固定效应参数估计和相关的标准。误差和 t 值与 产生的相同lm()

示例 2:具有成对观测值的线性回归

假设我创建的数据集中的观察结果来自相隔 30 天测量的受试者——即,100 名受试者中的每一个都在第 0 天测量,然后在第 30 天再次测量——我们想估计随时间的变化率:

dd$time=c(rep(0,100), rep(30, 100)) # add "time" variable to dd

数据看起来像这样(黑色线性回归,红线链接的配对数据): 在此处输入图像描述

lm1 <- lm(response~time, data=dd)

lm1不考虑观察的配对性质。我想运行一个混合效应模型,允许每对数据的截距和斜率不同,但 R 再次抗议我试图估计太多参数:

lmerTest::lmer(response ~ time + (time | ID), data=dd)
# Error: number of observations (=200) <= number of random effects (=200) for term (time | ID);
# the random-effects parameters and the residual variance (or scale parameter) are probably unidentifiable

一个更简单的模型,它允许数据对的截距不同但斜率不同,即:

lmer(response ~ time + (1 | ID), data=dd)

抱怨:

boundary (singular) fit: see ?isSingular

但是运行并产生与lm().

[更新]

@Limey 提醒我,配对 t 检验只不过是评估两组之间的成对差异是否不为零的 t 检验。这种成对差异可用于在测试之外执行任何成对统计测试。为了验证这一点,我创建了三个不同的“响应”变量,它们是不同方式的组合x1x2排序(分别为:原始随机顺序;x1按递增和x2递减顺序;均按递增顺序)。

dd$response2 <- c(sort(x1, decreasing = FALSE), sort(x2, decreasing = T))
dd$response3 <- c(sort(x1, decreasing = FALSE), sort(x2, decreasing = F))

在此处输入图像描述

我计算了相应的差异:

dd$diff1 <- c((dd$response[1:100]-dd$response[1:100]), 
                (dd$response[101:200]-dd$response[1:100]))
dd$diff2 <- c((dd$response2[1:100]-dd$response2[1:100]), 
                (dd$response2[101:200]-dd$response2[1:100]))
dd$diff3 <- c((dd$response3[1:100]-dd$response3[1:100]), 
                (dd$response3[101:200]-dd$response3[1:100]))

在此处输入图像描述 并用它们来执行线性模型:

lm2.diff1 <- lm(diff1~time, data=dd)
lm2.diff2 <- lm(diff2 ~time, data=dd)
lm2.diff3 <- lm(diff3 ~time, data=dd)

我预计它们的斜率估计会有所不同,但它们都是一样的:

summary(lm2.diff1)$coeff[2] # 0.9993754
summary(lm2.diff2)$coeff[2] # 0.9993754
summary(lm2.diff3)$coeff[2] # 0.9993754

它们的斜率估计与从相应的“未配对”线性模型(lm(response~time)lm(response2~time)lm(response3~time))估计的相同。我错过了什么?

4

3 回答 3

3

配对 t 检验只是测试(两组之间的差异)的平均值是否为零。因此,要通过其他方式“模拟”配对 t 检验的结果,只需预先计算差异并将其传递给您选择的测试。使用您的示例:

x1 <- rnorm(n=100, mean=30, sd=6)
x2 <- rnorm(n=100, mean=60, sd=6)
diff <- x1-x2
dd <- data.frame(response=diff)
# Standard paired t-test
t.test(x1,x2, paired=T)


    Paired t-test

data:  x1 and x2
t = -36.167, df = 99, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -31.93760 -28.61546
sample estimates:
mean of the differences 
              -30.27653 

现在是“模拟”t检验......

t.test(diff)

    One Sample t-test

data:  diff
t = -36.167, df = 99, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -31.93760 -28.61546
sample estimates:
mean of x 
-30.27653 

现在作为线性模型

summary(lm(response~1, data=dd)) 


Call:
lm(formula = response ~ 1, data = dd)

Residuals:
    Min      1Q  Median      3Q     Max 
-18.473  -7.328   0.614   6.101  20.764 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -30.2765     0.8371  -36.17   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.371 on 99 degrees of freedom
于 2021-04-11T18:07:54.747 回答
1

好问题!这里有几个棘手的地方。

  1. 我们可以从通过t.test()手动计算配对测试开始:
pairedtest1 <- t.test(x1,x2, paired=TRUE)
d <- x1-x2
n <- length(x1)
tstat <- mean(d)/(sd(d)/sqrt(n))                    ## -37.58846
pval <- 2*pt(abs(tstat), lower.tail=FALSE, df=n-1)  ## 2.065802e-60
all.equal(pairedtest1$p.value,pval) ## TRUE
all.equal(unname(pairedtest1$statistic),tstat) ## TRUE
  1. 正如您所发现的,当在线性混合模型中使用时,当每组每种治疗只有一个观察值时,具有随机截距和治疗组间变异的模型会过度拟合;这里给出了一个类似的例子。如果需要,您可以强制lmer安装它:
m0 <- lme4::lmer(response~group+(group|ID), data=dd, REML=TRUE,
                 control=lmerControl(check.nobs.vs.nRE="ignore", calc.deriv=FALSE))

(请注意,我们还可以通过比较对数似然或 REML 标准来查看两个模型是否给出等效拟合 - 当我们有像这样的过度拟合模型时,不同的模型可以通过模型参数的不同线性组合获得等效拟合......)

如果我们跑

library(lmerTest)
coef(summary(as(m1,"lmerModLmerTest"),ddf="Kenward-Roger"))["groupB",]

(默认的 Satterthwaite ddf 计算在这里失败)我们得到

    Estimate   Std. Error           df      t value     Pr(>|t|) 
2.998126e+01 7.976192e-01 9.900000e+01 3.758844e+01 2.065922e-60 

t 统计量和 p 值与上面的结果非常接近(我本来可以说summary()但想拉出系数表的这一特定行)。

  1. 现在让我们尝试简化模型
m1 <- lme4::lmer(response~group+(1|ID), data=dd, REML=TRUE)

正如您所指出的,拟合是奇异的(如果您检查,RE 方差将被列为 0)。这里的 t 统计量和 p 值有点偏离(此时,我不太确定以前的模型为什么有效!)。原因是,对于这个数据集,组内方差略大于间方差。一般来说,我们期望var(between) = sigma^2_between + sigma_2_within/n,并且这是渐进/在期望中工作的,但是在小型数据集中,排序可能是我们在此处观察到的方向,在这种情况下,我们需要方差才能完美拟合数据。

resids <- with(dd,response-ave(response,group, FUN=mean))
wv <- var(resids-ave(resids, dd$ID, FUN=mean))    ## 15.82
bv <- var(tapply(resids, list(dd$ID), FUN=mean))  ## 14.92

(如果我们拟合相同的模型,lme看起来没问题,并给我们一个小的 [但非零] 估计组间截距方差,但如果我们尝试intervals(m2)它抱怨近似 var-cov 矩阵不是正定的.. .)

  1. 正如 Gang Chen 在2011 年 r-sig-mixed-models 的帖子中指出的那样,我们可以通过允许组内的两个观察值之间存在相关来拟合我们想要的模型(上面显示的加法模型只允许非负相关) :
library(nlme)
m2 <- lme(response~group,random=list(ID=pdCompSymm(form=~group-1)),
          data=dd,method="REML")
all.equal(tstat^2, anova(m2)[["F-value"]][2]) ## TRUE
all.equal(pval, anova(m2)[["p-value"]][2])    ## TRUE

p 值anova()与我们上面的结果相匹配,F 统计量与我们的 t 统计量的平方相匹配。

  1. 我们也可以这样做glmmTMB:我们必须要小心一点,因为默认的cs()协方差结构glmmTMB允许每个项有不同的方差,同时corCompSymm强加一个齐次方差:
m3 <- glmmTMB::glmmTMB(response~group+cs(group-1|ID),
                       data=dd, REML=TRUE)
m4 <- update(m3,  map=list(theta=factor(c(1,1,2))))

map参数设置随机效应参数向量的前两个元素,对应于第一组和第二组变化的log-sd,相同)

系数表得到正确的 t 统计量(它称为 az 值),但没有“分母自由度”的概念,Z 检验而不是 t 检验也是如此......

coef(summary(m4))$cond["groupB",]
            Estimate Std. Error  z value Pr(>|z|)
groupB      29.98126  0.7976217 37.58832        0
于 2021-04-12T02:04:51.153 回答
0

它们的斜率估计与从相应的“未配对”线性模型(lm(response~time)lm(response2~time)lm(response3~time))估计的相同。我错过了什么?

三个模型中的整体斜率相同是有道理的,即所有成对斜率的平均值(这很容易确认)。我缺少的是,在 的情况下lm2.diff3,斜率估计周围的 StdErr 大约比lm2.diff1和小一个数量级lm2.diff2lm2.diff3与和Response3相比,每对观测值的行为更加一致,因此其斜率估计附近的 StdErr 更小。Response1Response2

于 2021-04-11T21:42:51.173 回答