if(N <= 0)NULL的错误否则seq(N):需要TRUE / FALSE的缺失值

时间:2017-11-10 15:15:02

标签: r time-series arima

maxP <- 2       
maxQ <- 2
AIC  <- matrix(0,nrow=maxP,ncol=maxQ)
BIC  <- matrix(0,nrow=maxP,ncol=maxQ)
HQC  <- matrix(0,nrow=maxP,ncol=maxQ)

# Save all information criteria
 for (p in 0:maxP){
  for(q in 0:maxQ){
     if (p>0) {ARLags <- 1:p} 
    else {ARLags <- 0}

    if (q>0) {MALags <- 1:q} 
    else{MALags <- 0}

    # Estimate the model
    CPI_fit <- arma(CPI, order(ARLags, MALags, include.intercept = TRUE)
    # Save the criteria in a P x Q matrix
    AIC[p+1, q+1] <- CPI_fit$aic
    BIC[p+1, q+1] <- CPI_fit$bic
  }
}

AIC
BIC

我正在尝试自动选择ARMA模型的模型规范,但我总是收到此错误消息:

Error in if (N <= 0) NULL else seq(N) : 
 missing value where TRUE/FALSE needed

这是什么意思,我该如何预防?

1 个答案:

答案 0 :(得分:0)

我假设您使用的是tseries::arma

问题在于电话

arma(CPI, order(ARLags, MALags), include.intercept = TRUE)

您可以通过调用traceback()找到调用错误的内容。这给我们提供了一个错误的线索:

2: seqN(order[2])
1: arma(CPI, order(ARLags, MALags), include.intercept = TRUE)

arma的第二个正式版order是您order(ARLags, MALags)提供的order = order(ARLags, MALags) 。这意味着对于函数调用我们有

order

来自上面使用的功能 order的{​​{3}}:

  

sort.list返回一个排列,它将第一个参数重新排列为升序或降序,通过进一步的参数打破关系。 tseries::arma是相同的,只使用一个参数。

(强调我的)这种排列用于对数据进行排序,是一个与输入长度相同的向量。同时,orderdescription

中的正式
  

order[1]二维整数向量,使模型的顺序适合。 order[2]对应于AR部分,arma对应于MA部分。

这就是冲突。 p = 0需要二维整数向量,但提供一维向量,因为ARlags = 0然后是order(0) = 1和{{ 1}}。

您想要提供arma的内容是order = c(p,q) - AR和MA部分中的最大滞后期限。试试这个

CPI_fit <- arma(CPI, c(p, q), include.intercept = TRUE)