我想知道如何使用复制权重和调查包的confint实现来构造bootstrap置信区间/标准误差。
看看survey
包的implementation of confint,它似乎只是简单地取复制后生成的theta
列表的标准误差,然后将其乘以对应于给定alpha范围的统计量。
但这并不符合我所知道的任何bootstrap实现,通常情况下,你会使用theta分布的百分位数来得到样本均值分布的置信区间,T和BCa区间是另一回事。
这是我的R代码。我没有使用提供的权重,而是让repweights
权重以等概率生成为“带替换的样本”权重。
data(api)
d <- apiclus1 %>% select(fpc, dnum,api99)
dclus1<-svydesign(id=~dnum, data=d, fpc=~fpc)
rclus1<-as.svrepdesign(dclus1,type="bootstrap", replicates=100)
为了检验置信区间,我们可以用途:
test_mean <- svymean(~api99, rclus1)
confint(test_mean, df=degf(rclus1))
confint(test_mean, df=degf(rclus1)) - mean(d$api99)
结果是:
2.5 % 97.5 %
api99 554.2971 659.6592
2.5 % 97.5 %
api99 -52.68107 52.68107
很明显,区间是对称的,这违背了使用bootstrap的一些目的。
我们试试看:
test_bs <- withReplicates(rclus1, function(w, data) weighted.mean(data$api99, w), return.replicates=T)
这将引导重复,其中权重是rep权重(我假设是替换权重)。以下是使用BCa区间对重复进行的区间:
bca(test$replicates) - mean(d$api99)
-43.2878 49.1148
显然不对称。
使用百分位数区间:
c(quantile(test$replicates, 0.025),quantile(test$replicates, 0.975)) - mean(d$api99)
2.5% 97.5%
-45.50944 48.06085
瓦利安特以这种方式实现了百分位数区间,它应该与我的百分位数区间相当:
smho.boot.a <- as.svrepdesign(design = smho.dsgn,
type = "subbootstrap",
replicates = 500)
# total & CI for EOYCNT based on RW bootstrap
a1 <- svytotal( ̃EOYCNT, design = smho.boot.a,
na.rm=TRUE,
return.replicates = TRUE)
# Compute CI based on bootstrap percentile method.
ta1 <- quantile(a1$replicates, c(0.025, 0.975))
我想知道
a.如何使用调查包为感兴趣的统计数据构建bootstrap CI b. bootstrap的withReplication
实现是否正确
1条答案
按热度按时间l7wslrjt1#
百分位数的东西实际上并不适用于多阶段调查数据(或者,至少,不知道它能起作用(或者,至少,不知道它能起作用))。调查引导法只是估计方差。你不能用这种方法得到光滑函数的高阶精度。但是你可以渐近地得到正确的方差。为了得到不对称的区间,你需要 Bootstrap 一些合适的参数函数,如
svyciprop
和svyquantile
(以及在某种意义上svyglm
)那样。如果你假设简单的随机抽样与集群替换,那么你可以使百分位bootstrap和扩展工作,但这不是一个常见的结构,为现实世界的调查(它并不真正需要调查包)
我相信如果有人向维护者指出合适的参考,他会很乐意实现一个 Bootstrap ,给出更好的非对称间隔,并为多级样本工作。