如何在 r 的循环中引导加权均值

How to bootstrap weighted mean in a loop in r

提问人:Anne 提问时间:12/10/2021 最后编辑:Anne 更新时间:12/11/2021 访问量:156

问:

我想在for循环中运行加权均值的引导程序(我认为我不能使用“apply”,因为它涉及加权均值)。我只需要将生成的标准误差存储在数据帧中。另一篇文章提供了如何在 bootstrap 中计算加权均值(R 中的 bootstrap 加权均值)的代码,并且工作完美:

library(boot)
 
mtcarsdata = mtcars #dataframe for data 
mtcarsweights = rev(mtcars) #dataframe for weights

samplewmean <- function(d, i, j) {
  d <- d[i, ]
  w <- j[i, ]
  return(weighted.mean(d, w))   
}

results_qsec <- sd(boot(data= mtcarsdata[, 6, drop = FALSE], 
                     statistic = samplewmean, 
                     R=10000, 
                     j = mtcarsweights[, 6 , drop = FALSE])[[2]], na.rm=T)
results_qsec

为了然后在循环中运行它,我尝试了:

outputboot = matrix(NA, nrow=11, ncol=1)
for (k in 1:11){
  outputboot[1,k] = sd(boot(data= mtcarsdata[, k, drop = FALSE], 
                       statistic = samplewmean, 
                       R=10000, 
                       j = mtcarsweights[, k, drop = FALSE])[[2]], na.rm=T)
}
outputboot

但这行不通。第一个输出甚至不正确。我怀疑该代码不能与两个迭代器一起使用:一个用于循环列,另一个用于替换采样。

我希望任何人都能提供一些帮助。

r for 循环 统计 - 引导加 权平均值

评论

0赞 deschen 12/10/2021
所以你基本上不仅想引导一列,而且想引导所有mtcars列并得到它们的加权平均值?
0赞 danlooo 12/10/2021
只要你能计算出 sth。在每列的一个步骤中,您可以使用 和 朋友。加权均值应该如此applymap

答:

1赞 danlooo 12/10/2021 #1

这将计算表中每列的所有引导程序的标准偏差,加权为 。mtcarsdatamtcarsweights

由于我们可以一步计算结果,因此我们可以使用和朋友(这里:applypurrr:map_dbl)

library(boot)
library(purrr)

set.seed(1337)

mtcarsdata <- mtcars # dataframe for data
mtcarsweights <- rev(mtcars) # dataframe for weights

samplewmean <- function(d, i, j) {
  d <- d[i, ]
  w <- j[i, ]
  return(weighted.mean(d, w))
}

mtcarsdata %>%
  ncol() %>%
  seq() %>%
  map_dbl(~ {
    # .x is the number of the current column
    sd(boot(
      data = mtcarsdata[, .x, drop = FALSE],
      statistic = samplewmean,
      R = 10000,
      j = mtcarsweights[, .x, drop = FALSE]
    )[[2]], na.rm = T)
  })
#>  [1]  0.90394218  0.31495232 23.93790468  6.34068205  0.09460257  0.19103196
#>  [7]  0.33131814  0.07487754  0.07745781  0.13477355  0.27240347

创建于 2021-12-10 由 reprex 软件包 (v2.0.1)