为什么对重新采样的数据集进行假设检验经常会拒绝零值?


10

tl; dr:从空值下生成的数据集开始,我对样本进行了替换并重新采样,并对每个重新采样的数据集进行了假设检验。这些假设检验在超过5%的时间内拒绝了原假设。

在下面的非常简单的模拟中,我使用生成数据集,并为每个数据集拟合一个简单的OLS模型。然后,对于每个数据集,我通过替换替换原始数据集的行来生成1000个新数据集(该算法在Davison&Hinkley的经典文章中专门描述为适合线性回归的算法)。对于每一个,我都使用相同的OLS模型。最终,引导样本中大约16%的假设检验拒绝了null,而我们应该得到5%(就像在原始数据集中所做的那样)。Xñ01个⨿ÿñ01个

我怀疑这与重复观察导致虚假关联有关,因此为了进行比较,我尝试了以下代码中的两种其他方法(注释掉)。在方法2中,我修复,然后用原始数据集上OLS模型中的重采样残差替换在方法3中,我绘制了一个随机子样本而不进行替换。这两种选择均起作用,即它们的假设检验拒绝了5%的无效时间。ÿXÿ

我的问题:罪魁祸首是反复观察吗?如果是这样,考虑到这是引导程序的标准方法,那么我们到底在哪里违反标准引导程序理论?

更新#1:更多模拟

我尝试了一个更简单的方案,即的仅拦截回归模型。发生相同的问题。ÿ

# note: simulation takes 5-10 min on my laptop; can reduce boot.reps
#  and n.sims.run if wanted
# set the number of cores: can change this to match your machine
library(doParallel)
registerDoParallel(cores=8)
boot.reps = 1000
n.sims.run = 1000

for ( j in 1:n.sims.run ) {

  # make initial dataset from which to bootstrap
  # generate under null
  d = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

  # fit OLS to original data
  mod.orig = lm( Y1 ~ X1, data = d )
  bhat = coef( mod.orig )[["X1"]]
  se = coef(summary(mod.orig))["X1",2]
  rej = coef(summary(mod.orig))["X1",4] < 0.05

  # run all bootstrap iterates
  parallel.time = system.time( {
    r = foreach( icount( boot.reps ), .combine=rbind ) %dopar% {

      # Algorithm 6.2: Resample entire cases - FAILS
      # residuals of this model are repeated, so not normal?
      ids = sample( 1:nrow(d), replace=TRUE )
      b = d[ ids, ]

      # # Method 2: Resample just the residuals themselves - WORKS
      # b = data.frame( X1 = d$X1, Y1 = sample(mod.orig$residuals, replace = TRUE) )

      # # Method 3: Subsampling without replacement - WORKS
      # ids = sample( 1:nrow(d), size = 500, replace=FALSE )
      # b = d[ ids, ]

      # save stats from bootstrap sample
      mod = lm( Y1 ~ X1, data = b ) 
      data.frame( bhat = coef( mod )[["X1"]],
                  se = coef(summary(mod))["X1",2],
                  rej = coef(summary(mod))["X1",4] < 0.05 )

    }
  } )[3]


  ###### Results for This Simulation Rep #####
  r = data.frame(r)
  names(r) = c( "bhat.bt", "se.bt", "rej.bt" )

  # return results of each bootstrap iterate
  new.rows = data.frame( bt.iterate = 1:boot.reps,
                         bhat.bt = r$bhat.bt,
                         se.bt = r$se.bt,
                         rej.bt = r$rej.bt )
  # along with results from original sample
  new.rows$bhat = bhat
  new.rows$se = se
  new.rows$rej = rej

  # add row to output file
  if ( j == 1 ) res = new.rows
  else res = rbind( res, new.rows )
  # res should have boot.reps rows per "j" in the for-loop

  # simulation rep counter
  d$sim.rep = j

}  # end loop over j simulation reps



##### Analyze results #####

# dataset with only one row per simulation
s = res[ res$bt.iterate == 1, ]

# prob of rejecting within each resample
# should be 0.05
mean(res$rej.bt); mean(s$rej)

更新2:答案

