如何在统计测试中解释成对观察,而不是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 检验。这种成对差异可用于在测试之外执行任何成对统计测试。为了验证这一点,我创建了三个不同的“响应”变量,它们是不同方式的组合x1
和x2
排序(分别为:原始随机顺序;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)
)估计的相同。我错过了什么?