如何自动将协方差矩阵列表转为时变方差、相关系数数据框
自动生成时变方差与相关系数数据框
自动生成时变方差数据框
先获取协方差矩阵的变量个数,再遍历每个变量索引,提取对应对角线元素(方差)并自动命名列:
# 加载所需包(若未加载) 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
相关产品推荐
相关产品推荐

