boot.ci()返回bootstrap样本的奇怪置信区间

时间:2014-07-10 11:47:21

标签: r confidence-interval statistics-bootstrap

我有两组正实数。

> dput(group1)
c(2.10753, 2.57251, 2.61687, 4.62551, 7.13166, 6347.63, 4.22139, 
10.7373, 2.11568, 2.71866, 4.09376, 10.9046, 109807, 5.87156, 
3.17082, 3.4703, 2.47262, 9.24319, 34.6945, 5.72567, 12.0134, 
108.33, 6.60707, 6.24304, 3.59048, 10.3174, 48.0265, 5.32097, 
3.77157, 6.67401, 22.633, 34.8186, 21.5315, 9.42882, 7.10627, ...)

> dput(group2)
c(4.88474, 65.4318, 128.101, 24.1271, 5.44262, 54.8987, 2.85175, 
14.1089, 172.23, 66.8563, 6.74067, 2.19603, 2.12985, 4.12735,
16.401, 3.22688, 15.6943, 4.32861, 36.4752, 7.33769, 75.855, 
62.7653, 35.1786, 3.71099, 29.0186, 34.4472, 19.1061, 2.75174, ...)

Group1由~1000个值组成,组2为~30,000。我对两组之间的中位数感兴趣,并使用以下R函数计算每个2000引导样本的比率(对于boot()命令,请参阅下面的函数输出):

medianRatio <- function(x, i, noGroup1, noGroup2) {
    all <- x[i]
    currGroup1 <- all[1:noGroup1]
    currGroup2 <- all[c(noGroup1 + 1):length(all)]
    ratio <- median(currGroup1) / median(currGroup2)
    return(ratio)
}

来自boot()函数的调用如下所示

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = c(group1, group2), statistic = medianRatio, R = noBs, 
    noGroup1 = length(group1), noGroup2 = length(group2))


Bootstrap Statistics :
    original      bias    std. error
t1*  1.08847 -0.08597889  0.05451763`

自举样本的最终分布的平均值是1.002,sd是0.054(直方图的目视检查证实了1左右的正态分布)。也:

  

范围(Group1_Group2.BS $ t)的       [1] 0.823311 1.198469

然而,当我在boot-object上运行boot.ci()时,报告的置信区间为

BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 2000 bootstrap replicates

CALL : 
boot.ci(boot.out = Group1_Group2.BS, type = "norm")

Intervals : 
Level      Normal        
95%   ( 1.068,  1.281 )  
Calculations and Intervals on Original Scale

我不明白这里发生了什么,因为报告的置信区间甚至没有覆盖自举样本的(对称)分布的平均值。我错过了什么?

2 个答案:

答案 0 :(得分:9)

了解如何计算正常置信区间可能有助于清理问题。我在this question的答案中找到了一个非常好的解释。

自举正常置信区间围绕统计的观察值建立,并进行偏差校正,以解决自举统计中间值与观察值之间的差异。通过使用来自原始样本的感兴趣统计的估计,减去偏差并且将自举标准误差加1.96倍来计算CI。如果您使用boot对象中的值“手动”执行此操作,则会看到您获得与boot.ci相同的值。

1.08847 - -0.08597889 - 1.96*0.05451763
[1] 1.067594
1.08847 - -0.08597889 + 1.96*0.05451763
[1] 1.281303

你的偏见大到足以使CI百分位和正常CI之间的区别显着。当我考虑bootstrap置信区间时,我本来期望使用引导分布的均值减去偏差而不是观察到的统计量减去偏差。我没有花足够的时间考虑这个问题,我也没有自己的引导说明,但你可能会更仔细地检查这个问题。

答案 1 :(得分:2)

您正在错误地执行引导程序。你在函数medianRatio中假设x [i]的第一部分将保存第1组的值,第二部分保存在第2部分。这是不正确的,因为我只是一个从1替换为noGroup1 + noGroup2的样本。您需要在boot命令中使用strata选项。我认为以下内容可行。 stype =“f”选项指定引导将生成长度为noGroup1 + noGroup2的向量,该向量表示为引导样本选择了每次观察的次数(0,1,2,...)。此代码基于引导文档中的示例。

medRatio <- function(x, f, noGroup1){
 gp1 <- 1:noGroup1
 m1 <- median(rep(x[gp1],f[gp1]))
 m2 <- median(rep(x[-gp1],f[-gp1]))
 return(m1/m2)
}
n1 <- length(group1)
n2 <- length(group2)
boot(c(group1,group2),medRatio,R=2000,stype = "f",strata = rep(1:2,c(n1,n2)),noGroup1=n1)