Циклические данные с последовательными временными задержками выводят коэффициенты линейной регрессии
У меня есть такой набор данных:
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