将ccf()与rollapply一起在R中跨变量使用

将ccf()与rollapply一起在R中跨变量使用,r,cross-correlation,rollapply,R,Cross Correlation,Rollapply,我有3列数据,每列10行,如下所示 set.seed(101) inputx <- rnorm(1000,mean = 3,sd=2) inputy <- rnorm(1000,mean = 2,sd=1) inputz <- rnorm(1000,mean = 1,sd=3) example <- cbind(inputx,inputy,inputz) > head(example,10) inputx inputy i

我有3列数据,每列10行,如下所示

set.seed(101)
inputx <- rnorm(1000,mean = 3,sd=2)
inputy <- rnorm(1000,mean = 2,sd=1)
inputz <- rnorm(1000,mean = 1,sd=3)
example <- cbind(inputx,inputy,inputz)

    > head(example,10)
        inputx      inputy     inputz
 [1,] 2.347927  2.50319581  4.4931430
 [2,] 4.104924 -0.09747067 -0.2836938
 [3,] 1.650112  1.90551542  0.9146087
 [4,] 3.428719  3.01454241  4.9332929
 [5,] 3.621538  1.92059955  2.4220865
 [6,] 5.347933  1.74487106  2.9122764
 [7,] 4.237580  2.78095054  7.8622898
 [8,] 2.774531  3.20741266 -1.5977934
 [9,] 4.834057  1.09214734 -0.5482315
[10,] 2.553481  0.59679215  0.5285020
e、 g

正如您所看到的,上面的这个示例只适用于第1列和第2列,但我希望使用滚动窗口方法对所有列都适用

使用rollapply函数可以轻松地处理滚动窗口过程,在该函数中,您可以指定窗口的大小,并将by.column指定为FALSE,这样它就不会对每一列单独应用该函数

如果我想对每一列应用一个函数,比如mean,我可以这样做,但是在所有组合的列之间循环只是让我感到震惊,我无法理解

test <- rollapply(example[,c(1,2)],4,mean, by.column=TRUE)

如果能在所有排列中应用循环,我将不胜感激,我想如果我得到了,我就可以使用rollapply包装器来实现滑动窗口

使用
展开.grid
生成组合列表。然后,您可以执行以下操作:

combos <- expand.grid(colnames(example), colnames(example), stringsAsFactors=F)

sapply(1:nrow(combos), function(j) {
    MY_CALCULATION
})

combos我真的说不出你想要实现什么。我没有看到base R中的函数
rollply
,但我知道您可以使用
combn
函数: 我将为您提供上述示例的所有4个窗口组合,但仅针对10个数字。我无法生成1000个数字,但您可以更改代码来实现这一点

  set.seed(101)
  inputx <- rnorm(10,mean = 3,sd=2)
  inputy <- rnorm(10,mean = 2,sd=1)
  inputz <- rnorm(10,mean = 1,sd=3)
  example <- cbind(inputx,inputy,inputz)# Has only 10 rows. just for illustration

 a=lapply(1:(nrow(example)-3),function(x) x:(x+3))# all the four window combinations
 Map(combn,ncol(example),2,c(function(x,y) example[y,x]),y=a)
set.seed(101)
输入x1)
ccf(x,y)
由两个4向量组成
x
y
给出一个7向量,因此输出将有3*3*7=63列,而不是问题中所述的9列

在一篇评论中,海报指出另一个函数可以替代
ccf
,因此下面我们假设
cov(x,y)
,因为它输出一个标量,而不是一个7向量,因此会产生10 x 9的输出。在这种特殊情况下,
cov(cbind(x,y,z))
生成一个3x3矩阵,当展平时给出一个9向量

