Р: Модель Холта. Невозможно построить прогноз таймсерий (предсказать)

Я смог использовать lm poly-модель для моделирования и прогнозирования некоторых данных временных рядов. Однако, когда я перехожу на модель holt, я получаю сообщение об ошибке в консоли R.

Вот что я пытаюсь сделать:

library(ggplot2)
library(matrixStats)
library(forecast)

df_input <- read.csv("postprocessed.csv")

x <- df_input$time
y <- df_input$value
df <- data.frame(x, y)

#poly4model <- lm(y~poly(x, degree=4), data=df)
holtmodel <- holt(df$y) # might need df$value here ?
v <- seq(1, 44)
v2 <- seq(44, 55)
    
pdf("postprocessed_holts.pdf")
plot(df, xlim=c(0, 55))
##lines(v, predict(poly4model, data.frame(x=v)), col="blue", pch=20, lwd=3)
##lines(v2, predict(poly4model, data.frame(x=v2)), col="red", pch=20, lwd=3)
lines(v, predict(holtmodel, data.frame(x=v)), col="blue", pch=20, lwd=3)
lines(v2, predict(holtmodel, data.frame(x=v2)), col="red", pch=20, lwd=3)
dev.off()

Это ошибка, которая появляется

Error in xy.coords(x, y) : 'x' and 'y' lengths differ

Я немного смущен тем, что здесь означают x и y. Объекты x и y, которые находятся в среде (среда R Studio), имеют длину 44.

Код выглядит как ошибка в обеих строках, начиная с lines.

Вот копия входных данных ...

"","time","value"
"1",1,2.61066016308988
"2",2,3.41246054742996
"3",3,3.8608767964033
"4",4,4.28686048552237
"5",5,4.4923132964825
"6",6,4.50557049744317
"7",7,4.50944447661246
"8",8,4.51097373134893
"9",9,4.48788748823809
"10",10,4.34603985656981
"11",11,4.28677073671406
"12",12,4.20065901625172
"13",13,4.02514194962519
"14",14,3.91360194972916
"15",15,3.85865748409081
"16",16,3.81318053258601
"17",17,3.70380706527433
"18",18,3.61552922363713
"19",19,3.61405310598722
"20",20,3.64591327503384
"21",21,3.70234435835577
"22",22,3.73503970503372
"23",23,3.81003078640584
"24",24,3.88201196162666
"25",25,3.89872518158949
"26",26,3.97432743542362
"27",27,4.2523675144599
"28",28,4.34654855854847
"29",29,4.49276038902684
"30",30,4.67830892029687
"31",31,4.91896819673664
"32",32,5.04350767355202
"33",33,5.09073406942046
"34",34,5.18510849382162
"35",35,5.18353176529036
"36",36,5.2210776270173
"37",37,5.22643491929207
"38",38,5.11137006553725
"39",39,5.01052467981257
"40",40,5.0361056705898
"41",41,5.18149486951409
"42",42,5.36334869132276
"43",43,5.43053620818444
"44",44,5.60001072279525

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

Я попробовал и альтернативный метод. Я заметил, что объект holtmodel содержит два объекта, которые могут быть полезны. Это fitted и mean. Насколько я могу судить, это подогнанные временные ряды и средние временные ряды для следующих 10 шагов / прогнозов.

Я попытался построить эти объекты с помощью

lines(holtmodel$fitted, col="orange", lwd=2)
lines(holtmodel$mean, col="blue", lwd=2)

однако второй из них ничего не отображает, несмотря на то, что в консоли не возникает ошибок. Первая строка, как и ожидалось, отображает оранжевые таймсерии.


person FreelanceConsultant    schedule 13.03.2021    source источник
comment
Я не совсем уверен, что вы пытаетесь отобразить. Вы пытаетесь сделать так, чтобы линия синего цвета (с прогнозом на v) соответствовала исходным данным, а линия красного цвета была прогнозом предстоящих значений?   -  person Pierre Chevallier    schedule 13.03.2021
comment
@PierreChevallier Да, синяя часть должна быть подобранной моделью, которая была подогнана ко всем точкам данных (которые находятся в диапазоне 1..44), а красная часть должна быть предсказанием на 10 шагов в будущее.   -  person FreelanceConsultant    schedule 13.03.2021


Ответы (1)


Ваша проблема

Объекты, которые вы пытаетесь добавить в виде линий, не имеют одинаковой длины:

length(predict(holtmodel, data.frame(x=v)))
# 10
length(v)
# 44
length(predict(holtmodel, data.frame(x=v2)))
# 10
length(v2)
# 12

Это означает, что вы не можете добавлять их как новые строки.

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

Кроме того, вы не указываете параметр для количества периодов, которые вы пытаетесь предсказать (h), я позволю вам сослаться на документация по функции holt. Результатом является уже предсказание будущих событий, поэтому использование predict() не меняет результата:

holt_predict <- predict(holtmodel)
length(setdiff(holt_predict, holtmodel))
# 0 which means they are the same objects

Решение

Что вы можете сделать, так это использовать прямое среднее значение и подогнать и построить их линиями, а также расширить область, чтобы отобразить чат с помощью xlim и ylim, чтобы просмотреть прогнозируемые значения. Вы можете напрямую нанести holtmodel$fitted и holtmodel$mean на свою диаграмму, поскольку они являются объектами временных рядов:

plot(df, xlim=c(0, 60), ylim=c(2.5, 10))
lines(holtmodel$fitted, col="blue", pch=20, lwd=3)
lines(holtmodel$mean, col="red", pch=20, lwd=3)

И результат:

введите описание изображения здесь

Легкая альтернатива

Чтобы избавить вас от хлопот, связанных с решением такого рода, есть более простые методы. Вы пробовали использовать autoplot функцию из пакета forecast? Он взят из ggplot2 и даст вам то, что вы хотите напрямую (если вам не нужны доверительные интервалы). Это очень просто и, вероятно, даст результат, близкий к тому, что вы хотите:

autoplot(holtmodel)

введите описание изображения здесь

person Pierre Chevallier    schedule 13.03.2021
comment
Хорошо, спасибо, здесь много полезной информации. Позвольте мне коснуться только первых моментов. Если длина v равна 44, то почему результат предсказания с x = v является объектом длины 10? Это кажется странным? Все, что я пытаюсь построить, - это сглаженная функция, также известная как функция Холтса данных временного ряда. - person FreelanceConsultant; 13.03.2021
comment
c.f. мое редактирование (после обновления страницы), где вы можете построить подобранную функцию. Но просто, функция holt дает вам уже подогнанные значения длины 44, функция прогнозирования всегда будет возвращать длину 10, которая соответствует длине элементов объекта (вы можете проверить, что внутри, с помощью str(holtmodel). Вы не можете использовать вывод из holt() с прогнозом. - person Pierre Chevallier; 13.03.2021
comment
Ах да, расширение диапазона осей, безусловно, решает одну проблему - person FreelanceConsultant; 13.03.2021
comment
Хм, команда autoplot не выводит никаких результатов. Есть идеи, почему это может быть? - person FreelanceConsultant; 13.03.2021
comment
Что странно, событие после создания холтмодели? Я запустил ваш пример выше, чтобы прикрепить автоплот. Интересно, в чем проблема, может быть, с вашими дополнительными данными? - person Pierre Chevallier; 13.03.2021
comment
Да, он работает с R, но не с R Studio? - person FreelanceConsultant; 13.03.2021
comment
Это звучит странно, у меня нет этой проблемы, и сюжет над ней тоже создан из RStudio. - person Pierre Chevallier; 13.03.2021