stackoverflow.com/questions/46395927/...

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

 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
 Danielle18 сент. 2017 г., 03:35
Спасибо за вашу помощь @G. Гротендик. Я получаю сообщение об ошибке для обоих представленных вами вариантов.Error in lag(var, -(1:i)) : n must be a single positive integer , Вы можете комментировать код, чтобы я понял, что аргументы делают, чтобы помочь достичь результата?
 Danielle18 сент. 2017 г., 03:52
В частности, что делаетtail(z, 12+i) делать вdyn аргумент и что делает1:3 делать вlapply команда? В моем примере у меня было 3 модели для оценки регрессии, но если мой набор данных может повторяться с лагом в 12 месяцев или более, ограничивает ли 1: 3 анализ тремя лагами и, таким образом, тремя моделями?
 Danielle25 сент. 2017 г., 06:51
Вы можете помочь мне с этой обновленной версией моего вопроса?stackoverflow.com/questions/46395927/...
 Danielle18 сент. 2017 г., 03:38
Я должен отметить, когда я читаю в df используяread.zoo(),month столбец был удален, и df состоял только изpsit а такжеvar переменные. Должно ли это случиться?
 G. Grothendieck18 сент. 2017 г., 04:12
Вам нужно будет прочитать о зоопарке. Есть несколько виньеток.tail(z, 12+i) занимает 12 + я самых последних очков.lapply запускает анонимную функцию для каждого значения 1: 3, поэтому она вызывается три раза, один раз для i = 1, один раз для i = 2 и затем один раз для i = 3. Если вы убедитесь, что dyn и его зависимости установлены, запустите новый сеанс R, скопируйте и вставьтеdf из вопроса, а затем скопировать и вставить код в ответ я не вижу ошибок.

Ваш ответ на вопрос