我有 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
我的实际数据总共有 10 个变量,但为简单起见,我只使用了 3 个。
对于下面的每个排列,我想使用大小为 4 的滚动窗口来计算 ccf
inputx,inputx
inputx,inputy
inputx,inputz
inputy,inputx
inputy,inputy
inputy,inputz
inputz,inputx
inputz,inputy
inputz,inputz
例如
ccf(example[1:4,1],example[1:4,2])
ccf(example[2:5,1],example[2:5,2])
.
.
.
ccf(example[7:10,1],example[7:10,2])
如您所见,上面的示例仅适用于第 1 列和第 2 列,但我希望使用滚动窗口方法对所有列都执行此操作。
滚动窗口过程很容易使用 rollapply 函数来处理,您可以在其中指定窗口的大小,并将 by.column 指定为 FALSE,这样它就不会分别在每一列上应用该函数。
如果我想对每一列滚动应用诸如 mean 之类的函数,我可以这样做,但是所有组合的列之间的循环让我大吃一惊,我无法弄清楚。
test <- rollapply(example[,c(1,2)],4,mean, by.column=TRUE)
对于输出,ccf 结果应按行存储,并且尺寸应为 10x9,因为原始数据中有 10 行,ccf 函数有 9 个排列。输出的前 3 行将是 NA,因为滚动窗口使用的大小为 4。下面的值仅用于说明目的,并不是真正的输出值。
输出->
xx xy xz yx yy yz zx zy zz
[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 .2 .3 .2 .8 .5 .3 .5 .9
[5,] .1 .2 .3 .2 .8 .5 .3 .5 .9
[6,] .1 .2 .3 .2 .8 .5 .3 .5 .9
[7,] .1 .2 .3 .2 .8 .5 .3 .5 .9
[8,] .1 .2 .3 .2 .8 .5 .3 .5 .9
[9,] .1 .2 .3 .2 .8 .5 .3 .5 .9
[10,].1 .2 .3 .2 .8 .5 .3 .5 .9
我会很感激在所有排列中应用循环的一点帮助,我想如果我得到了,我可以做 rollapply 包装器来实现滑动窗口。