如何在 R 中对加权相关进行引导?

How to perform bootstrap on weighted correlation in R?

提问人:Anne 提问时间:2/13/2023 更新时间:2/13/2023 访问量:37

问:

我正在尝试在 R 中引导加权相关性,不同的数据流具有单独的权重。

一些示例数据:

DF = data.frame(
  x = c(-0.3, 0.3, -0.18, 0.02, 0.07, 0.11, 0.20, 0.8, 0.3, -0.4),
  x_weight = c(50, 40, 70, 5, 15, 30, 32, 13, 9, 19),
  y = c(-0.6, 0.25, 0.1, 0.3, 0.3, -0.05, -0.5, 1, 0.05, -0.6),
  y_weight = c(70, 8, 10, 39, 9, 49, 90, 77, 23, 75)
)
DF

因为 x 和 y 的权重不同,我不能使用 cov.wt,但我需要自行定义公式(感谢这篇文章中的答案:使用 R 中每个变量的不同向量权重计算加权相关性)

首先计算加权协方差

library(Hmisc)
cov = 
    sum(((DF$x - wtd.mean(x=DF$x, w=DF$x_weight)) * DF$x_weight) * ((DF$y - wtd.mean(x=DF$y, w=DF$y_weight)) * DF$y_weight))  / 
    sum(DF$x_weight * DF$y_weight)

然后计算加权相关性

cor = cov / (sqrt(sum((DF$x - wtd.mean(x=DF$x, w=DF$x_weight))^2 * DF$x_weight) / sum(DF$x_weight)) *  
                 sqrt(sum((DF$y - wtd.mean(x=DF$y, w=DF$x_weight))^2 * DF$y_weight) / sum(DF$y_weight)))

这可行,但我想引导加权相关性,我没有成功。

这是我的尝试:

weightedcorrelation = function(DF){
  cov = sum(((DF$x - wtd.mean(x=DF$x, w=DF$x_weight)) * DF$x_weight) * ((DF$y - wtd.mean(x=DF$y, w=DF$y_weight)) * DF$y_weight))  / sum(DF$x_weight * DF$y_weight)
  cor = cov / (sqrt(sum((DF$x - wtd.mean(x=DF$x, w=DF$x_weight))^2 * DF$x_weight) / sum(DF$x_weight)) * sqrt(sum((DF$y - wtd.mean(x=DF$y, w=DF$x_weight))^2 * DF$y_weight) / sum(DF$y_weight)))
  return(cor)
}
weightedcorrelation(DF)

library(boot)
boot(data = DF[, , drop=F], 
     statistic = weightedcorrelation, 
     R = 1000)

我在统计参数上遇到错误。 此外,boot 可以选择包含 weights 参数,我现在没有使用。

r 相关 重采样 加权

评论


答:

0赞 langtang 2/13/2023 #1

你可以调整你的函数,使它接受两个参数(如果你正在做(这是你正在做的事情,给定你当前的调用),则需要;这两个参数是(数据)和(例如)(索引):weightedcorrelationsim="ordinary"boot()di

weightedcorrelation = function(d,i){
  DF = d[i,]
  cov = sum(((DF$x - wtd.mean(x=DF$x, w=DF$x_weight)) * DF$x_weight) * ((DF$y - wtd.mean(x=DF$y, w=DF$y_weight)) * DF$y_weight))  / sum(DF$x_weight * DF$y_weight)
  cor = cov / (sqrt(sum((DF$x - wtd.mean(x=DF$x, w=DF$x_weight))^2 * DF$x_weight) / sum(DF$x_weight)) * sqrt(sum((DF$y - wtd.mean(x=DF$y, w=DF$x_weight))^2 * DF$y_weight) / sum(DF$y_weight)))
  return(cor)
}

评论

0赞 Anne 2/14/2023
谢谢!您的代码似乎可以正常工作,但我不明白如何?i 是否将原始的 x 和 x_weight(以及 y 和 y_weight)组合放在一起?例如,x = -0.3 在引导程序中是否仍然有 50 的权重?