R中的引导实际上如何工作?


22

我一直在研究R中的引导程序包,尽管我找到了很多有关如何使用它的入门知识,但我还没有找到任何能够准确描述“幕后”情况的信息。例如,在此示例中,指南显示了如何使用标准回归系数作为引导程序回归的起点,但没有说明引导程序实际上在做什么以得出引导程序回归系数。似乎正在发生某种迭代过程,但我似乎无法弄清楚到底发生了什么。


3
自上次打开它以来已经有很长的时间了,所以我不知道它是否会回答您的问题,但是启动软件包特别基于Davison,AC和Hinkley,DV(1997)中详细介绍的方法。引导方法及其应用。剑桥:剑桥大学出版社。(在引导文件的帮助文件中也引用了该参考。)
Gala 2013年

Answers:


34

引导程序有几种“风格”或形式(例如非参数,参数,残留重采样等)。该示例中的引导程序称为非参数引导程序大小写重采样(有关回归分析的应用,请参见此处此处此处此处)。基本思想是将样本视为总体,并重复进行替换以从中抽取新样本。所有原始观测值被抽取到新样本中的可能性均等。然后,您可以计算并存储感兴趣的统计信息,这可以是使用新绘制的样本的平均值,中位数或回归系数。重复次。在每次迭代中,原始样本中的某些观测值会被绘制多次,而某些观测值可能根本不会绘制。之后迭代,你存储感兴趣的统计(S)的引导估计(例如,如果和感兴趣的统计是平均,你有平均1000所自举估计)。最后,计算摘要统计信息,例如自举估计的均值,中位数和标准差。ññññ=1000ñ

引导程序通常用于:

  1. 置信区间的计算(以及标准误差的估计)
  2. 点估计偏差的估计

几种基于自举样本计算置信区间的方法(本文提供了解释和指导)。一种计算95%置信区间的非常简单的方法是,计算引导程序样本的经验2.5%和97.5%百分数(此间隔称为引导百分数区间;请参见下面的代码)。由于有更好的方法,例如偏差校正和加速自举(BCa),因此在实践中很少使用简单的百分位间隔法。BCa间隔可调整自举分布中的偏差和偏度。

偏差简单地估计为存储的引导程序样本的平均值与原始估计之间的差。ñ

让我们从网站上复制示例,但使用我们自己的循环,结合上面概述的思想(用替换重复绘制):

#-----------------------------------------------------------------------------
# Load packages
#-----------------------------------------------------------------------------

require(ggplot2)
require(pscl)
require(MASS)
require(boot)

#-----------------------------------------------------------------------------
# Load data
#-----------------------------------------------------------------------------

zinb <- read.csv("http://www.ats.ucla.edu/stat/data/fish.csv")
zinb <- within(zinb, {
  nofish <- factor(nofish)
  livebait <- factor(livebait)
  camper <- factor(camper)
})

#-----------------------------------------------------------------------------
# Calculate zero-inflated regression
#-----------------------------------------------------------------------------

m1 <- zeroinfl(count ~ child + camper | persons, data = zinb,
               dist = "negbin", EM = TRUE)

#-----------------------------------------------------------------------------
# Store the original regression coefficients
#-----------------------------------------------------------------------------

original.estimates <- as.vector(t(do.call(rbind, coef(summary(m1)))[, 1:2]))

#-----------------------------------------------------------------------------
# Set the number of replications
#-----------------------------------------------------------------------------

n.sim <- 2000

#-----------------------------------------------------------------------------
# Set up a matrix to store the results
#-----------------------------------------------------------------------------

store.matrix <- matrix(NA, nrow=n.sim, ncol=12)

#-----------------------------------------------------------------------------
# The loop
#-----------------------------------------------------------------------------

set.seed(123)

