R中列表之间的滚动关联

时间:2017-06-07 07:36:28

标签: r list correlation

我有两个列表,listA和listB,我想使用4号滚动窗口计算它们之间的相关性。

listA
    A   B   C   D
1)  1   3   4   6
2)  6   9   11  1
3)  1   3   4   5
4)  8   4   5   6
5)  9   9   4   6
6)  1   5   6   6
7)  9   3   6   4
8)  6   7   8   9

listB
    A   B   C   D
1)  1   3   4   3
2)  6   9   5   7
3)  1   1   4   5
4)  7   1   5   6
5)  9   9   3   6
6)  1   5   6   6
7)  9   9   6   4
8)  5   6   4   9

具体来说,我希望使用大小为4的滚动窗口来计算cor(listA[1:4,1],listB[1:4,1]),这意味着对于列A,listA和listB之间的关联将有5个值。一旦对列AI进行了此操作,那么我希望对B,C和D栏做同样的事。

我之前使用'rollapplyr'实现了这个目的,但我正在处理的对象是一个XTS对象而不是两个单独的对象,这对我简单的小脑子来说更容易理解。

'result <- rollapplyr(XTSobject, 4, cor, by.column = FALSE)'

有人可以建议在两个列表之间执行此操作吗?

2 个答案:

答案 0 :(得分:1)

让我随机生成listAlistB并对其进行处理:

listA<-data.frame(matrix(rnorm(32), c(8,4)))
listB<-data.frame(matrix(rnorm(32), c(8,4)))

然后,为您的结果准备数组:

result<-array(NA, c(5,4))
dimnames(result)<-list(paste0(1:5, '-', 4:8), colnames(listA))

现在循环:

for(i in 1:5){
 for (j in 1:4){
  result[i,j]<-cor(listA[i:(i+3),j], listB[i:(i+3),j])
   }
 }

这是我得到的:

result
             X1         X2         X3          X4
1-4 -0.24299058 -0.6359179 -0.3303014  0.46628496
2-5 -0.05606969 -0.9332142 -0.5414745  0.08460162
3-6  0.21371864 -0.5366821 -0.5799187  0.19306623
4-7  0.50005529 -0.4661710  0.2146866  0.49636429
5-8  0.52684198 -0.3768619  0.3599111 -0.93804204

使用apply系列而不循环可以实现同样的效果。

答案 1 :(得分:1)

使用Lukasz Derylo答案中的数据,您也可以尝试:

set.seed(1234)
listA<-data.frame(matrix(rnorm(32), c(8,4)))
listB<-data.frame(matrix(rnorm(32), c(8,4)))
do.call(cbind, Map(function(x, y) sapply(1:5, function(z) cor(x[z:(z+3)], y[z:(z+3)])), listA, listB))
             X1         X2         X3         X4
[1,] -0.2193800  0.3119567 0.31504929  0.7475560
[2,] -0.2669925 -0.4210403 0.43135275  0.9510322
[3,] -0.5657515 -0.6421284 0.82403697  0.2723139
[4,] -0.3829411 -0.6975032 0.09799502 -0.1750354
[5,] -0.8950722 -0.2397563 0.49121024 -0.5240474