R中列表之间的滚动相关性
我有两个列表,listA和listB,我想使用大小为4的滚动窗口来计算它们之间的相关性R中列表之间的滚动相关性,r,list,correlation,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
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])
,这意味着我将有5个值用于列a的listA和listB之间的相关性。一旦对列a进行了计算,我将对列B、C和D进行同样的计算
我以前使用“rollapplyr”实现了这一点,但我正在处理的对象是一个XTS对象,而不是两个单独的对象,这对于我简单的小大脑来说更容易理解
'result <- rollapplyr(XTSobject, 4, cor, by.column = FALSE)'
'result让我随机生成listA
和listB
并处理它们:
listA<-data.frame(matrix(rnorm(32), c(8,4)))
listB<-data.frame(matrix(rnorm(32), c(8,4)))
通过使用apply
系列,同样可以在不循环的情况下实现。让我随机生成listA
和listB
,并对它们进行操作:
listA<-data.frame(matrix(rnorm(32), c(8,4)))
listB<-data.frame(matrix(rnorm(32), c(8,4)))
通过使用apply
系列,同样可以在不循环的情况下实现。使用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
set.seed(1234)
listA使用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
set.seed(1234)
你能让listA和listB重现吗?它们是数据帧吗?你能让listA和listB重现吗?它们是数据帧吗?当处理伪随机数(如rnorm
)时,您可以在脚本的开头添加set.seed()
,以获得可复制的结果。感谢Lukasz,我能问一下如何使用apply实现同样的效果吗?需要嵌套的apply吗?看看Jimbou的答案。它包含nicedo.call
-sapply
combo:)当处理伪随机数(如rnorm
)以获得可复制的结果时,您可以始终在脚本的开头添加set.seed()
),谢谢Lukasz,我可以问一下如何使用apply实现同样的效果,这是一个嵌套的应用程序吗?看看Jimbou的答案。它包含nicedo.call
-sapply
combo:)
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