首页 > 解决方案 > 选择每个 bootstrap 样本的样本大小

问题描述

我有一个数据框,在 29 个变量(列)中有大约 1700 个观察值(行),我必须选择其中 7 个观察值的混合,其中(每个变量的)加权平均值与加权平均值(的1700 个观测值中的每个变量)。我尝试使用 boot() 引导 R 中的数据,目的是获得几种可能的混合物(计算所有可能的混合物需要很长时间),但我未能从整个数据集中仅选择 7 个观察值的样本。我知道自举通常会生成与原始数据集大小相同的样本。这是我尝试过的代码:

functionWAM<-function(data, i, p){
  data<-data[sample(nrow(data), p),];
  SAM<-weighted.mean(data[i,3], data[i,1]); 
  CAM<-weighted.mean(data[i,4], data[i,1]);
  return(cbind(SAM,CAM))
}

WAMresults<-boot(datamatrix, statistic=functionWAM, R=1000, p=7)

标签: rbootstrappingstatistics-bootstrapsample-size

解决方案


引导将通过替换完成,因此您有可能在 7 个值中获得两次相同的观察结果。如果您不希望这样做,您基本上可以创建自己的函数来执行此操作(实际上,您已经拥有它)。下面的函数返回所选七个观测值的加权平均值,但也作为向量的属性返回产生结果的观测数。

functionWAM <- function(data, p){
  obs <- sample(1:nrow(data), 7, replace=FALSE)
  SAM<-weighted.mean(data[obs,3], data[obs,1]) 
  CAM<-weighted.mean(data[obs,4], data[obs,1])
  out <- structure(c(SAM, CAM), obs = obs)
  return(out)
}

这是一个假设的例子。它用于replicate()进行多次迭代,在本例中为 3。

dat <- data.frame(weight=runif(100,.5,1), x= rnorm(100), y=rnorm(100), z = rnorm(100))

reps <- replicate(3, functionWAM(dat, 7), simplify=FALSE)
reps
# [[1]]
# [1] 0.6418563 0.1982215
# attr(,"obs")
# [1] 54 83 12 26 51 35 50
# 
# [[2]]
# [1]  0.8127784 -0.6235828
# attr(,"obs")
# [1] 47  8 35 16 87 26 92
# 
# [[3]]
# [1] -0.20686227  0.09357421
# attr(,"obs")
# [1] 89 99 62 69 77 91 92

推荐阅读