r - 跨多个列滚动相关性,其中一些具有 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)
解决方案
创建一个仅包含所需列的数据框,然后使用rollapplyr
with cor
。 cor
接受一个use=
参数,该参数指定如何处理缺失值。查看?cor
它可以采用的值,因为您可能希望也可能不希望使用我们在下面使用的值。
结果r
是一个矩阵,其第 i 行描述了以dat2
row 结尾并包括 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")
})
推荐阅读
- apache-spark - 当您需要进行非常大的随机播放时,火花会中断
- rust-cargo - 如何找到包含的 crate 的 git commit id?
- netsuite - NetSuite 保存的搜索公式,用于获取给定日期的字段值
- php - 通过 QueryBuilder leftJoin 预加载
- javascript - 为什么我会收到“编译 FIRST 时检测到未定义的绑定。”?
- java - java.lang.NullPointerException:尝试在空对象 rfernce 上调用虚拟方法“int androidx.viewpager2.widget.ViewPager2.getCurrentItem()”
- next.js - Next.js firebase-admin 当我构建 go 错误时
- flutter - “未来”类型的值
" 不能分配给“数据”类型的变量 - java - 在 java 数组之外迭代,为什么会这样?
- python - 仅生产中的 AUTH_USER_MODEL 错误:AUTH_USER_MODEL 指的是尚未安装的模型“auth.User”