Параметры вне диапазона: 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],: параметры вне допустимого диапазона)