Параметры вне диапазона: ets, optim

Я написал код на R, который добавляет весовые коэффициенты и запускает аддитивные зимы. Однако для некоторых моих данных это дает ошибку:

Error in etsmodel(y, errortype[i], trendtype[j], seasontype[k], damped[l], : Parameters out of range

Может кто-нибудь, пожалуйста, скажите мне, почему это происходит, и как я могу остановить это в будущем.

Вот мой код:

suppressMessages(library(lmtest))
suppressMessages(library(car))
suppressMessages(library(tseries))
suppressMessages(library(forecast))
suppressMessages(library(TTR))
suppressMessages(library(geoR))
suppressMessages(library(MASS))

#-------------------------------------------------------------------------------
Input.data <- matrix(c("08Q1","08Q2","08Q3","08Q4","09Q1","09Q2","09Q3","09Q4","10Q1","10Q2","10Q3","10Q4","11Q1","11Q2","11Q3","11Q4","12Q1","12Q2","12Q3","12Q4","13Q1","13Q2","13Q3","13Q4","14Q1","14Q2","14Q3",73831.11865,84750.47149,85034.80061,99137.19637,62626.50672,72144.77761,74726.1774,122203.5416,84872.02354,96054.77537,93849.93456,136380.3862,94252.32737,101044.518,112453.256,138807.2089,102091.1436,102568.8303,98839.36528,129249.4421,91207.28917,93060.79801,87776.30512,124342.2055,87128.55797,90261.46195,86371.5614),ncol=2,byrow=FALSE)


Frequency <- 1/4

Forecast.horizon <- 4

Start.date <- c(8, 1)

Data.col <- as.numeric(Input.data[, length(Input.data[1, ])])

Data.col.ts <- ts(Data.col, deltat=Frequency, start = Start.date)

trans<- abs(round(BoxCox.lambda(Data.col, method = "loglik"),5))
categ<-as.character( c(cut(trans,c(0,0.25,0.75,Inf),right=FALSE)) )
Data.new<-switch(categ,
                 "1"=log(Data.col.ts),
                 "2"=sqrt(Data.col.ts),
                 "3"=Data.col.ts
)

mape <- function(percent.error)              
  mean(abs(percent.error))
#----- Weighting ---------------------------------------------------------------
fweight <- function(x){
  PatX <- 0.5+x 
  return(PatX)
}

integvals <- rep(0, length.out = length(Data.new))
for (i in 1:length(Data.new)){
  integi <- integrate(fweight, lower = (i-1)/length(Data.new), upper= i/length(Data.new))
  integvals[i] <- 2*integi$value
}

HWAW <- ets(Data.new, model = "AAA", damped = FALSE, opt.crit = "mse", ic="aic", lower = c(0.03, 0.03, 0.03, 0.04), 
            upper = c(0.997, 0.997, 0.997, 0.997), bounds = "usual", restrict = FALSE)
parASW <- round(HWAW$par[1:3], digits=3)
HWAOPT <- function(parASW)
{
  HWAddW <- ets(Data.new, model = "AAA", alpha = parASW[1], beta = parASW[2], gamma = parASW[3], damped = FALSE, opt.crit = "mae", ic="aic",
                lower = c(0.001, 0.001, 0.001, 0.0001), upper = c(0.999, 0.999, 0.999, 0.999), bounds = "admissible", restrict = FALSE)
  error <- c(resid(HWAddW))
  error <- t(error) %*% integvals
  percent.error <- 100*(error/c(Data.new))
  MAPE <- mape(percent.error)
  return(MAPE)
}
OPTHWA <- optim(parASW, HWAOPT, method="L-BFGS-B", lower=c(rep(0.01, 3)), upper=c(rep(0.99, 3)), control = list(fnscale= 1, maxit = 3000))
# Alternatively, set  method="Nelder-Mead" or method="L-BFGS-B" 
parS4 <- OPTHWA$par
HWAW1 <- ets(Data.new, model = "AAA", alpha = parS4[1], beta = parS4[2], gamma = parS4[3], damped = FALSE, opt.crit = "mae", ic="aic",
             lower = c(0, 0, 0, 0), upper = c(0.999, 0.999, 0.999, 0.999), bounds = "admissible", restrict = FALSE)

Заранее спасибо

Редактировать:

Даже при снятии ограничений на верхнюю и нижнюю границу ошибка остается

редактировать

Я удалил opt.crit от ets что заставило мой код работать нормально. Если есть другой способ, пожалуйста, дайте мне знать

РЕДАКТИРОВАТЬ

Хотя это работало для этого набора данных, оно все равно выдало ошибку для другого. Так что я должен сделать что-то еще, чтобы этот код запускался автоматически для всех наборов данных.

1 ответ

Скорее всего, параметры, оцененные HWAW, которые затем округляются до 3 десятичных знаков в parS4, являются недопустимыми. Бета должна быть меньше, чем альфа, а гамма должна быть меньше 1 минус альфа:

https://github.com/robjhyndman/forecast/issues/179

https://robjhyndman.com/eindhoven/2-1-StateSpace.pdf

Проверьте параметры, которые вы передаете:

HWAW1 <- ets(..., alpha = parS4[1], beta = parS4[2], gamma = parS4[3], ...)

Я пишу hw модель с alpha, beta а также gamma параметры с beta меньше, чем alpha а также gamma меньше, чем beta. Я все еще получаю сообщение об ошибке.
Вот моя модель и сообщение об ошибке.

tsx <- ts(data = x, start = c(2016, 10), frequency = 12)
hw(y = tsx, h = 16, alpha = 0.6, beta = 0.3, gamma = 0.2)

Я получаю сообщение об ошибке

Ошибка в etsmodel(y, errortype[i], trendtype[j], seasontype[k], damped[l],: параметры вне допустимого диапазона)

Другие вопросы по тегам