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

R实现18项幸福感各组合得分与政治倾向的相关系数计算

实现方案

核心思路

你提到的expand()函数是用于生成已有变量的所有水平组合,不是用来生成列的子集组合,因此确实不符合需求。我们可以通过combn生成所有幸福感题项的非空组合,再批量计算每个组合的平均幸福感得分与政治倾向的相关系数,全程可以用tidyverse生态的函数实现,逻辑清晰且易扩展。

完整代码

首先加载依赖包并构造示例数据:

library(tidyverse)

# 构造和你需求一致的示例数据集
set.seed(123) # 固定随机种子方便复现
df <- as.data.frame(matrix(rnorm(190), ncol = 19))
colnames(df) <- paste0("v", 1:19) # v1-v18为幸福感题项,v19为政治倾向

然后生成所有非空题项组合:

# 提取所有幸福感题项名称
wb_items <- paste0("v", 1:18)

# 生成1到18个题项的所有非空组合,拉平为一维列表
all_combinations <- map(1:18, \(k) combn(wb_items, k, simplify = FALSE)) |> 
  flatten()

最后批量计算相关系数,输出结构化结果:

# 批量计算所有组合的相关系数
cor_results <- map_dfr(all_combinations, \(comb) {
  # 计算当前组合的平均幸福感得分
  avg_wb <- rowMeans(df[, comb], na.rm = TRUE)
  # 计算与政治倾向的相关系数
  cor_val <- cor(avg_wb, df$v19, use = "pairwise.complete.obs")
  # 返回结构化结果
  tibble(
    item_num = length(comb),
    items = paste(comb, collapse = ","),
    cor = cor_val
  )
})

结果验证

运行以下代码可以确认结果数量符合预期:

# 总组合数应为2^18 -1 = 262143(排除空组合)
nrow(cor_results)

大样本优化方案

如果你的样本量超过10000,直接计算26万次rowMeans和cor会比较慢,可以通过预计算协方差矩阵来大幅提速:

# 预计算18个幸福感题项和v19的协方差矩阵
cov_mat <- cov(cbind(df[, wb_items], df$v19), use = "pairwise.complete.obs")
wb_cov <- cov_mat[1:18, 1:18]
wb_v19_cov <- cov_mat[1:18, 19]
v19_var <- cov_mat[19, 19]

# 快速计算组合相关,无需逐次计算行平均
cor_results_fast <- map_dfr(all_combinations, \(comb) {
  idx <- which(wb_items %in% comb)
  k <- length(idx)
  # 组合平均得分的方差
  mean_var <- sum(wb_cov[idx, idx]) / k^2
  # 组合平均得分与v19的协方差
  mean_cov <- sum(wb_v19_cov[idx]) / k
  # 计算相关系数
  cor_val <- mean_cov / sqrt(mean_var * v19_var)
  tibble(
    item_num = k,
    items = paste(comb, collapse = ","),
    cor = cor_val
  )
})

这个优化方案的运算速度比逐次计算行平均快5-10倍,非常适合大样本场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:57:03