首页 > 解决方案 > 跨多个列滚动相关性,其中一些具有 NA?

问题描述

我有以下数据集,我试图在 x、y、z、a 之间进行 3 天滚动关联。所以代码应该做 xy、xz、xa、yx、yz、ya 等的滚动相关。此外,正如您在下面看到的,y 和 a 的数据是不完整的,但我希望从它们第一次具有值的日期(即 id 3 和 id 4)开始对它们进行滚动相关。

我应该如何做到这一点?不知道从哪里开始...

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

我能够从堆栈中找到这组代码,但它只有助于找到第一列而不是所有列的答案

rollapplyr(x, 5, function(x) cor(x[, 1], x[, -1]), by.column = FALSE)

标签: r

解决方案


创建一个仅包含所需列的数据框,然后使用rollapplyrwith corcor接受一个use=参数,该参数指定如何处理缺失值。查看?cor它可以采用的值,因为您可能希望也可能不希望使用我们在下面使用的值。

结果r是一个矩阵,其第 i 行描述了以dat2row 结尾并包括 row 的 5 行的相关矩阵i。也就是说,matrix(r[i, ], 4, 4) 是 的相关矩阵dat2[i-(4:0), ]

我们还可以创建ar一个 3d 数组,它是ar[i,,]dat2 的 5 行的相关矩阵,以 row 结尾并包括 row i

也就是说,对于 5、...、nrow(dat2) 中的每个 i,这些都是相等的。(r 的前 4 行都是 NA,因为不存在通向这些行的 5 行。)

1. cor(dat2[i-(4:0), ], use = "pairwise")
2. matrix(r[i, ], 4, 4)
3. ar[i,,]

我们在下面对 i=5 的这些等价性进行检查。

library(zoo)
w <- 5
dat2 <- dat[c("x", "y", "z", "a")]
nr <- nrow(dat2)
nc <- ncol(dat2)


r <- rollapplyr(dat2, w, cor, use = "pairwise", by.column = FALSE, fill = NA)
colnames(r) <- paste(names(dat2)[c(row(diag(nc)))], 
                     names(dat2)[c(col(diag(nc)))], sep = ".")

ar <- array(r, c(nr, nc, nc), 
  dimnames = list(NULL, names(dat2), names(dat2)))

# run some checks

cor5 <- cor(dat2[1:w, ], use = "pairwise") # cor of 1st w rows

# same except for names
all.equal(unname(cor5), matrix(r[w, ], nc))
## [1] TRUE

all.equal(cor5, ar[w,,])
## [1] TRUE

上面显示了一个矩阵,其行是相关矩阵和一个 3d 数组,其切片是相关矩阵。输出的另一种可能性是创建相关矩阵列表。

lapply(1:nr, function(i) {
  if (i >= w) cor(dat2[i-((w-1):0), ], use = "pairwise")
})

推荐阅读