提问人:Anne 提问时间:12/10/2021 最后编辑:Anne 更新时间:12/11/2021 访问量:156
如何在 r 的循环中引导加权均值
How to bootstrap weighted mean in a loop in r
问:
我想在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
但这行不通。第一个输出甚至不正确。我怀疑该代码不能与两个迭代器一起使用:一个用于循环列,另一个用于替换采样。
我希望任何人都能提供一些帮助。
答:
1赞
danlooo
12/10/2021
#1
这将计算表中每列的所有引导程序的标准偏差,加权为 。mtcarsdata
mtcarsweights
由于我们可以一步计算结果,因此我们可以使用和朋友(这里:apply
purrr: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)
评论
apply
map