Авторегрессионная модель с панельными данными в r

#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 по какой-то другой причине. В любом случае, теперь я сделал вызовы явными.