Ошибка при вычислении точности модели временных рядов в R (Ошибка в NextMethod (.Generic): объект (список) не может быть приведен к типу 'double') - PullRequest
0 голосов
/ 24 сентября 2018

С этим кодом:

#plotting time series from year 1998 to 2008 
    year.time_series <- ts(t_AMOUNT,start = c(1998) , frequency = 12 ) #Monthly 12
    plot(year.time_series)
#splitting the timeseries for further model evaluation 
    train <- window(year.timeseries, start=1998,end=2005)
    test <- window(year.timeseries, start=2005, end=2008)

#using models to check the accuracy results
    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)

Я получаю следующую ошибку при accuracy(forecast.ets,test):

Ошибка в NextMethod (.Generic):
(список)объект не может быть приведен к типу 'double'

Кроме того: Предупреждающее сообщение:
In !=.default (фактическое, прогнозируемое):
длинная длина объекта не кратна короткой длине объекта

Есть ли способ разбить временной ряд и вычислить его точность?

1 Ответ

0 голосов
/ 24 сентября 2018

Проблема в том, что вы используете Metrics::accuracy() вместо forecast::accuracy(), что является функцией, которая выполнит то, что, я думаю, вы хотите.После некоторого объяснения причин у меня также есть некоторые общие замечания о том, как задавать вопросы о переполнении стека, которые могут быть полезны для вас, если у вас есть еще один вопрос для этого сайта в будущем.

Metrics::accuracy() против 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...