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

如何自动将协方差矩阵列表转为时变方差、相关系数数据框

自动生成时变方差与相关系数数据框

自动生成时变方差数据框

先获取协方差矩阵的变量个数,再遍历每个变量索引,提取对应对角线元素(方差)并自动命名列:

# 加载所需包(若未加载)
library(dplyr)
library(purrr)

# 获取变量数量
n_vars <- ncol(res.Sigma[[1]])

# 生成时变方差数据框
sample.var <- tibble(X = X) %>%
  bind_cols(
    map_dfc(1:n_vars, function(i) {
      col_name <- paste0("v", i, i)
      tibble(!!col_name := map_dbl(res.Sigma, ~ .x[i, i]))
    })
  )

基础R实现版本:

n_vars <- ncol(res.Sigma[[1]])
sample.var <- data.frame(X = X)
for (i in 1:n_vars) {
  col_name <- paste0("v", i, i)
  sample.var[[col_name]] <- sapply(res.Sigma, function(mat) mat[i, i])
}

自动生成时变相关系数数据框

先生成所有i<j的变量对组合(避免重复计算对称的相关系数),再遍历每个组合计算相关系数并自动命名列:

# 生成所有i<j的变量对
var_pairs <- combn(1:n_vars, 2, simplify = FALSE)

# 生成时变相关系数数据框
sample.corr <- tibble(X = X) %>%
  bind_cols(
    map_dfc(var_pairs, function(pair) {
      i <- pair[1]
      j <- pair[2]
      # 若要严格匹配`r_{i,j}`格式,可将col_name改为paste0("r_{", i, ",", j, "}")
      col_name <- paste0("r_", i, "_", j)
      tibble(!!col_name := map_dbl(res.Sigma, ~ .x[i, j] / sqrt(.x[i, i] * .x[j, j])))
    })
  )

基础R实现版本:

var_pairs <- combn(1:n_vars, 2, simplify = FALSE)
sample.corr <- data.frame(X = X)
for (pair in var_pairs) {
  i <- pair[1]
  j <- pair[2]
  col_name <- paste0("r_", i, "_", j)
  sample.corr[[col_name]] <- sapply(res.Sigma, function(mat) {
    mat[i, j] / sqrt(mat[i, i] * mat[j, j])
  })
}

说明

  • 列命名:默认使用v11、r_1_2这类简洁格式,若需严格使用r_{i,j}格式,可修改col_name的生成逻辑,但后续引用这类列时需要用反引号包裹(如sample.corr$r_{1,2}``)。
  • 兼容性:无论变量数量是4个还是20个,代码都会自动处理对应列数,无需手动编写每一列的提取逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:24:52