#r #time-series #autoregressive-models
#r #временные ряды #авторегрессионные модели
Вопрос:
У меня есть следующий набор данных dt
Y date segment
10 2019-11-11 1
12 2019-11-12 1
9 2019-11-13 1
...
..
14 2019-12-15 5
12 2019-12-16 5
10 2019-12-17 5
Я хочу построить авторегрессионную модель, такую, что
Y(segment, dat)_{t} = beta1*Y(segment,dat)_{t-1} beta2*Y(segment,dat)_{t-2}...
пока у меня возникают проблемы только с одним сегментом, поскольку я бы сделал что-то вроде этого:
library(dynlm)
Y <- dt$Y
AR2 <- dynlm(ts(Y) ~ L(ts(Y)) L(ts(Y), 2) )
Я не уверен, как работать с несколькими сегментами одновременно
Ответ №1:
Самый простой подход заключается в использовании lm()
такого:
library(tidyverse)
dt <- tibble(
Y = sample(1:50, 200, replace=TRUE),
date = rep(seq(as.Date("2019-11-11"), by="1 day", length=40),5),
segment = rep(1:5, rep(40, 5))
)
dt <- dt %>%
arrange(segment, date) %>%
group_by(segment) %>%
mutate(
Y1 = dplyr::lag(Y,1),
Y2 = dplyr::lag(Y,2)
) %>%
ungroup()
fit <- lm(Y ~ Y1 Y2, data=dt)
Создано 2020-08-27 пакетом reprex (версия 0.3.0)
Комментарии:
1. сводка (fit) дает мне R ^ 2 = 1, используя ваш пример (а также мои данные), глядя на данные, которые я вижу Y1 = Y2 = Y, так что, возможно, в этом коде ошибка?
2. Это произошло бы, если бы вы использовали stats::lag, а не dplyr::lag. Возможно, вы используете старую версию dplyr. Или, возможно, это вызывает stats::lag по какой-то другой причине. В любом случае, теперь я сделал вызовы явными.