如何在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)))
原代码错误点
boot包要求statistic函数必须接受两个参数:第一个是原始数据,第二个是Bootstrap抽样的索引向量,原函数仅定义了一个参数,导致报错。- 未使用
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
相关产品推荐
相关产品推荐

