Циклические данные с последовательными временными задержками выводят коэффициенты линейной регрессии

У меня есть такой набор данных:

 set.seed(242)
 df<- data.frame(month=order(seq(1,20,1),decreasing=TRUE), 
 psit=sample(1:100,20,replace=TRUE),  var=sample(1:10,20, 
 replace=TRUE))

Я хочу сделать грубый анализ временной задержки, чтобы увидеть, как отстает var данные влияют psit данные. Задержка, как определено в этом грубом анализе, var данные Т-1, Т-2, Т-3 и др. месяцев в прошлом от каждого psit точка данных.

Чтобы увидеть, как предыдущие месяцы var данные влияют psit данные, я хочу сделать timelag вектор, который состоит из var данные, которые смещены на один месяц от psit переменная. Тогда я свяжу timelag вектор к psit вектор. Вот примеры фреймов данных для смещения на 1 месяц, смещения на 2 месяца, смещения на 3 месяца, соответственно:

 set.seed(242)
 timelag1<- cbind(df[1:12,2], df[2:13,3]) #1 month time lag
 timelag2<- cbind(df[1:12,2], df[3:14,3]) #2 month time lag
 timelag3<- cbind(df[1:12,2], df[4:15,3]) #3 month time lag

Для каждого кадра данных я хочу регрессировать var против psit данные с использованием lm() Функция и выводит значение R-квадрата. Этот процесс будет повторяться для каждого последующего смещения. Пример ниже:

 model1<-lm(timelag1)
 summary(model1)$r.squared
 model2<-lm(timelag2)
 summary(model2)$r.squared
 model3<-lm(timelag3)
 summary(model3)$r.squared

Я хотел бы создать цикл, который повторяет этот процесс для большого набора данных из 240 месяцев. Затем запускает lm() на каждом кадре данных, а затем выведите значение r в квадрате.

1 ответ

Попробуйте пакет dyn, который позволяет lm для обработки объектов зоопарка и других временных рядов:

library(dyn)

z <- read.zoo(df)
models <- lapply(1:3, function(i) dyn$lm(psit ~ lag(var, -i), tail(z, 12+i)))
sapply(models, function(x) summary(x)$r.squared)
## [1] 0.31209189 0.04923393 0.09995727

Обратите внимание, что обычно, если кто-то использует лаг k, он также включает все меньшие значения k. В таком случае:

models <- lapply(1:3, function(i) dyn$lm(psit ~ lag(var, -(1:i)), tail(z, 12+i)))
do.call("anova", models)

давая:

Model 1: psit ~ lag(var, -(1:i))
Model 2: psit ~ lag(var, -(1:i))
Model 3: psit ~ lag(var, -(1:i))
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     10 8688.5                           
2      9 8221.7  1    466.73 0.4545 0.5192
3      8 8215.5  1      6.24 0.0061 0.9398
Другие вопросы по тегам