在评论和答案中提出了几种可能性,我进行了更多的模拟以进行经验测试。事实证明,JWalker是正确的,问题在于我们需要以原始数据的估计值为中心来计算引导统计信息,以便在下获得正确的采样分布。但是,我还认为,尽管在这种情况下解决JWalker问题时,实际上确实得到了名义上的误报,但胡布尔关于违反参数测试假设的评论也是正确的。H0


1
在标准引导程序中,您仅考虑X1系数的引导程序分布,而不考虑其关联的p值。因此,这不是引导程序的问题。但是,您的观察是有趣且不直观的。
Michael M

1
@MichaelM,是的。但是由于重采样中数据的联合CDF应该收敛于n,并且引导程序的次数会迭代到生成原始数据的真实CDF,所以我也不希望p值也有所不同。
半通

对。我可以肯定的是,这种影响来自观察结果的非独立性(如您所说),产生了过于乐观的标准误。在您的仿真中,它似乎是法线模型唯一违反的假设。也许我们甚至可以得出相应的方差缩小因子。
Michael M

2
方法1中清楚的一件事是违反了iid错误假设:用替换进行重采样时,任何给定值的残差都是完全相关的,而不是独立的!因此,您无法正确启动,仅此而已。作为演示,在计算后将它们替换为,但操作与以前完全相同。这样可以正确处理重复项(尽管它会产生较小的样本)。您将获得p值的均匀分布。Xidsids <- unique(ids)
ub

2
@whuber。我知道了。这就可以解释为什么尽管有重复的观察结果,但是仍然可以用替换来对残差进行重采样:该模型的残差再次独立于X。
半通

Answers:


5

对null进行重新采样时,回归系数的期望值为零。对某些观察到的数据集重新采样时,期望值就是该数据的观察到的系数。重新采样观测数据时,如果P <= 0.05,这不是I型错误。实际上,如果P> 0.05,这是II型错误。

您可以通过计算abs(b)和mean(P)之间的相关性来获得一些直觉。这是更简单的代码,用于复制您所做的事情,并在一组模拟中计算b与“ I型”错误之间的相关性

boot.reps = 1000
n.sims.run = 10
n <- 1000
b <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
p <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
for(sim_j in 1:n.sims.run){
  x <- rnorm(n)
  y <- rnorm(n)
  inc <- 1:n
  for(boot_i in 1:boot.reps){
    fit <- lm(y[inc] ~ x[inc])
    b[boot_i, sim_j] <- abs(coefficients(summary(fit))['x[inc]', 'Estimate'])
    p[boot_i, sim_j] <- coefficients(summary(fit))['x[inc]', 'Pr(>|t|)']
    inc <- sample(1:n, replace=TRUE)
  }
}
# note this is not really a type I error but whatever
type1 <- apply(p, 2, function(x) sum(x <= 0.05))/boot.reps
# correlation between b and "type I"
cor(b[1, ], type1)

通过grand_chat 更新答案不是P <= 0.05的频率> 0.05的原因。答案非常简单,我在上面已经说过-每次重采样的均值的期望值是原始的观察到的均值。这是引导程序的全部基础,该引导程序的开发目的是根据观察到的平均值生成标准误差/置信度极限,而不是作为假设检验。由于期望值不为零,因此“ I型错误”当然会大于alpha。这就是为什么系数的大小(离零有多远)与“ I型错误”与alpha的偏差的大小之间存在相关性的原因。


H0β=β^H0β=0

ħ 0 β = 0 ħ 0 β = 0H0β=βˆ检验是否相等,需要其他研究设计方法。当重要的是要确保观察到的差异不是fl幸时,使用;当您要确保预测正确时,则使用等价。不幸的是,它通常被认为是一种适合所有情况的方法,但这取决于您所处环境的风险。通常在早期研究中使用来过滤掉吸虫,当您不了解定义另类的假设时,则在了解更多假设后,有必要改用测试知识的正确性。H0β=0H0β=0
ReneBt

2

如果您从原始的正常样本中进行替换采样,则生成的引导样本将不正常。引导程序样本的联合分布遵循很可能包含重复记录的粗糙混合分布,而当您从正态分布中获取iid样本时,重复值的概率为零。

