如何使用tidyverse计算横截面相关性的时间序列均值
面板数据横截面相关系数时间均值计算方案
现有代码问题
- 分组字段错误:你提供的数据集仅包含
year时间标识,不存在Month列,原代码直接分组会报错 - 未对分组返回的相关矩阵做结构化整理:
group_map默认返回不带分组标识的列表,无法后续按变量对聚合时间维度均值 select_if(is.numeric)属于dplyr已弃用语法,建议替换为select(where(is.numeric))
完整实现代码
library(tidyverse) library(corrr) # 构造示例面板数据 data <- tribble( ~year, ~V1, ~V2, ~V3, ~misc_var, 2018, 5, 6, 5, "a", 2018, 4, 6, 4, "b", 2018, 3, 2, 3, NA, 2013, 5, 8, 2, "4", 2013, 6, 3, 8, "8", 2013, 4, 7, 5, NA ) # 第一步:按年分组计算每年横截面皮尔逊相关,同时保留年份标识 yearly_corr <- data %>% select(where(is.numeric)) %>% group_by(year) %>% group_modify(~ correlate(.x, quiet = TRUE) %>% stretch()) # stretch将相关矩阵转为变量对长表 # 第二步:按变量对分组,计算时间维度的相关系数均值 mean_corr <- yearly_corr %>% group_by(x, y) %>% summarise( time_mean_corr = mean(r, na.rm = TRUE), .groups = "drop" ) # 查看最终结果 print(mean_corr)
代码逻辑说明
- 按时间维度分组计算每一期横截面相关系数时,通过
stretch()将宽格式相关矩阵转为「变量对-相关系数」的长表结构,保留时间分组标识 - 按变量对分组后对所有时间点的相关系数求均值,即可得到最终的时间序列平均相关结果
- 若你的实际数据时间粒度为月度,仅需将
group_by(year)替换为group_by(Month)即可适配
内容的提问来源于stack exchange,提问作者jeetkamal
相关产品推荐
相关产品推荐

