Bootstrap 两样本 t 检验

机器算法验证 r t检验 引导程序
2022-03-20 16:37:18

我想引导两个样本 t 检验。我的DV是一些心理变量。我有两组(女性和男性),大小不等,我不假设方差相等。我不确定我的代码或/和我的想法是否正确,因为最终我得到的 0 t-statistics 大于原始数据的 t-statistics。

group_k  # women: N=377
group_m  # men:   N=306
t.est <- t.test(group_k, group_m, var.equal=FALSE)$stat
#        t 
# 5.659757

nullA <- group_k - mean(group_k, na.rm=T)
nullB <- group_m - mean(group_m, na.rm=T)
set.seed(1)
b <- function(){
  A <- sample(nullA, 200, replace=T)  # is 200-element from 377-element sample ok? 
  B <- sample(nullB, 200, replace=T) 
  stud_test <- t.test(A, B, var.equal=FALSE)
  stud_test$stat
}
t.stat.vect = vector(length=10000)
t.vect <- replicate(10000, b())

1 - mean(t.est>t.vect)
# [1] 0 :(

我还有一些问题:

  1. 为什么不简单地引导男女之间的差异?
  2. 如何选择引导样本大小?换句话说,377 和 306 元素组中的 200 元素是否可以?是否应该按照这篇文章的建议分别为 377 和 306 ?

减去均值背后的想法就在这里——gung 的回答。我认为它可以直接从 ANOVA 案例到学生 t 检验。

[更新 13XII] 我更正了我的代码,但结果对我来说仍然很尴尬:

t.est <- t.test(group_k, group_m, var.equal=FALSE)$stat
# t = 5.6598, df = 255.185, p-value = 4.066e-08

b <- function(){
  A <- sample(group_k, 377, replace=T)  
  B <- sample(group_m, 306, replace=T) 
  stud_test <- t.test(A, B, var.equal=FALSE)
  stud_test$stat
}
t.stat.vect = vector(length=10000)
t.vect <- replicate(10000, b())

1 - mean(t.est>t.vect)
[1] 0.5042

是否有可能使用原始样本,均值之间的差异“如此显着”(p 值 = 4.066e-08),但引导样本显示实际上不是(0.5042)?

4个回答

正如@Tim 所指出的,您的引导样本应该与原始数据 nj

接下来,认识到有几种引导方法:例如,您可以直接引导数据或引导测试统计量,可以引导抽样分布或空分布等。您需要确保您了解自己的类型正在做。如果你愿意,你可以简单地引导平均差。在链接的帖子中,我引导了测试统计量的零分布。这本质上就是您在代码中所做的。

此外,由于测试方式可能不同,引导策略可能需要针对您要执行的测试进行定制。在链接的帖子中,我引导了一个统计量,但测试的工作方式有些不同由于您正在引导测试统计信息,因此您可以放心。 FFt

在您的情况下,请考虑您使用的引导类型的逻辑。您为统计量引导了一个空抽样分布。您观察到的统计量非常极端,以至于没有任何自举与其重叠。这意味着从自举的空采样分布中获得远离或远离值)换句话说,您的结果非常重要。重新执行引导程序。) tttpt0<(1/10000)/2nj

首先,使用引导程序,您可以个案例所以要选择的观察次数很简单。NN

而且,是的,你可以这样做:

f <- function() {
   A <- sample(group_A, 377, replace=T) 
   B <- sample(group_B, 377, replace=T)
   mean(A)-mean(B)
}
replicate(1000, f())

但这是与使用t检验不同的方法,因为它会为您提供这两种方法之间可能差异范围的信息。您可以以类似的方式使用此范围,因为您可以使用箱线图(非正式)分析平均值之间的差异。然而,对于假设检验,最好使用经典的引导程序,在每次迭代中计算t检验并输出t统计量。原因是t检验不仅计算均值之间的差异,而且还考虑了两组的方差。

为了更深入地了解引导程序,我向您推荐Efron 1979 年的经典论文和他非常易读的书

还有一件事:如果您不假设方差相等,您可能需要考虑 Welch 的 t 检验(http://beheco.oxfordjournals.org/content/17/4/688.full

我会以总样本量为条件,而不是固定组大小。当然,如果您的小组人数是事先固定的,那么就以这些为条件,我的回答是针对他们不是的情况。

我构建了一个两列矩阵,第一列表示组成员资格,第二列表示两个组的观察值堆叠在彼此下方。然后我引导矩阵的行并计算观察到的组间均值差异。最后,我使用自举差来计算近似 p 值,以检验均值零差。

pvalfunc <- function(sims,target=0) { 2*min(mean(sims<target),mean(sims>target)) }

boot.2sdif.test <- function(s1,s2, nboot=9999) {
  n1 <- length(s1); n2 <- length(s2); n <- n1+n2
  X <- cbind(rep(c(1,2), c(n1,n2)), c(s1,s2))
  d <- rep(0,nboot)
  for (i in 1:nboot) {
    b <- X[sample.int(n, n, T),]
    d[i] <- mean(b[b[,1]==1, 2]) - mean(b[b[,1]==2, 2])
  }
  return(pvalfunc(d))

(pvalue <- boot.2sdif.test(group_k, group_m))