基于显著边加权的皮尔逊相关矩阵构建技术咨询
带权重的皮尔逊相关矩阵计算方案
看起来你需要基于观测权重计算变量间的加权皮尔逊相关矩阵,或者给已有的相关系数赋予对应权重。我帮你梳理两种常见场景的解决方案,结合你提供的R代码来调整:
先修正你现有代码的小问题
你的代码里生成y向量时没有初始化,会报错,先调整一下:
m <- matrix(data = rnorm(36), nrow = 6, ncol = 6) x <- LETTERS[1:6] y <- c() # 先初始化空向量 for (a in 1:length(x)) y <- c(y, paste("c", a, sep = "")) mCor <- cor(t(m))
场景1:基于观测权重计算加权皮尔逊相关矩阵
如果你的w是每个观测的权重(每个列对应一个观测,所以权重向量长度应该是6,而不是36),我们可以用自定义函数或者wCorr包来实现:
方法1:自定义加权皮尔逊相关函数
先写一个计算两个向量加权相关的函数,再遍历所有变量对生成矩阵:
# 自定义加权皮尔逊相关函数 weighted_pearson <- function(x_vec, y_vec, weights) { # 计算加权均值 w_sum <- sum(weights) mu_x <- sum(weights * x_vec) / w_sum mu_y <- sum(weights * y_vec) / w_sum # 计算加权协方差和标准差 cov_weighted <- sum(weights * (x_vec - mu_x) * (y_vec - mu_y)) / w_sum sd_x_weighted <- sqrt(sum(weights * (x_vec - mu_x)^2) / w_sum) sd_y_weighted <- sqrt(sum(weights * (y_vec - mu_y)^2) / w_sum) # 返回加权相关系数,避免除以0的情况 if (sd_x_weighted == 0 || sd_y_weighted == 0) { return(NA) } else { return(cov_weighted / (sd_x_weighted * sd_y_weighted)) } } # 生成观测权重(长度6,对应6个观测) w <- sample(x = seq(0.5, 0.8, by = 0.01), size = 6) # 生成加权相关矩阵 weighted_cor_matrix <- outer(1:nrow(m), 1:nrow(m), function(i, j) weighted_pearson(m[i, ], m[j, ], w)) # 给矩阵添加变量名 rownames(weighted_cor_matrix) <- x colnames(weighted_cor_matrix) <- x # 查看结果 print(weighted_cor_matrix)
方法2:用wCorr包简化计算
如果你不想自己写函数,可以用wCorr包的weightedCorr函数,它支持输入等长的x、y、权重向量:
# 安装并加载包(如果没安装过) # install.packages("wCorr") library(wCorr) # 初始化空矩阵 weighted_cor_matrix <- matrix(NA, nrow = nrow(m), ncol = nrow(m)) rownames(weighted_cor_matrix) <- x colnames(weighted_cor_matrix) <- x # 循环计算每一对变量的加权相关 for (i in 1:nrow(m)) { for (j in 1:nrow(m)) { weighted_cor_matrix[i, j] <- weightedCorr( x = m[i, ], y = m[j, ], weights = w, method = "pearson" ) } } # 查看结果 print(weighted_cor_matrix)
场景2:给已有相关矩阵的每个系数赋予对应权重
如果你的w是每个变量对的权重(也就是36个元素对应6x6相关矩阵的每个位置),直接把w转成矩阵后和原相关矩阵相乘即可:
# 生成变量对权重(36个元素) w <- sample(x = seq(0.5, 0.8, by = 0.01), size = 36) # 转成6x6权重矩阵 w_matrix <- matrix(w, nrow = 6, ncol = 6) # 计算加权后的相关矩阵 weighted_mCor <- mCor * w_matrix # 添加变量名 rownames(weighted_mCor) <- x colnames(weighted_mCor) <- x # 查看结果 print(weighted_mCor)
需要注意的是:
- 如果是计算观测加权的相关系数,权重向量长度必须和每个变量的观测数一致(这里是6);
- 如果是给已有相关系数加权,权重向量长度要和相关矩阵的元素总数一致(这里是36)。
内容的提问来源于stack exchange,提问作者abbas786
相关产品推荐
相关产品推荐

