首页 > 解决方案 > 使用 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

标签: rdplyr

解决方案


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

推荐阅读