Bootstrap,蒙特卡洛


12

作为作业的一部分,我被设置了以下问题:

设计并实施模拟研究,以检查引导程序的性能,以获取单变量数据平均值的95%置信区间。您的实现可以采用R或SAS。

您可能要查看的性能方面是置信区间覆盖率(即,置信区间包含真实均值的几率)和蒙特卡洛变化(即,模拟之间的上下置信限有多少变化)'

有谁知道该怎么做蒙特卡洛变化方面?我似乎什至无法解决算法或其他问题。与蒙特卡洛积分有关吗?谢谢!

Answers:


18

引导程序和蒙特卡洛程序之间的这种混淆不断发生,因此也许这是解决任何问题的好地方。(R代码示例也可以帮助完成家庭作业。)

考虑以下引导程序的实现R

boot <- function(x, t) { # Exact bootstrap of procedure t on data x
    n <- length(x)       # Must lie between 2 and 7 inclusive.
    if (n > 7) {
        stop("Sample size exceeds 7; use an approximate method instead.")
    }
    p <- c(n, 1:(n-1))
    a <- rep(x, n^(n-1))
    dim(a) <- rep(n, n)
    y <- as.vector(a)
    while (n > 1) {
        n <- n-1
        a <- aperm(a, p)
        y <- cbind(as.vector(a), y)
    }
    apply(y, 1, t)
}

快速浏览将确认这是确定性计算:不会生成或使用任何随机值。(我将其内部工作的细节留给感兴趣的读者自己解决。)

的参数boot是数组中的一批数字数据,x以及t对函数的引用(可以像一样将其应用于数组x)以返回单个数字值;换句话说,t是一个统计量。它会生成所有可能的样本,并替换为每个样本x并应用于t每个样本,从而为每个此类样本生成一个数字:简而言之就是引导程序。返回值是表示所述阵列精确引导分配t用于样品x

作为一个小例子,让我们引导一个样本x= 的平均值c(1,3)

> boot(c(1,3), mean)
> [1] 1 2 2 3

确实存在四个可能的大小为样本,并替换为;即,,和。 全部生成它们(按照列出的顺序)并将它们应用于每个。在这种情况下,计算的平均值和那些变成是,,,和,分别如图中输出。1 3 1 1 1 3 3 1 3 3 1 2 2 32(1,3)(1,11个331个33boottt1个223

您从这里去哪里取决于您要如何使用引导程序。有关引导程序的完整信息包含在此输出数组中,因此通常最好显示它。这是从样本引导标准偏差的示例:1个3347

hist(boot(c(1,3,3,4,7), sd))

SD的直方图

现在我们准备谈论蒙特卡洛模拟。 假设,例如,我们将通过使用自举分布的第95个百分位数,从个样本中自举SD的95%可信度上限。此过程将具有哪些属性?一种发现方法是假设样本是从均匀分布中随机获得的。(该应用程序通常会指出什么是合理的分布假设;在这里,我任意选择一个易于计算但不易于分析处理的假设。)我们可以通过采取这样的样本并计算UCL来模拟发生的情况:5

> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
     95% 
3.835870 

对于结果这个特定的随机样本是3.83587。这是肯定的:如果您boot使用相同的数据集再次调用,答案将完全相同。但是答案随不同的随机样本如何变化?通过重复几次此过程并绘制结果的直方图来找出答案:

> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)

模拟直方图

如果我们要进行另一组模拟,则随机抽奖会有所不同,从而创建(略微)不同的直方图,但与此相差无几。我们可以放心使用它来了解SD的引导UCL是如何工作的。作为参考,请注意均匀分布的标准偏差(范围从到,如此处指定)等于。正如人们希望任何盐值的UCL一样,直方图中的大多数值(四分之三或0.75)都超过了此值:10 10 / 01010/122.887

> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75

但这远没有达到我们指定(并希望)的额定95%的水平!这是模拟的价值之一:它将我们的希望与实际情况进行了比较。(为什么会有差异?我相信是因为引导SD不适用于非常小的样本。)

