为什么我的引导时间间隔覆盖范围很差?


29

我想做一个课堂演示,在其中我将t间隔与引导间隔进行比较,并计算两者的覆盖率。我希望数据来自偏斜的分布,因此我选择将数据生成为exp(rnorm(10, 0, 2)) + 1对数正态偏移后的大小为10的样本。我编写了一个脚本来绘制1000个样本,并针对每个样本,基于1000个重复计算出95%的t间隔和95%的bootstrap百分位间隔。

当我运行脚本时,这两种方法的间隔都非常相似,并且覆盖率均为50-60%。我感到很惊讶,因为我认为引导间隔会更好。

我的问题是

  • 在代码中犯了错误?
  • 在计算间隔时出错了?
  • 期望引导间隔具有更好的覆盖范围特性而犯了一个错误?

另外,在这种情况下是否有办法构建更可靠的配置项?

 tCI.total <- 0
 bootCI.total <- 0
 m <- 10 # sample size
 true.mean <- exp(2) + 1

for (i in 1:1000){
 samp <- exp(rnorm(m,0,2)) + 1
 tCI <- mean(samp) + c(1,-1)*qt(0.025,df=9)*sd(samp)/sqrt(10)

 boot.means <- rep(0,1000)
 for (j in 1:1000) boot.means[j] <- mean(sample(samp,m,replace=T))
 bootCI <- sort(boot.means)[c(0.025*length(boot.means), 0.975*length(boot.means))]

 if (true.mean > min(tCI) & true.mean < max(tCI)) tCI.total <- tCI.total + 1
 if (true.mean > min(bootCI) & true.mean < max(bootCI)) bootCI.total <- bootCI.total + 1 
}
tCI.total/1000     # estimate of t interval coverage probability
bootCI.total/1000  # estimate of bootstrap interval coverage probability

3
人们通常会忘记引导程序的另一种用法:识别并纠正偏见。我怀疑如果在引导程序中包含偏差校正,则CI可能会获得更好的性能。
ub

@whuber:不错,+ 1。据我所记得,Davison&Hinkley的Bootstrap方法及其应用程序为引导校正和自举上的其他改进提供了一个很好且易于访问的介绍。
S. Kolassa-恢复莫妮卡2014年

1
值得尝试其他引导程序变体,尤其是基本引导程序。
Frank Harrell 2014年

3
自举是一个大样本过程。并不大,特别是对于对数正态数据n=10
Cliff AB

Answers:


16

Canto,Davison,Hinkley和Ventura(2006)提出的自举诊断和补救措施似乎是合乎逻辑的出发点。他们讨论了引导程序崩溃的多种方式,并且-更重要的是-提供了诊断和可能的解决方法:

  1. 离群值
  2. 错误的重采样模型
  3. 非关键性
  4. 引导程序方法不一致

在这种情况下,我看不到1、2和4有问题。让我们看一下3.正如@Ben Ogorek指出的(尽管我同意@Glen_b的常态性讨论可能是一个红色鲱鱼),引导程序的有效性取决于我们关注的统计数据的关键性。

Canty等人的第4节。建议在重采样内进行重采样,以获取每次引导重采样内参数估计的偏差和方差的度量。这是从p复制公式的代码。文章15:

library(boot)
m <- 10 # sample size
n.boot <- 1000
inner.boot <- 1000

set.seed(1)
samp.mean <- bias <- vars <- rep(NA,n.boot)
for ( ii in 1:n.boot ) {
    samp <- exp(rnorm(m,0,2)) + 1
    samp.mean[ii] <- mean(samp)
    foo <- boot(samp,statistic=function(xx,index)mean(xx[index]),R=inner.boot)
    bias[ii] <- mean(foo$t[,1])-foo$t0
    vars[ii] <- var(foo$t[,1])
}

opar <- par(mfrow=c(1,2))
    plot(samp.mean,bias,xlab="Sample means",ylab="Bias",
        main="Bias against sample means",pch=19,log="x")
    abline(h=0)
    plot(samp.mean,vars,xlab="Sample means",ylab="Variance",
        main="Variance against sample means",pch=19,log="xy")
par(opar)

引导程序诊断

请注意对数刻度-如果没有日志,则更加公然。我们很好地看到了引导程序均值估计的方差如何随引导程序样本的均值增加。在我看来,这就像抽烟足以将非关键性归咎于低置信区间覆盖率的罪魁祸首。

但是,我会很高兴地承认,人们可以采取多种方式进行跟进。例如,我们可以查看特定引导复制的置信区间是否包括真实均值如何取决于特定复制的均值。

至于补救措施,Canty等。讨论转换,然后在这里想到对数(例如,引导和建立置信区间不是针对均值,而是针对记录数据的均值),但是我无法真正使它起作用。

坎蒂等。继续讨论如何通过重要性采样和平滑来减少内部引导程序的数量和剩余噪声,以及如何在枢轴图上添加置信带。

