跨行数据帧中加权平均值的引导

Bootstrap of weighted mean in dataframe across rows

提问人:Anne 提问时间:12/9/2021 最后编辑:Anne 更新时间:12/29/2021 访问量:170

问:

我有一个关于加权均值自举的问题。

根据我的数据结构,我有时想跨列引导,有时跨行引导。

在另一篇博文(R 中的引导加权平均值)中,提供了以下代码来引导跨列的加权平均值

library(boot)

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

results_qsec <- boot(data= mtcars[, 7, drop = FALSE], 
                     statistic = samplewmean, 
                     R=10000, 
                     j = mtcars[, 6 , drop = FALSE])

这非常有效(检查:weighted.mean(mtcars[,7], mtcars[,6])。

但是,我现在还想跨行引导,我认为以下代码可以做到这一点:

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

results_qsec2 <- boot(data= mtcars[7,  , drop = FALSE], 
                     statistic = samplewmean2, 
                     R=10000, 
                     j = mtcars[6,  , drop = FALSE])

不幸的是,这不起作用,我不知道我应该改变什么?

提前非常感谢。

r for 循环 引导 权平均

评论

0赞 camille 12/10/2021
如果您有 2 个问题,您可能应该将它们分成 2 个帖子。您可以将第二个链接返回到第一个链接作为参考,但它们都应该是独立的

答:

0赞 JKupzig 12/10/2021 #1

更新

我认为最简单的方法是将行值放入向量中并执行引导。

你可以像这样定义你的引导函数:

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

然后像这样应用引导程序:

results_qsec2 <- boot(data= as.vector(t(mtcars[,  7, drop = FALSE])), 
                        statistic = samplewmean, 
                        R=100, 
                        j = as.vector(t(mtcars[,  6, drop = FALSE])))

如果这不是您想要的,您可以考虑在不使用任何包的情况下执行引导程序。那么一个好的起点是使用我首先建议的重采样创建一个 for 循环(或 lapply,...):

elements2use <- sample(1:length(d), length(d), replace=T)

评论

0赞 Anne 12/20/2021
感谢您的回复!但是你能在以下方面提供帮助吗,因为我不完全确定代码是否正确?因为如果我比较 results_qsec2 输出中给出的“原始”值,它与使用 不同,并且我希望这些结果会相同?weighted.mean(x=mtcars[,7], w=mtcars[,6])
0赞 JKupzig 12/29/2021
立即查看我更新的答案。