评论

  • 引导统计在概念上与任何其他统计(例如平均值或标准偏差)相同;它们往往需要很长时间才能计算出来。(请参阅boot代码中的警告消息!)

  • 蒙特卡洛模拟可用于研究自举统计量由于获取样本中的随机性而如何变化。在这种模拟中观察到的变化是由于在样品中的变化,在自举的变化。

  • (此处未示出)由于自举的统计数据会占用大量计算的(显然,高达计算为大小的样品),可以很方便地接近引导分布。通常,这是通过创建一个“黑匣子”程序从真正的自举分布中随机获取一个值并重复调用该程序来完成的。集体输出近似于精确分布。近似值可能会由于黑盒中的随机性而发生变化-但是这种变化是近似过程的伪影。它不是(概念上)自举程序本身固有的。 nñññ


+1这非常好。我认为我做得更好!我只想补充一下,我有一些关于引导程序在错误率估计中的性能以及在估计方差时的置信区间的论文。这些结果可以在我的引导方法,书的第二版和我的引导与应用R.书中找到
迈克尔·Chernick


我只是想说,这个想法是使用感兴趣的自举程序(例如,参数的置信区间或分类器的错误率估计)来模拟已知分布中的数据,并且您可以评估它的效果,因为您了解事实。
Michael R. Chernick

5

引导程序是一种蒙特卡洛技术,因为它涉及某种类型的随机采样。如果您对同一组数据运行两次引导程序,则会得到不同的答案。您在引导程序中使用的样本越多,获得的差异就越小。

覆盖率是指结果来自相同假设抽样分布的不同数据集的变化。


谢谢,我认为这只是想出代码来查看模拟之间的置信度极限是否不同!
Sarah

7
准确地说(学究的?),我们应该阐明引导程序本身不是蒙特卡洛技术。但是,由于通常难以计算感兴趣的特定量,因此通常使用蒙特卡洛模拟进行近似。我发现问题的措辞也很容易被误解!必须小心区分采样误差蒙特卡洛近似误差。如您所指出的那样,只有通过在同一样本上多次重复MC引导程序近似来合理地估计后者。:)
红衣主教2012年

1

我也不确定“ 蒙特卡洛变化”本身到底意味着什么。当然,应该有可能查看诸如上限(或下限)之类的事情(例如提示)在迭代过程中有多少变化。也许他们只希望您为Monte Carlo做到这一点,而不是引导程序?不过,这不是我进行练习所必需的。最好只问该短语的含义。


谢谢你的帮助!也许我现在只看一下上限和下限之间的差异,然后再询问蒙特卡洛。现在刚参加工作了我如何去的..
莎拉

这里有几种可能性。一个是上下(即差异)。我对问题的措词的解释是上限的变化和下限的变化(即2种不同的变化),但是我想我不确定。另一方面,您的问题之一是如何在R中进行MC仿真?
gung-恢复莫妮卡

我得出的结论是它也在寻找2种不同的版本,所以我想尝试一下!
莎拉

1
公平地说,我现在想知道的是,您现在是否愿意这样做,还是需要一些额外的提示以了解如何解决我们猜测的问题所在?
gung-恢复莫妮卡

1
因此,在每次迭代中,您是否存储上限和下限(提示)?
gung-恢复莫妮卡

1

我对这项作业的理解是,它要求您对某种统计技术进行蒙特卡洛模拟。也就是说,您模拟了一堆随机数据集,将此技术应用于这些数据集,并存储数字以方便地稍后汇总(均值,模拟概率等)。

现在,有问题的技术是引导程序,它涉及其中的蒙特卡洛模拟(除非如wuber所示,要求您执行确切的引导程序,这极不可能)。因此,作为模拟的结果,您可能正在存储样本均值,样本标准偏差以及自举获得的均值的置信区间的限制。

ñ=10


3
通过使用精确的引导程序,我了解到的一件事是,即使样本偏斜,标准的正常理论CI通常也可以更好地工作。引导程序有大量示例:理论是渐近的,而不是精确的。
whuber

2
@whuber,这是一个有趣的观察。我通常会强调Bootstrap的渐近性质(请参阅Peter Hall的The Bootstrap and Edgeworth Expansions一书以了解原因),但这次却没有这样做。
StasK
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.