对于聪明的学生来说,这可能是一个有趣的论文项目。我希望能指出我犯错的地方以及其他文献。我将自由地将diagnostic标签添加到该问题。


13

μ^μ
μ^t
mμ^μσ^

然后,我对整个设置有了更多的思考。仅用10个观测值和极偏斜的分布,那么是否就基本上不可能无参数地估计均值,更不用说构建具有正确覆盖率的置信区间了?

e2+1=8.39P(X2)=0.84XN(0,4)0.840.8410=0.178。因此,在不到18%的情况下,最大的观察值小于平均值。要获得大于0.82的覆盖率,我们需要构建均值的置信区间,其均值超出最大观察值。我很难想象在没有先验的假设下,这种结构是如何制造的(并证明是合理的)。但我欢迎任何建议。


我同意你的看法。我真的很想从一个从这个分布中获得一个样本的人的角度考虑它。我怎么知道在这种情况下明智地使用引导程序是不安全的?我唯一能想到的是,在进行分析之前,我很可能已经记录了日志,但是其他回答者之一说,这实际上并没有帮助。
Flounderer 2014年

1
仅从10个数据点就不会知道它是安全还是不安全。如果您怀疑偏斜或尾巴较粗,则解决方案可能是将重点放在与平均值不同的参数上。例如对数平均值或中位数。除非您进行其他假设,否则不会给您提供均值的估计值(或置信区间),但是完全集中于对分布的尾部不太敏感的参数可能是一个更好的主意。
NRH

6

计算是正确的,我与著名的package boot进行了核对。另外,我添加了BCa-interval(由Efron提供),它是百分位数引导程序间隔的偏差校正版本:

for (i in 1:1000) {
  samp <- exp(rnorm(m, 0, 2)) + 1

  boot.out <- boot(samp, function(d, i) sum(d[i]) / m, R=999)
  ci <- boot.ci(boot.out, 0.95, type="all")

  ##tCI <- mean(samp) + c(1,-1)*qt(0.025,df=9)*sd(samp)/sqrt(10)
  tCI <- ci$normal[2:3]
      percCI <- ci$perc[4:5]
  bcaCI <- ci$bca[4:5]
      boottCI <- ci$student[4:5]

  if (true.mean > min(tCI) && true.mean < max(tCI)) tCI.total <- tCI.total + 1
  if (true.mean > min(percCI) && true.mean < max(percCI)) percCI.total <- percCI.total + 1 
  if (true.mean > min(bcaCI) && true.mean < max(bcaCI)) bcaCI.total <- bcaCI.total + 1
}

tCI.total/1000     # estimate of t interval coverage probability
0.53
percCI.total/1000  # estimate of percentile interval coverage probability
0.55
bcaCI.total/1000  # estimate of BCa interval coverage probability
0.61

我认为如果原始样本大小大于10(例如20或50),则间隔会更好。

此外,bootstrap-t方法通常可为偏斜的统计结果带来更好的结果。但是,它需要嵌套循环,因此需要20倍以上的计算时间。

对于假设检验,一面覆盖良好也很重要。因此,仅查看两面覆盖通常会产生误导。


1
n<100

5

我对此也感到困惑,在1996年DiCiccio和Efron的论文《Bootstrap Confidence Intervals》上花了很多时间,但没有什么值得证明的。

实际上,这使我很少考虑将引导程序作为通用方法。我曾经认为它会在您真正卡住时将您从果酱中拉出来。但是我已经学到了它的肮脏的小秘密:引导置信区间全部以某种方式基于正常性。请允许我解释一下。

xN(μ,σ2)
σ
z=xμσN(0,1)
μPr(1.96xμσ1.96)=0.95

当您考虑正当分布的百分位数与置信区间有关的合理性时,它完全基于此方便的关键量。对于任意分布,采样分布的百分位数与置信区间之间没有任何理论联系,并且采用自举采样分布的原始比例也不会削减它。

因此,埃夫隆(Efron)的BCa(偏差校正)间隔使用变换来近似正态性,而bootstrap-t方法依赖于由此产生的t统计量是近似关键的。现在,引导程序可以立即估算出地狱,您可以始终假设正常,并使用标准的+/- 2 * SE。但是考虑到所有与引导程序无关的工作,这似乎并不公平,是吗?


2
我可能错过了一些东西,但是引导与枢轴数量或接近枢轴数量相关联的事实本身并不意味着与正态性有任何关联。在特定情况下,关键数量可能具有各种分布方式。我也看不出您倒数第二段中的斜体字是如何出现的。
Glen_b-恢复莫妮卡2014年

1
与正常性有关的断言又如何呢?
Glen_b-恢复莫妮卡2014年

1
FΦ1[F(X)]

2
F

2
要添加到@Glen_b:仅需存在向正态分布的转换即可证明该方法正确。您无需使用该方法即可找到它。此外,如果您不喜欢正态分布,则可以使用其他一些对称的连续分布重写整个证明。使用正态分布在技术上是有用的,但并非绝对必要,它没有说明数据的来源或样本均值。
彼得

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.