将稀疏 xreg 传递给 R 中的 stlf 会导致优化错误

passing sparse xreg to stlf in R causes optimisation error

我正在尝试预测时间序列,并对温度进行回归。残差在低温和高温下表现出不同的行为,因此我想使用分段线性方法,因此了解高于和低于 35 度的温度的不同系数。 数据在数据帧 data$x, data$Season, data$Temp.

#Create data frame
len<-365*3 + 1 +31 
x<-rnorm(len,mean=4000000,sd=100000)
Season<-c(rep(3,62),rep(4,91),rep(1,90),rep(2,92),rep(3,92),rep(4,91),rep(1,90),rep(2,92),rep(3,92),rep(4,91),rep(1,91),rep(2,92),rep(3,61))
Temp<-rnorm(len,mean=20,sd=5)
data<-data.frame(x,Season,Temp)
#Create model matrix 
season_dummy<-model.matrix(~as.factor(data$Season)+0)
Temp_max=pmax(0,data$Temp-35) # creates 0, or a difference
Temp_restore<-restore_temp_up(Temp_max,data$Temp,35) # restores difference to original value
Temp_season_matrix_max=Temp_restore * season_dummy

#Create time-series and forecast
data_ts<-ts(data$x[1:1000],freq=365,start=c(2009,182))
len_train<-length(data_ts)
xreg1<-Temp_season_matrix_max[1:len_train,]
newxreg1<-Temp_season_matrix_max[(len_train+1):(len_train+30),]     
 stlf(data_ts,method="arima",h=30,xreg=xreg1,newxreg=newxreg1,s.window="periodic")

 >   Error in optim(init[mask], armaCSS, method = optim.method, hessian = FALSE,  : 
      non-finite value supplied by optim



Error in auto.arima(x, xreg = xreg, seasonal = FALSE, ...) : 
  No suitable ARIMA model found
In addition: Warning message:
In auto.arima(x, xreg = xreg, seasonal = FALSE, ...) :
  Unable to calculate AIC offset
> 

其他线程建议将方法求解器从 CSS 更改为 ML,但我无法在 stlf 中编辑这些参数。帮助文件显示了一个可选参数 "forecastfunction" 但没有真正解释如何使用它的示例。

注意 - 当我将最低温度设置为 20 而不是 35 时,这工作正常 - 我确信这是因为包含高于 35 度的温度的 xreg 矩阵是稀疏的(大多数温度低于此值),但我不确定如何解决这个问题。 (我已经包含了 restore_temp_up 的代码 - 可能效率低下,但包含在这里是为了完成问题。)

restore_temp_up<-function(x,original,k){
  if(!is.vector(x))
    stop('x must be a vector')
  for (i in 1:length(x)){
    if(!is.na(x[i])){
      if (x[i] > 0){
        x[i]<-x[i]+k
      }
      if (original[i] == k){
        x[i]<-original[i]  ## this is the case if original WAS =k, then dont know whether original is 0, 
      }
    }
  }
  return(x)
}

您的设计矩阵秩亏,因此回归是奇异的。要查看此内容:

> eigen(t(xreg1) %*% xreg1)$val
[1] 1321.223    0.000    0.000    0.000

不能用秩亏设计矩阵拟合回归模型。