举一个简单的例子,如果您的原始样本是来自单变量正态分布的两个观察值,那么带有替换项的引导样本将有一半的时间由原始样本组成,而有一半的时间将由原始值之一构成,重复两次。显然,引导程序样本的样本方差平均将小于原始样本的方差-实际上,它将是原始样本的一半。

主要的结果是,当您将应用到引导程序样本时,基于正常理论所做的推断将返回错误的值。尤其是正常理论会产生反保守的决策规则,因为由于存在重复项,您的自举样本将产生分母小于正常理论下预期的统计量。结果,正常理论假设检验最终比预期更多地拒绝了原假设。ŤpŤ


但是,如果是这种情况,那么在用置换对残差进行重采样时,我们是否会遇到完全相同的问题?但实际上,该方法以名义概率拒绝。
半点通过

同样,对于非正常数据,n = 1000的t检验应该没有问题。

0

我完全同意@JWalker的回答。

这个问题还有另一方面。这就是您的重采样过程。因为您假设X并且Y是独立的,所以您期望回归系数以零为中心。但是,在重新采样中

ids = sample( 1:nrow(d), replace=TRUE )
  b = d[ ids, ]

因为您正在采样XY在一起,所以创建了相关性。例如,假设数据集的第一行d(x1, y1),在重新采样的数据集中,,P(Y = y1|X = x1) = 1如果XY是独立的,则P(Y|X = x1)遵循正态分布。

因此解决此问题的另一种方法是使用

b = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

使用相同的代码生成d,以使X和Y彼此独立。

相同的原因也说明了为什么它可用于残留重采样(因为X与新采样无关Y)。


有一段时间,我还以为重采样观察可能是非独立的,但在关于它的思考更多的事情,其实我不认为是这样的话:stats.stackexchange.com/questions/339237/...
半在2018年

我上面描述的问题与您的帖子不同。您指的是的独立性x's。我所指的是Xs和Ys 之间的相关性。
Tianxia Zhou

-1

这里最大的问题是模型结果是虚假的,因此非常不稳定,因为模型只是拟合噪声。从字面上讲。由于样本数据的生成方式,Y1不是因变量。


根据评论进行编辑。让我再次尝试解释我的想法。

使用OLS,通常的目的是发现和量化数据中的潜在关系。对于现实世界的数据,我们通常并不完全知道。

但这是一个人工测试的情况。我们确实知道EXACT数据生成机制,就在OP发布的代码中

X1 = rnorm(n = 1000),Y1 = rnorm(n = 1000)

如果我们以OLS回归的熟悉形式表示,即

Y1 =截距+ Beta1 * X1 +
变成
Y1的误差=平均值(X1)+ 0(X1)+误差

因此,在我看来,这是一个以线性FORM表示的模型,但实际上不是线性关系/模型,因为没有斜率。Beta1 = 0.000000。

当我们生成1000个随机数据点时,散点图将看起来像经典的shot弹枪圆形喷雾。在生成的1000个随机点的特定样本中,X1和Y1之间可能存在一定的相关性,但如果是这样,则这是随机的。如果OLS确实找到了相关性,即否定了没有斜率的原假设,因为我们确定地知道这两个变量之间确实没有任何关系,则OLS确实在错误组件中找到了一种模式。我的特征是“适合噪音”和“虚假”。

另外,OLS的标准假设/要求之一是(+/-)“线性回归模型是“参数线性”。给定数据,我认为我们不满足该假设,因此潜在的显着性检验统计数据不准确,我认为违反线性假设是引导程序非直观结果的直接原因。

当我初次阅读此问题时,它并没有陷入,因为OP打算在无效[假设]下进行测试。

但是如果将数据集生成为

X1 = rnorm(n = 1000),Y1 = X1 * .4 + rnorm(n = 1000)?


4
ÿ1个ÿ1个

(-1)出于相同的原因@whuber给出了。
半通过

1
对您编辑中的最后一个问题的回答:是的,当然可以。通过模拟自己尝试一下。(但要谨慎解释,因为您必须考虑零值是什么,以及事务的真实状态是什么。)
whuber
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.