含缺失值的多列数据如何计算3天窗口滚动相关系数
多字段3天滚动两两相关系数实现方案
完整可运行代码
# 加载依赖包 library(zoo) # 构造示例数据 set.seed(42) n <- 10 dat <- data.frame(id=1:n, date=seq.Date(as.Date("2020-12-22"), as.Date("2020-12-31"), "day"), x=rnorm(n), y=rnorm(n), z=rnorm(n), a=rnorm(n)) dat$y[1:2] <- NA dat$a[1:3] <- NA # 提取需要计算相关的数值字段 num_cols <- dat[, c("x", "y", "z", "a")] # 生成所有两两变量组合(如需xy和yx分开计算,可替换为expand.grid(colnames(num_cols), colnames(num_cols))再过滤变量名相同的行) var_pairs <- combn(colnames(num_cols), 2, simplify = FALSE) # 遍历所有配对计算3天右对齐滚动相关 roll_cor_res <- lapply(var_pairs, function(p) { roll_cols <- num_cols[, p] # 滚动计算逻辑:窗口内有效配对数≥3时返回相关系数,否则返回NA cor_vals <- rollapplyr(roll_cols, width = 3, function(w) { complete_cnt <- sum(complete.cases(w)) if (complete_cnt < 3) return(NA_real_) cor(w[,1], w[,2], use = "pairwise.complete.obs") }, by.column = FALSE) # 按规则命名结果列 setNames(data.frame(cor_vals), paste0("cor_", p[1], "_", p[2])) }) # 合并相关系数结果与原始数据 final_res <- cbind(dat, do.call(cbind, roll_cor_res))
逻辑说明
- 配对覆盖:默认生成无重复的两两组合,若需要保留xy、yx这类对称结果,替换
combn生成配对的代码即可 - 缺失值适配:通过
complete.cases判断窗口内两个字段的共同有效样本数,不足3个时返回NA,自动实现从两个字段都有足够有效值的节点开始计算的需求 - 窗口规则:
rollapplyr默认右对齐,符合滚动窗口统计的通用习惯
内容的提问来源于stack exchange,提问作者Westwinter1
相关产品推荐
相关产品推荐

