You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中对不同权重的加权相关性执行Bootstrap抽样?

加权相关性的Bootstrap抽样解决方案

问题场景

需要对x、y变量分别带有不同权重的数据集计算加权相关性,并执行Bootstrap抽样,但原代码调用boot包时出现报错,且未正确利用加权抽样逻辑。

示例数据集:

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)
)

原自定义加权相关系数计算(注:原代码中y的加权均值权重存在笔误,已修正):

library(Hmisc)
# 加权协方差
cov_val = 
    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)

# 加权相关性(修正y的权重参数)
cor_val = cov_val / (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$y_weight))^2 * DF$y_weight) / sum(DF$y_weight)))

原代码错误点

  1. boot包要求statistic函数必须接受两个参数:第一个是原始数据,第二个是Bootstrap抽样的索引向量,原函数仅定义了一个参数,导致报错。
  2. 未使用boot的weights参数实现加权抽样,直接对原始数据等概率抽样,不符合加权Bootstrap的需求。

修正方案

1. 修正统计函数

调整函数结构,使其接受抽样索引参数,基于抽样子集重新计算加权相关性:

weighted_cor = function(data, indices) {
  # 基于抽样索引获取子集
  df_sub = data[indices, ]
  
  # 计算x、y的加权均值
  x_mean = wtd.mean(df_sub$x, w = df_sub$x_weight)
  y_mean = wtd.mean(df_sub$y, w = df_sub$y_weight)
  
  # 加权协方差
  cov_val = sum(((df_sub$x - x_mean) * df_sub$x_weight) * ((df_sub$y - y_mean) * df_sub$y_weight)) / sum(df_sub$x_weight * df_sub$y_weight)
  
  # 加权标准差
  x_sd = sqrt(sum((df_sub$x - x_mean)^2 * df_sub$x_weight) / sum(df_sub$x_weight))
  y_sd = sqrt(sum((df_sub$y - y_mean)^2 * df_sub$y_weight) / sum(df_sub$y_weight))
  
  # 加权相关性
  cor_val = cov_val / (x_sd * y_sd)
  return(cor_val)
}

2. 执行加权Bootstrap抽样

使用boot包时,指定抽样权重(这里采用x和y权重的乘积作为组合权重,可根据研究需求调整):

library(boot)

# 定义抽样权重:x_weight与y_weight的乘积
boot_weights = DF$x_weight * DF$y_weight

# 执行Bootstrap抽样
boot_result = boot(
  data = DF,
  statistic = weighted_cor,
  R = 1000,
  weights = boot_weights
)

# 查看结果
boot_result
plot(boot_result)

说明

  • 抽样权重的选择可根据研究目标调整,比如几何平均、取其中一组权重等,核心是让权重高的观测被抽中的概率更高。
  • 修正后的函数通过indices参数处理Bootstrap抽样的子集,符合boot包的要求。

内容的提问来源于stack exchange,提问作者Anne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:01:10