这是一个有趣的问题。需要注意的一件事是,如果组的大小不相等,则允许不等方差只会改变如果两组大小相等(即),则 Welch 的 -test (表示为)和 Student 的 -test (表示为)给出相同的检验统计量,因为
tn1=n2=nttwtts
tw=y¯1−y¯2s21n1+s22n2−−−−−−−√=y¯1−y¯2s21+s22n−−−−√=y¯1−y¯2(s21+s222)(2n)−−−−−−−−√=ts
我指出这一点是因为您在帖子中提供的睡眠研究示例涉及相同的组大小,这就是为什么运行您的示例在所有情况下都会t
无论如何,要回答您的问题,可以nlme::gls()
通过使用weights
与nlme::varIdent()
. 下面我生成了一些具有不等组大小和不等方差的数据,然后展示如何使用 t.test 和回归函数(lm 或 gls)来拟合假设或不假设等方差的模型:
# generate data with unequal group sizes and unequal variances
set.seed(497203)
dat <- data.frame(group=rep.int(c("A","B"), c(10,20)),
y = rnorm(30, mean=rep.int(c(0,1), c(10,20)), sd=rep.int(c(1,2),c(10,20))))
# the t-statistic assuming equal variances
t.test(y ~ group, data = dat, var.equal = TRUE)
summary(lm(y ~ group, data = dat))
# the t-statistic not assuming equal variances
t.test(y ~ group, data = dat, var.equal = FALSE)
library(nlme)
summary(gls(y ~ group, data = dat, weights=varIdent(form = ~ 1 | group)))
# a hack to achieve the same thing in lmer
# (lmerControl options are needed to prevent lmer from complaining
# about too many levels of the grouping variable)
dat <- transform(dat,
obs=factor(1:nrow(dat)),
dummy=as.numeric(group=="B"))
library('lme4')
summary(lmer(y ~ group + (dummy-1|obs), data=dat,
control=lmerControl(check.nobs.vs.nlev = "ignore",
check.nobs.vs.nRE = "ignore")))
您还询问了获得相同的自由度。自由度基于Satterthwaite 近似,并t.test
默认应用该近似,因为这是 Welch 描述的解决方案的一部分。但gls
不这样做。理论上这是可以做到的,我相信会这样做,所以你应该能够PROC MIXED
在. 也许(可能)有一些 R 包可以很容易地为一般回归模型(具有连续预测器)获得 Satterthwaite DF,但我不知道它是什么。SAS
PROC MIXED
@amoeba 更新: Satterthwaite 近似值作为包中的默认值实现lmerTest
,因此要获得p-value 与 Welch 的 t 检验完全匹配,可以运行:
library('lmerTest')
summary(lmer(y ~ group + (dummy-1|obs), data=dat,
control=lmerControl(check.nobs.vs.nlev = "ignore",
check.nobs.vs.nRE = "ignore")))