Наивное решение действительно очень медленное
(хотя бы несколько минут - я недостаточно терпелив):
library(zoo)
n <- 2e5
k <- 30
z <- rnorm(n)
x <- rnorm(k) # We do not use the fact that x is a part of z
rollapply(z, k, function(u) cor(u,x), align="left")
Вы можете вычислить корреляцию вручную, начиная с первых моментов и комментариев, но это все равно занимает несколько минут.
y <- zoo(rnorm(n), 1:n)
x <- rnorm(k)
exy <- exx <- eyy <- ex <- ey <- zoo( rep(0,n), 1:n )
for(i in 1:k) {
cat(i, "\n")
exy <- exy + lag(y,i-1) * x[i]
ey <- ey + lag(y,i-1)
eyy <- eyy + lag(y,i-1)^2
ex <- ex + x[i] # Constant time series
exx <- exx + x[i]^2 # Constant time series
}
exy <- exy/k
ex <- ex/k
ey <- ey/k
exx <- exx/k
eyy <- eyy/k
covxy <- exy - ex * ey
vx <- exx - ex^2
vy <- eyy - ey^2
corxy <- covxy / sqrt( vx * vy )
Как только у вас есть временной ряд корреляций,
положение вершины 300 легко извлечь.
i <- order(corxy, decreasing=TRUE)[1:300]
corxy[i]