【问题标题】:If error in loop create vector of "n" and continue如果循环中的错误创建“n”向量并继续
【发布时间】:2014-10-23 09:53:10
【问题描述】:

我在 R 中有一个循环,它测试 ARIMA 与特定条件的所有可能组合并测试滞后。但是在循环期间有一个错误

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

发生此错误时,我希望它创建一个“n”向量,该向量将与其余模型一起放入矩阵中。我已经尝试过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,])))

但这给出了一个错误:

Error: $ operator is invalid for atomic vectors

并且还给出了一个矩阵,其中包含直到迭代 68 的所有拟合 ARIMA 值,之后它给出的所有内容为 0.0

有没有办法让循环继续迭代,用一个进入矩阵Arimafit 的值填充一个向量,就像迭代有效,这样我就可以继续使用代码?

【问题讨论】:

    标签: r loops error-handling


    【解决方案1】:

    我刚刚找到了做我想做的事情的方法。这可能对其他人有帮助,所以我不会删除它,我只是发布解决方案:)

    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]))}
    }
    

    【讨论】:

      【解决方案2】:

      这是对我想要实现的目标的进一步适应

      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)]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多