我想引导测试一个假设(两个样本学生 t 检验)。在 Efron 和 Tibshirani 1993 p.224 中有明确的代码:对于每个观察,减去其组平均值并添加整体平均值,其中整体平均值是组合样本的平均值。他们声称我们应该在零假设下引导分布,这就是我们应该这样做的原因。
但是,我还了解到,可以直接从样本引导而无需修改它们。我尝试了两种方法:Efron 的步骤(使用 function boot_t_F)以及不转换观察结果(使用 function boot_t_B)。
由此产生的自举 p 值(作为超过原始测试统计量的自举测试统计量的比例)应该完全相同,但事实并非如此。
为什么是这样?
我的两个功能如下:
boot_t_B<-function(x,y){
print(t.test(x, y, var.equal=TRUE)) #original test statistics
t.est<-abs(t.test(x, y, var.equal=TRUE)$statistic) #Student's t-test
grand_mean<-mean(c(x,y), na.rm=T) #global mean
x1<-x #-mean(x, na.rm=T)+grand_mean it's not subtracted/added here
y1<-y #-mean(y, na.rm=T)+grand_mean
B <- 10000 #number of bootstrap samples
t.vect <- vector(length=B) #vector for bootstrapped t-statistics
for(i in 1:B){
boot.c <- sample(x1, size=length(x), replace=T)
boot.p <- sample(y1, size=length(y), replace=T)
t.vect[i] <- t.test(boot.c, boot.p, var.equal=TRUE)$statistic
}
return(mean(t.vect>t.est)) #bootstrapped p-value
}
boot_t_F<-function(x,y){
print(t.test(x, y, var.equal=TRUE)) #original test statistics
t.est<-abs(t.test(x, y, var.equal=TRUE)$statistic) #Student's t-test
grand_mean<-mean(c(x,y), na.rm=T) #global mean
x1<-x-mean(x, na.rm=T)+grand_mean
y1<-y-mean(y, na.rm=T)+grand_mean
B <- 10000 #number of bootstrap samples
t.vect <- vector(length=B) #vector for bootstrapped test-statistics
for(i in 1:B){
boot.c <- sample(x1, size=length(x), replace=T)
boot.p <- sample(y1, size=length(y), replace=T)
t.vect[i] <- t.test(boot.c, boot.p, var.equal=TRUE)$statistic
}
return(mean(t.vect>t.est)) #bootstrapped p-value
}
set.seed(1678)
boot_t_B(rnorm(25,0,10), rnorm(25,5,10))
[1] 4e-04
set.seed(1678)
boot_t_F(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.0507
注意:我“随机”选择了样本的(正态)分布。