for(i in 1:n.sim) {

  #-----------------------------------------------------------------------------
  # Draw the observations WITH replacement
  #-----------------------------------------------------------------------------

  data.new <- zinb[sample(1:dim(zinb)[1], dim(zinb)[1], replace=TRUE),]

  #-----------------------------------------------------------------------------
  # Calculate the model with this "new" data
  #-----------------------------------------------------------------------------

  m <- zeroinfl(count ~ child + camper | persons,
                data = data.new, dist = "negbin",
                start = list(count = c(1.3711, -1.5152, 0.879),
                             zero = c(1.6028, -1.6663)))

  #-----------------------------------------------------------------------------
  # Store the results
  #-----------------------------------------------------------------------------

  store.matrix[i, ] <- as.vector(t(do.call(rbind, coef(summary(m)))[, 1:2]))

}


#-----------------------------------------------------------------------------
# Save the means, medians and SDs of the bootstrapped statistics
#-----------------------------------------------------------------------------

boot.means <- colMeans(store.matrix, na.rm=T)

boot.medians <- apply(store.matrix,2,median, na.rm=T)

boot.sds <- apply(store.matrix,2,sd, na.rm=T)

#-----------------------------------------------------------------------------
# The bootstrap bias is the difference between the mean bootstrap estimates
# and the original estimates
#-----------------------------------------------------------------------------

boot.bias <- colMeans(store.matrix, na.rm=T) - original.estimates

#-----------------------------------------------------------------------------
# Basic bootstrap CIs based on the empirical quantiles
#-----------------------------------------------------------------------------

conf.mat <- matrix(apply(store.matrix, 2 ,quantile, c(0.025, 0.975), na.rm=T),
ncol=2, byrow=TRUE)
colnames(conf.mat) <- c("95%-CI Lower", "95%-CI Upper")

这是我们的汇总表:

#-----------------------------------------------------------------------------
# Set up summary data frame
#-----------------------------------------------------------------------------

summary.frame <- data.frame(mean=boot.means, median=boot.medians,
sd=boot.sds, bias=boot.bias, "CI_lower"=conf.mat[,1], "CI_upper"=conf.mat[,2])

summary.frame

      mean  median       sd       bias CI_lower CI_upper
1   1.2998  1.3013  0.39674 -0.0712912  0.51960   2.0605
2   0.2527  0.2486  0.03208 -0.0034461  0.19898   0.3229
3  -1.5662 -1.5572  0.26220 -0.0509239 -2.12900  -1.0920
4   0.2005  0.1986  0.01949  0.0049019  0.16744   0.2418
5   0.9544  0.9252  0.48915  0.0753405  0.03493   1.9025
6   0.2702  0.2688  0.02043  0.0009583  0.23272   0.3137
7  -0.8997 -0.9082  0.22174  0.0856793 -1.30664  -0.4380
8   0.1789  0.1781  0.01667  0.0029513  0.14494   0.2140
9   2.0683  1.7719  1.59102  0.4654898  0.44150   8.0471
10  4.0209  0.8270 13.23434  3.1845710  0.58114  57.6417
11 -2.0969 -1.6717  1.56311 -0.4306844 -8.43440  -1.1156
12  3.8660  0.6435 13.27525  3.1870642  0.33631  57.6062

一些解释

  • 引导程序估计值的平均值与原始估计值之间的差是输出的所谓的“偏差” boot
  • 所谓的boot“标准误差” 的输出是自举估计的标准偏差

从输出进行比较boot

#-----------------------------------------------------------------------------
# Compare with boot output and confidence intervals
#-----------------------------------------------------------------------------

set.seed(10)
res <- boot(zinb, f, R = 2000, parallel = "snow", ncpus = 4)

res

Bootstrap Statistics :
       original       bias    std. error
t1*   1.3710504 -0.076735010  0.39842905
t2*   0.2561136 -0.003127401  0.03172301
t3*  -1.5152609 -0.064110745  0.26554358
t4*   0.1955916  0.005819378  0.01933571
t5*   0.8790522  0.083866901  0.49476780
t6*   0.2692734  0.001475496  0.01957823
t7*  -0.9853566  0.083186595  0.22384444
t8*   0.1759504  0.002507872  0.01648298
t9*   1.6031354  0.482973831  1.58603356
t10*  0.8365225  3.240981223 13.86307093
t11* -1.6665917 -0.453059768  1.55143344
t12*  0.6793077  3.247826469 13.90167954

