2014-09-21 161 views
0

当运行该程序我得到一个错误信息后160“运行”(210):tryCatch在garchFit中的R

Error in solve.default(fit$hessian) : system is computationally singular: reciprocal condition number = 1.24675e-16 
    In addition: There were 35 warnings (use warnings() to see them)  

当出现错误时,程序停止。我用另一组数据运行程序。然后它运行良好。我怎样才能在这里使用tryCatch,以便在发生错误时程序不会停止?

minOrder <- c(0,0,1,0) 
maxOrder <- c(5,5,2,2) 
bestAIC <- 1e9 
model <- list() 
N1 <- ((0^minOrder[1]+maxOrder[1])*(0^minOrder[2]+maxOrder[2])*(0^minOrder[3]+maxOrder[3])* (0^minOrder[4]+maxOrder[4])) 
AIC <- numeric(N1) 
MODEL <- mat.or.vec(N1,length(maxOrder)) 
i <- 1 

for(p in minOrder[1]:maxOrder[1]){ 
for(q in minOrder[2]:maxOrder[2]){ 
    if(p==0 && q==0){q <- 1} 
    for(m in minOrder[3]:maxOrder[3]){ 
     for(s in minOrder[4]:maxOrder[4]){  
      model <- garchFit(substitute(~arma(ar,ma)+garch(alpha,beta), list(ar=p,ma=q,alpha=m,beta=s)), data=logr, trace=F, cond.dist = c("norm"), include.mean=TRUE) 
      AICmodel <- [email protected]$ics[1] 
      AIC[i] <- AICmodel 
      MODEL[i,] <- c(p,q,m,s) 
      i <- i+1 
      if(AICmodel < bestAIC){ 
      bestAIC <- AICmodel 
      bestFIT <- model 
      bestMODEL <- c(p,q,m,s) 
      } 
     } 
    } 
} 
} 

回答

0

您应该首先确定哪个电话会给您提供错误。您可以在程序停止后通过调用traceback()来完成此操作。然后,您将该电话附于try。我想你会在拨打garchFit时收到错误。如果是这样的话,您可以:

model <- try(garchFit(substitute(~arma(ar,ma)+garch(alpha,beta), list(ar=p,ma=q,alpha=m,beta=s)), data=logr, trace=F, cond.dist = c("norm"), include.mean=TRUE)) 
    if (class(model)=="try-error") next 

try返回表达式的结果也附上如果成功或try-error类的对象与错误的详细信息。如果是这种情况,则跳过通过next的下一次迭代。您将收到错误的详细信息,但该程序将继续进行。如果你不想要任何消息,你可以拨打trysilent=TRUE参数。