Проблема в том, что вы используете Metrics::accuracy()
, а не forecast::accuracy()
, и это функция, которая выполнит то, что я думаю, вы хотите. После некоторого объяснения причины у меня также есть несколько общих замечаний о том, как задавать вопросы о переполнении стека, которые могут быть вам полезны, если у вас в будущем возникнет еще один вопрос по этому сайту.
Metrics::accuracy()
vs. forecast::accuracy()
Мы можем увидеть некоторые различия между функциями, если посмотрим на файлы справки (help("forecast::accuracy")
и help("Metrics::accuracy")
).
Аргументы в пользу точности прогнозов похожи на
accuracy(f, x, test = NULL, d = NULL, D = NULL, ...)
где f
- «Объект класса« прогноз »или числовой вектор, содержащий прогнозы ....» и x
- «Необязательный числовой вектор, содержащий фактические значения такой же длины, что и объект, или временной ряд, перекрывающийся с временами f. " Это соответствует тому, как вы пытались его использовать, передавая в качестве первого аргумента объект класса прогноза, а в качестве второго - вектор фактических значений.
Если вы хотите использовать Metrics::accuracy()
, его аргументы похожи на
accuracy(actual, predicted)
где actual
- это «основной истинный вектор, где элементы вектора могут быть любого типа переменной», а predicted
- «предсказанный вектор, где элементы вектора представляют собой предсказание для соответствующего значения в фактическом состоянии». Другими словами, вашим первым аргументом должны быть только сами прогнозы, а не вся другая информация, содержащаяся в forecast
объекте. Я также не думаю, что это дает вам тот тип метрики точности, который вам нужен для такого рода анализа; он дает «долю элементов в фактическом состоянии, которые равны соответствующему элементу в прогнозе».
Несколько советов, как задавать вопросы в будущем
Сначала я бы посмотрел на отличный ресурс Как сделать отличный Воспроизводимый пример R. Затем я дам вам код, который я использовал для воспроизведения вашей проблемы, и вы увидите некоторые изменения, которые мне пришлось внести даже для начала работы (мои комментарии начинаются с ###
):
#plotting time series from year 1998 to 2008
### Since we don't have t_AMOUNT, we can't recreate your data
# year.time_series <- ts(t_AMOUNT, start = c(1998), frequency = 12) #Monthly 12
### So I did the following to make some dummy data
set.seed(42)
year.time_series <- ts(rnorm(12*11), start = c(1998), frequency = 12 )
plot(year.time_series)
#splitting the timeseries for further model evaluation
### Since there are spelling changes below for some reason,
### I had to do the next line (or change the variable names below)
year.timeseries <- year.time_series
train <- window(year.timeseries, start=1998, end=2005)
test <- window(year.timeseries, start=2005, end=2008)
#using models to check the accuracy results
### We need the forecast library for ets(),
### but it wasn't loaded in your code
library(forecast)
etsfit <- ets(train)
summary(etsfit)
plot(train, main = "ETS Forecast", ylab = "ets(training set)",
cex.lab = 1.5, cex.main = 1.5, cex.axis = 1.5)
lines(etsfit$fitted, col = "orange")
#forecast
forecast.ets <- forecast(etsfit, h = 24)
summary(forecast.ets)
plot(forecast.ets)
plot(forecast.ets, main = "2 Year Forecast Using ETS Model",
xlim = c(1998, 2008), cex.lab = 1.5, cex.main = 1.5, cex.axis = 1.5)
lines(test, col = "red")
library(Metrics)
#input = forecast values, actual values
accuracy(forecast.ets,test)
forecast::accuracy(forecast.ets, test)
24.09.2018