r - 使用 rollapply 在 R 中计算滚动成对相关性时出错
问题描述
我在 R 中有以下数据框
data <- structure(list(Date = structure(c(18352, 18382, 18413, 18443,
18474, 18505, 18535, 18566, 18596, 18627), class = "Date"), `Item 1` = c(1.51832975855564,
0.37616251475745, 0.235532024125229, 0.709469777058103, 1.02933768602063,
1.32152918133017, 1.40923563776068, 1.20359679507398, 1.16086943030891,
1.28886722075181), `Item 2` = c(2.14545986795986, 2.96713831051805,
3.07870599806344, 3.23176921561792, 4.15485377279825, 4.90266273750217,
5.01422259880169, 4.41057753970351, 4.99683267473077, 5.26300032931175
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))
我想计算我的数据框中两列之间的滚动相关性。当我尝试使用rollapply
如下
correlation <- rollapply(data, width=3, function(x) cor(x[,2],x[,3]), by.column=FALSE)
我收到以下错误。我尝试使用 将两列设置为数字格式as.numeric
,但这并没有解决问题。关于如何解决这个问题的任何想法?
Error in cor(x[, 2], x[, 3]) : 'x' must be numeric
解决方案
1) rollapply
将数据强制转换为矩阵,并且由于 的第一列data
不是数字,它最终会传递一个字符矩阵。省略第一列,它将起作用。此外,您可能希望或不希望rollapplyr
在末尾使用 r 以使用右对齐窗口(默认为居中)和 fill = NA(默认为无填充)来填充结果以具有相同的长度作为数据中的行数。我们在这里展示了这些,以防万一那是你想要的。
cor2 <- function(x, ...) cor(x[, 1], x[, 2], ...) # scalar cor of 1st 2 cols
rollapplyr(data[-1], 3, cor2, by.column = FALSE, fill = NA)
## [1] NA NA -0.9999543 0.7475923 0.8759702 0.9994088
## [7] 0.9947371 0.9652525 0.3777091 0.4791595
2)或者如果你想要一个没有 NA 填充的居中窗口,那么rollapply
在最后使用没有 r 并省略 fill= 参数。
rollapply(data[-1], 3, cor2, by.column = FALSE)
## [1] -0.9999543 0.7475923 0.8759702 0.9994088 0.9947371 0.9652525 0.3777091
## [8] 0.4791595
3)另一种可能性是使用动物园对象作为输入,将显示的动物园对象作为输出。zoo 对象将时间索引存储为属性而不是列,因此我们可以按原样传递它。
z <- read.zoo(data)
rollapply(z, 3, cor2, by.column = FALSE)
## 2020-04-30 2020-05-31 2020-06-30 2020-07-31 2020-08-31 2020-09-30 2020-10-31
## -0.9999543 0.7475923 0.8759702 0.9994088 0.9947371 0.9652525 0.3777091
## 2020-11-30
## 0.4791595
笔记
与滚动窗口无关的另一点是,输入似乎使用等于该月最后一天的日期来表示年/月,并且可以使用 yearmon 直接表示一年和一个月而没有一天班级。这样的类在内部将日期表示为年 + 分数,其中 Jan = 0,Feb = 1/12,...,Dec = 11/12,显示显示月份和年份,并且与使用不规则的日期不同,它会定期间隔由于一个月的天数不同。
data$Date <- as.yearmon(data$Date)
给予:
# A tibble: 10 x 3
Date `Item 1` `Item 2`
<yearmon> <dbl> <dbl>
1 Mar 2020 1.52 2.15
2 Apr 2020 0.376 2.97
3 May 2020 0.236 3.08
4 Jun 2020 0.709 3.23
5 Jul 2020 1.03 4.15
6 Aug 2020 1.32 4.90
7 Sep 2020 1.41 5.01
8 Oct 2020 1.20 4.41
9 Nov 2020 1.16 5.00
10 Dec 2020 1.29 5.26
推荐阅读
- performance - 安卓工作室打不开
- c# - 如何为多租户应用程序共享和缓存 DLL
- java - 如何在 JList (java netbeans) 中添加一个复选框?
- r - 如何直接引用名称以字符串对象形式给出的 R 对象?
- c - 此函数中缺少 free() 导致内存泄漏
- android - 在后台从 Android 应用程序发布我的 Facebook 页面的帖子
- prometheus - 使用 Prometheus 监控短暂的 python 批处理作业流程
- git - 提交时为 git 命令添加一个 shell
- angularjs - ngx-admin 在新页面组件中添加 mapbox
- sharepoint - 添加链接 Sharepoint 2013 时如何更改默认值