rollapplyr(head(example, 10), 4, function(x) c(cov(x)), fill = NA, by.column = FALSE)
给出以下10x9矩阵:

           [,1]        [,2]       [,3]        [,4]      [,5]       [,6]       [,7]       [,8]      [,9]
 [1,]        NA          NA         NA          NA        NA         NA         NA         NA        NA
 [2,]        NA          NA         NA          NA        NA         NA         NA         NA        NA
 [3,]        NA          NA         NA          NA        NA         NA         NA         NA        NA
 [4,] 1.1990739 -0.72070179 -0.3951435 -0.72070179 1.8590569  3.1565993 -0.3951435  3.1565993  6.718376
 [5,] 1.1503463 -0.51712419  0.1548365 -0.51712419 1.6830055  2.6102211  0.1548365  2.6102211  5.058550
 [6,] 2.2854029 -0.12857123  1.1658204 -0.12857123 0.3413027  0.7821381  1.1658204  0.7821381  2.753662
 [7,] 0.7473036 -0.31336885 -0.2743693 -0.31336885 0.3923239  1.1959920 -0.2743693  1.1959920  6.109035
 [8,] 1.1727627 -0.53344663  2.2960862 -0.53344663 0.4851109 -0.5067012  2.2960862 -0.5067012 15.027672
 [9,] 1.2381071 -0.88053417  1.5728089 -0.88053417 0.9289009  0.7283704  1.5728089  0.7283704 18.179175
[10,] 1.2353345 -0.05021654  1.7008923 -0.05021654 1.6116281  1.4902571  1.7008923  1.4902571 18.399713
2)或给出相同结果的:

k <- ncol(example)
g <- expand.grid(1:k, 1:k)
Cov <- function(x) apply(g, 1, function(ix) cov(x[, ix[1]], x[, ix[2]]))
rollapplyr(head(example, 10), 4, Cov, by.column = FALSE, fill = NA)

k您是指
cor
还是
cov
而不是
ccf
?两个4向量的ccf是7向量,因此所有9种可能性的输出都是7*9=63长。@G.Grothendieck,感谢您的回复。我使用ccf,因为它是一个简单的函数,需要两个输入变量,任何两个输入函数都可以使用。我想主要的一点是采用矩阵/数据帧,并在所有列排列中应用滚动函数。我问了这个问题,我大声喊了出来,但没有得到回答,所以我试图简化我的问题以吸引答案,我猜提到小波会吓跑一些人,但想法仍然是一样的。
rollapplyr(head(example, 10), 4, function(x) c(cov(x)), fill = NA, by.column = FALSE)
           [,1]        [,2]       [,3]        [,4]      [,5]       [,6]       [,7]       [,8]      [,9]
 [1,]        NA          NA         NA          NA        NA         NA         NA         NA        NA
 [2,]        NA          NA         NA          NA        NA         NA         NA         NA        NA
 [3,]        NA          NA         NA          NA        NA         NA         NA         NA        NA
 [4,] 1.1990739 -0.72070179 -0.3951435 -0.72070179 1.8590569  3.1565993 -0.3951435  3.1565993  6.718376
 [5,] 1.1503463 -0.51712419  0.1548365 -0.51712419 1.6830055  2.6102211  0.1548365  2.6102211  5.058550
 [6,] 2.2854029 -0.12857123  1.1658204 -0.12857123 0.3413027  0.7821381  1.1658204  0.7821381  2.753662
 [7,] 0.7473036 -0.31336885 -0.2743693 -0.31336885 0.3923239  1.1959920 -0.2743693  1.1959920  6.109035
 [8,] 1.1727627 -0.53344663  2.2960862 -0.53344663 0.4851109 -0.5067012  2.2960862 -0.5067012 15.027672
 [9,] 1.2381071 -0.88053417  1.5728089 -0.88053417 0.9289009  0.7283704  1.5728089  0.7283704 18.179175
[10,] 1.2353345 -0.05021654  1.7008923 -0.05021654 1.6116281  1.4902571  1.7008923  1.4902571 18.399713
k <- ncol(example)
g <- expand.grid(1:k, 1:k)
Cov <- function(x) apply(g, 1, function(ix) cov(x[, ix[1]], x[, ix[2]]))
rollapplyr(head(example, 10), 4, Cov, by.column = FALSE, fill = NA)