perc.cis <- matrix(NA, nrow=dim(res$t)[2], ncol=2)
    for( i in 1:dim(res$t)[2] ) {
  perc.cis[i,] <- boot.ci(res, conf=0.95, type="perc", index=i)$percent[4:5] 
}
colnames(perc.cis) <- c("95%-CI Lower", "95%-CI Upper")

perc.cis 

      95%-CI Lower 95%-CI Upper
 [1,]      0.52240       2.1035
 [2,]      0.19984       0.3220
 [3,]     -2.12820      -1.1012
 [4,]      0.16754       0.2430
 [5,]      0.04817       1.9084
 [6,]      0.23401       0.3124
 [7,]     -1.29964      -0.4314
 [8,]      0.14517       0.2149
 [9,]      0.29993       8.0463
[10,]      0.57248      56.6710
[11,]     -8.64798      -1.1088
[12,]      0.33048      56.6702

#-----------------------------------------------------------------------------
# Our summary table
#-----------------------------------------------------------------------------

summary.frame

      mean  median       sd       bias CI_lower CI_upper
1   1.2998  1.3013  0.39674 -0.0712912  0.51960   2.0605
2   0.2527  0.2486  0.03208 -0.0034461  0.19898   0.3229
3  -1.5662 -1.5572  0.26220 -0.0509239 -2.12900  -1.0920
4   0.2005  0.1986  0.01949  0.0049019  0.16744   0.2418
5   0.9544  0.9252  0.48915  0.0753405  0.03493   1.9025
6   0.2702  0.2688  0.02043  0.0009583  0.23272   0.3137
7  -0.8997 -0.9082  0.22174  0.0856793 -1.30664  -0.4380
8   0.1789  0.1781  0.01667  0.0029513  0.14494   0.2140
9   2.0683  1.7719  1.59102  0.4654898  0.44150   8.0471
10  4.0209  0.8270 13.23434  3.1845710  0.58114  57.6417
11 -2.0969 -1.6717  1.56311 -0.4306844 -8.43440  -1.1156
12  3.8660  0.6435 13.27525  3.1870642  0.33631  57.6062

将“ bias”列和“ std。error”列与我们自己的摘要表中的“ sd”列进行比较。我们的95%置信区间与boot.ci使用百分位数方法计算的置信区间非常相似(尽管不是全部:请看一下索引为9的参数的下限)。


感谢您的详细答复。您基本上是在说系数是所生成的2000组系数的平均值吗?
zgall1

4
Ť

“基本思想是,您将样本视为总体,并通过替换反复从中抽取新样本”-如何确定新样本的大小?
Sinusx

1
@Sinusx通常,绘制的样本与原始样本的大小相同。关键思想是抽取样本进行替换。因此,原始样本中的某些值将被绘制多次,而有些值则根本不会被绘制。
COOLSerdash '17

6

您应该关注boot作为“统计”参数传递给的函数,并注意其构造方式。

f <- function(data, i) {
  require(pscl)
  m <- zeroinfl(count ~ child + camper | persons,
    data = data[i, ], dist = "negbin",
    start = list(count = c(1.3711, -1.5152, 0.879), zero = c(1.6028, -1.6663)))
  as.vector(t(do.call(rbind, coef(summary(m)))[, 1:2]))
}

“ data”参数将接收整个数据帧,但“ i”参数将接收由“ boot”生成并取自1:NROW(data)的行索引的样本。从该代码中可以看到,然后使用“ i”创建一个新样本,该样本将传递到zeroinl,然后仅返回结果的选定部分。

假设“ i”为{1,2,3,3,3,6,7,7,10}。“ [”函数将仅返回包含行3的3个副本和行7的2个副本的那些行。这将是单个zeroinl()计算的基础,然后系数将boot作为该过程的复制结果返回。此类重复的数量由“ R”参数控制。

由于statistic在这种情况下仅返回回归系数,因此boot函数将这些累积系数作为“ t”的值返回。其他引导程序包功能可以执行进一步的比较。

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.