2012-08-08 2 views
5

여러 열이있는 xts 개체에 대해 롤링 선형 회귀를 계산하는 가장 효율적인 방법을 찾는 데 문제가 있습니다. 내가 검색하고 스택 오버 플로우에 대한 몇 가지 이전의 질문을 읽었습니다.여러 열에 대한 롤링 회귀

question and answer은 모든 회귀에서 변하지 않은 종속 변수로 여러 회귀를 계산하려는만큼 충분하지 않습니다. I는 임의의 데이터가 예를 재생 시도 :

require(xts) 
require(RcppArmadillo) # Load libraries 

data <- matrix(sample(1:10000, 1500), 1500, 5, byrow = TRUE) # Random data 
data[1000:1500, 2] <- NA # insert NAs to make it more similar to true data 
data <- xts(data, order.by = as.Date(1:1500, origin = "2000-01-01")) 

NR <- nrow(data) # number of observations 
NC <- ncol(data) # number of factors 
obs <- 30 # required number of observations for rolling regression analysis 
info.names <- c("res", "coef") 

info <- array(NA, dim = c(NR, length(info.names), NC)) 
colnames(info) <- info.names 

어레이는 시간의 경과와 계수 당 여러 변수 (잔차 계수 등)를 저장하기 위해 생성된다. 루프가 아이디어를 보여줍니다으로

loop.begin.time <- Sys.time() 

for (j in 2:NC) { 
    cat(paste("Processing residuals for factor:", j), "\n") 
    for (i in obs:NR) { 
    regression.temp <- fastLm(data[i:(i-(obs-1)), j] ~ data[i:(i-(obs-1)), 1]) 
    residuals.temp <- regression.temp$residuals 
    info[i, "res", j] <- round(residuals.temp[1]/sd(residuals.temp), 4) 
    info[i, "coef", j] <- regression.temp$coefficients[2] 
    } 
} 

loop.end.time <- Sys.time() 
print(loop.end.time - loop.begin.time) # prints the loop runtime 

종속 변수 (요인) 다른 요인 중 하나에 대한 모든 시간과 같은 data[, 1]와 30 명 관찰 롤링 회귀를 실행하는 것입니다. fastLm은 표준화 된 잔차를 계산하지 않으므로 임시 객체에 30 개의 잔류 물을 저장해야합니다.

루프가 매우 느리고 xts 개체의 열 수 (요소)가 약 100 - 1,000 열로 증가하면 매우 어려워집니다. 큰 데이터 세트에서 롤백 회귀를 생성하는 데 더 효율적인 코드가 있기를 바랍니다.

+0

회귀를 두 번 실행하지 않아도 2 배 빨라질 수 있습니다 ... 나는 귀하의 질문에 편집했습니다. –

+0

물론 가능합니다! 유럽에서 늦었습니다. 조슈아 감사합니다. 변경 사항의 성능이 2-2.5 배 향상되었습니다. 그러나이 코드는 매일 2500 회의 관측치와 약 1,000 가지 요인의 데이터 세트에 대해 적절한 성능을 갖고 있다고 생각하십니까? 또는 위의 방법과 비교하여 rollapply를 사용하여 성능이 향상되었음을 알고 있습니까? 데이터 세트가 매우 커지면 재귀 적 최소 제곱 필터 또는 관련 항목을 적용해야합니다. –

답변

8

선형 회귀의 수학 수준까지 내려 가면 꽤 빠를 것입니다. X가 독립 변수이고 Y가 종속 변수 인 경우 계수는 내가 조금 혼란이야

Beta = inv(t(X) %*% X) %*% (t(X) %*% Y)

에 의해 제공되는 변수에 대해 종속 하나의 독립적 그러나 희망 유사한 문제가 아래뿐만 아니라 당신을 도울 것입니다 해결은 IS가되고 싶어요.

아래 예제에서는 원본 5 대신 1000 개의 변수를 사용하며 어떤 NA도 도입하지 않습니다.

require(xts) 

data <- matrix(sample(1:10000, 1500000, replace=T), 1500, 1000, byrow = TRUE) # Random data 
data <- xts(data, order.by = as.Date(1:1500, origin = "2000-01-01")) 

NR <- nrow(data) # number of observations 
NC <- ncol(data) # number of factors 
obs <- 30 # required number of observations for rolling regression analysis 

이제 Joshua의 TTR 패키지를 사용하여 계수를 계산할 수 있습니다. 3.934461 초

res.array = array(NA, dim=c(NC, NR, obs)) 
for(z in seq(obs)) { 
    res.array[,,z] = coredata(data - lag.xts(coeffs, z-1) * as.numeric(in.dep.var)) 
} 
res.sd <- apply(res.array, c(1,2), function(z) z/sd(z)) 

library(TTR) 

loop.begin.time <- Sys.time() 

in.dep.var <- data[,1] 
xx <- TTR::runSum(in.dep.var*in.dep.var, obs) 
coeffs <- do.call(cbind, lapply(data, function(z) { 
    xy <- TTR::runSum(z * in.dep.var, obs) 
    xy/xx 
})) 

loop.end.time <- Sys.time() 

print(loop.end.time - loop.begin.time) # prints the loop runtime 

시간 차이가 나는 색인 res.sd에서 오류를하지 않았다면 당신에게 표준화 된 잔차를 제공해야합니다. 이 솔루션을 수정하여 버그를 수정하십시오.

+0

+1 직접 접근. – ricardo