2014-10-23 3 views
2

나는 ARIMA의 가능한 모든 조합을 특정 조건에서 테스트하고 지연을 테스트하는 R 루프가 있습니다. 이 오류가 나는 그것이 모델의 나머지 부분과 매트릭스에 투입 될 것 "N"의 벡터를 만들 발생하면 그러나 루프 중에 오류루프의 오류가 "n"의 벡터를 생성하고 계속되는 경우

Error in optim(init[mask], armafn, method = optim.method, hessian = TRUE, : 
    non-finite finite-difference value [1] 

있다. tryCatch을 시도했지만 어떤 이유로이 작업이 나머지 반복 작업을 중단시킵니다. 여기

내 코드입니다 :

N<- c(155782.7, 159463.7, 172741.1, 204547.2, 126049.3, 139881.9, 140747.3, 251963.0, 182444.3, 207780.8, 189251.2, 318053.7, 230569.2, 247826.8, 237019.6, 383909.5, 265145.5, 264816.4, 239607.0, 436403.1, 276767.7, 286337.9, 270022.7, 444672.9, 263717.2, 343143.9, 271701.7) 
aslog<-"n" 
library(gtools) 
library(forecast) 
a<-permutations(n=3,r=6,v=c(0:2),repeats.allowed=TRUE) 
a<-a[ifelse((a[,1]+a[,4]>2|a[,2]+a[,5]>2|a[,3]+a[,6]>2),FALSE,TRUE),] 
namWA<-matrix(0,ncol=1,nrow=length(a[,1])) 
namWS<-matrix(0,ncol=1,nrow=length(a[,1])) 
Arimafit<-matrix(0,ncol=length(N),nrow=length(a[,1]),byrow=TRUE) 
tota<-matrix(0,ncol=1,nrow=length(a[,1])) 
totb<-matrix(0,ncol=1,nrow=length(a[,1])) 
for(i in 1:length(a[,1])){ 
    namWA[i]<-paste("orderWA",i,sep=".") 
    assign(namWA[i],a[i,c(1:3)]) 
    namWS[i]<-paste("orderWS",i,sep=".") 
    assign(namWS[i],a[i,c(4:6)]) 
    ArimaW1 <- Arima(N, order= a[i,c(1:3)], seasonal=list(order=a[i,c(4:6)]),method="ML") 
    if(aslog=="y"){Arimafit[i,]<-c(exp(fitted(ArimaW1)))}else{Arimafit[i,]<-c(fitted(ArimaW1))} 
    nnn<-c(N) 
    arimab<-c(Arimafit[i,]) 
    fullres<-nnn-arimab 
    v<-acf(fullres,plot=FALSE) 
    w<-pacf(fullres,plot=FALSE) 
    if(v$acf[2]>0.4|v$acf[2]<(-0.4)|v$acf[3]>0.4|v$acf[3]<(-0.4)|v$acf[4]>0.4|v$acf[4]<(-0.4)|v$acf[5]>0.4|v$acf[5]<(-0.4)|v$acf[6]>0.4|v$acf[6]<(-0.4)|v$acf[7]>0.4|v$acf[7]<(-0.4)|w$acf[1]>0.4|w$acf[1]<(-0.4)|w$acf[2]>0.4|w$acf[2]<(-0.4)|w$acf[3]>0.4|w$acf[3]<(-0.4)|w$acf[4]>0.4|w$acf[4]<(-0.4)|w$acf[5]>0.4|w$acf[5]<(-0.4)|w$acf[6]>0.4|w$acf[6]<(-0.4)) 
    tota[i]<-"n" else{ 
     tota[i]<-sum(abs(v$acf[2:7])) 
     totb[i]<-sum(abs(w$acf[1:6]))} 
} 

내가

ArimaW1<-tryCatch(Arima(N, order= a[i,c(1:3)], seasonal=list(order=a[i,c(4:6)]),method="ML"),error=function(e) NULL) 

일을 시도하고이 후 다른 오류

Error in Arimafit[i, ] <- c(fitted(ArimaW1)) : 
    number of items to replace is not a multiple of replacement length 

을 준 내가 시도 :

ArimaW1<-tryCatch(Arima(N, order= a[i,c(1:3)], seasonal=list(order=a[i,c(4:6)]),method="ML"),error=function(e) matrix("n",ncol=length(Arimafit[1,]))) 
01 루프를 얻을 수있는 방법이

Error: $ operator is invalid for atomic vectors 

또한 장착 ARIMA 그것이 0.0

등 모든 것을 제공합니다 그 후, 68을 반복하는 최대 값 모두와 함께 매트릭스를 준 : 23,516,

하지만이 오류를 준 반복을 계속하려면 코드를 계속 수행 할 수있는 반복 작업처럼 행렬 Arimafit에 들어가는 값으로 벡터를 채우십시오.

답변

2

방금 ​​내가하고 싶은 것을하는 길을 알았습니다. 내가 그것을 삭제 늘 이렇게하면, 단지 솔루션 :

다음
library(gtools) 
a<-permutations(n=3,r=6,v=c(0:2),repeats.allowed=TRUE) 
a<-a[ifelse((a[,1]+a[,4]>2|a[,2]+a[,5]>2|a[,3]+a[,6]>2),FALSE,TRUE),] 
namWA<-matrix(0,ncol=1,nrow=length(a[,1])) 
namWS<-matrix(0,ncol=1,nrow=length(a[,1])) 
Arimafit<-matrix(0,ncol=length(N),nrow=length(a[,1]),byrow=TRUE) 
tota<-matrix(0,ncol=1,nrow=length(a[,1])) 
totb<-matrix(0,ncol=1,nrow=length(a[,1])) 
arimaerror<-matrix(0,ncol=length(N),nrow=1) 
for(i in 1:length(a[,1])){ 
    namWA[i]<-paste("orderWA",i,sep=".") 
    assign(namWA[i],a[i,c(1:3)]) 
    namWS[i]<-paste("orderWS",i,sep=".") 
    assign(namWS[i],a[i,c(4:6)]) 
    ArimaW1 <- try(Arima(N, order= a[i,c(1:3)], seasonal=list(order=a[i,c(4:6)]),method="ML")) 
    if(is(ArimaW1,"try-error")) 
    ArimaW1<-arimaerror else 
     ArimaW1<-ArimaW1 
    arimafitted<-try(fitted(ArimaW1)) 
    if(is(arimafitted,"try-error")) 
    fitarima<-arimaerror else 
     fitarima<-arimafitted 
    if(aslog=="y"){Arimafit[i,]<-c(exp(fitarima))}else{Arimafit[i,]<-c(fitarima)} 
    nnn<-c(N) 
    arimab<-c(Arimafit[i,]) 
    fullres<-nnn-arimab 
    v<-acf(fullres,plot=FALSE) 
    w<-pacf(fullres,plot=FALSE) 
    if(v$acf[2]>0.4|v$acf[2]<(-0.4)|v$acf[3]>0.4|v$acf[3]<(-0.4)|v$acf[4]>0.4|v$acf[4]<(-0.4)|v$acf[5]>0.4|v$acf[5]<(-0.4)|v$acf[6]>0.4|v$acf[6]<(-0.4)|v$acf[7]>0.4|v$acf[7]<(-0.4)|w$acf[1]>0.4|w$acf[1]<(-0.4)|w$acf[2]>0.4|w$acf[2]<(-0.4)|w$acf[3]>0.4|w$acf[3]<(-0.4)|w$acf[4]>0.4|w$acf[4]<(-0.4)|w$acf[5]>0.4|w$acf[5]<(-0.4)|w$acf[6]>0.4|w$acf[6]<(-0.4)) 
    tota[i]<-"n" else{ 
     tota[i]<-sum(abs(v$acf[2:7])) 
     totb[i]<-sum(abs(w$acf[1:6]))} 
} 
0

내가

a <- permutations(n = 3, r = 6, v = c(0:2), repeats.allowed = TRUE) 
a <- a[ifelse((a[, 1] + a[, 4] > 2 | a[, 2] + a[, 5] > 2 | a[, 3] + a[, 6] > 2), 
       FALSE, TRUE), ] 

Arimafit <- matrix(0, 
        ncol = length(Data.new), 
        nrow = length(a[, 1]), 
        byrow = TRUE) 

totb <- matrix(0, ncol = 1, nrow = length(a[, 1])) 
arimaerror <- matrix(0, ncol = length(Data.new), nrow = 1) 

for (i in 1:length(a[, 1])){ 
    ArimaData.new <- try(Arima(Data.new, 
          order = a[i, c(1:3)], 
          seasonal = list(order = a[i, c(4:6)]), 
          method = "ML"), 
         silent = TRUE) 

    if (is(ArimaData.new, "try-error")){ 
    ArimaData.new <- arimaerror 
    } else { 
    ArimaData.new <- ArimaData.new 
    } 

    arimafitted <- try(fitted(ArimaData.new), silent = TRUE) 

    if (is(arimafitted, "try-error")){ 
    fitarima <- arimaerror 
    } else { 
    fitarima <- arimafitted 
    } 

    if (as.log == "log"){ 
    Arimafit[i, ] <- c(exp(fitarima)) 
    Datanew <- c(exp(Data.new)) 
    } else { 
    if (as.log == "sqrt"){ 
     Arimafit[i, ] <- c((fitarima)^2) 
     Datanew <- c((Data.new)^2) 
    } else { 
     Arimafit[i, ] <- c(fitarima) 
     Datanew <- c(Data.new) 
    } 
    } 

    data <- c(Datanew) 

    arima.fits <- c(Arimafit[i, ]) 

    fullres <- data - arima.fits 

    v <- acf(fullres, plot = FALSE) 

    w <- pacf(fullres, plot = FALSE) 

    if (v$acf[2]>0.4|v$acf[2]<(-0.4)|v$acf[3]>0.4|v$acf[3]<(-0.4)|v$acf[4]>0.4|v$acf[4]<(-0.4)|v$acf[5]>0.4|v$acf[5]<(-0.4)|v$acf[6]>0.4|v$acf[6]<(-0.4)|v$acf[7]>0.4|v$acf[7]<(-0.4)|w$acf[1]>0.4|w$acf[1]<(-0.4)|w$acf[2]>0.4|w$acf[2]<(-0.4)|w$acf[3]>0.4|w$acf[3]<(-0.4)|w$acf[4]>0.4|w$acf[4]<(-0.4)|w$acf[5]>0.4|w$acf[5]<(-0.4)|w$acf[6]>0.4|w$acf[6]<(-0.4)){ 
    totb[i] <- "n" 
    } else { 
    totb[i] <- sum(abs(w$acf[1:4])) 
    } 

    j <- match(min(totb), totb) 

    order.arima <- a[j, c(1:3)] 

    order.seasonal.arima <- a[j, c(4:6)] 
} 
을 달성하기 위해 원하는 것을에 더 적응입니다 병에 게시 다른 사람을 도움이 될 수 있습니다
관련 문제