Зацикливание регрессии скользящего окна со значениями NA - PullRequest
1 голос
/ 09 мая 2020

здесь проблема R-программирования.

Итак, я пытаюсь запустить несколько регрессий с скользящим окном и сохранить бета-версии для каждой регрессии. В данном примере я хочу регрессировать Y на X1 для первых 5 наблюдений. Затем сохраните бета (коэффициент наклона). Затем запустите следующие 5 (от строки 2 до строки 6) и сохраните следующую бета-версию. Я хочу сделать это три раза для разных значений X. Мои данные выглядят примерно так:

Row Y X1 X2 X3 
 1  1  2  3  NA
 2  1  3  5  NA
 3  1  4  6  NA
 4  2  4  6  4
 5  3  3  4  8
 6  4  4  6  7 
 7  3  5  5  3
 8  5  4  6  7

Код, который я пытаюсь запустить, это al oop и выглядит следующим образом:

#Rows equals the number of rows in my obs matrix.
for (j in 1:3) {
  for (i in 1:(Rows-4)) {
    Model<- lm(data[((i+0):(4+i)),1] ~ data[((i+0):(4+i)),j])
    betas[i,j] <- coefficients(Model)[2]
  }
}

Проблема в том, что моя бета-матрица дает мне только НА для третьей колонки от Х3. Итак, я получаю:


Row X1     X2   X3 
 1  coef  coef  NA
 2  coef  coef  NA
 3  coef  coef  NA
 4  coef  coef  NA

Однако я хотел бы получить что-то вроде следующих строк:

#my beta matrix looks like this

Row X1     X2   X3 
 1  coef  coef  NA
 2  coef  coef  NA
 3  coef  coef  NA
 4  coef  coef  coef

Другими словами, потому что последний столбец (X3 ) имеет некоторые начальные NA, он дает мне NA для всех будущих значений коэффициентов, даже когда окно, в котором он регрессирует, не содержит NA. Я пробовал возиться с командами na.omit, но безрезультатно.

Есть ли у кого-нибудь решение, как провести эту зацикленную регрессию? Уже очень благодарен. Всего наилучшего

Ответы [ 3 ]

0 голосов
/ 09 мая 2020

Проблема сводится к тому, что ваш столбец ссылается на j . Так как вам нужно заполнить пустую матрицу, но игнорировать первый столбец в data , добавьте 1, чтобы пропустить первый столбец, используемый в качестве зависимой переменной. И поскольку ваше окно в 4 больше, чем NA строк в 3, должны быть результаты регрессии для всех строк:

for (j in 1:3) {
  for (i in 1:(Rows-4)) {
    Model<- lm(data[i:(4+i),1] ~ data[i:(4+i), j+1])
    betas[i,j] <- coefficients(Model)[2]
  }
}

betas
#              [,1]        [,2]      [,3]
# [1,] 1.428571e-01 -0.05882353 0.2500000
# [2,] 3.333333e-01 -0.12500000 0.3461538
# [3,] 1.648597e-15 -0.37500000 0.1764706
# [4,] 0.000000e+00  0.37500000 0.2872340

Онлайн-демонстрация

0 голосов
/ 09 мая 2020

Я нашел решение проблемы. Проблема заключалась в том, что когда я начал вычислять регрессию последних столбцов (X3s), отображалось сообщение об ошибке.

Код, который предоставил правильное решение, был следующим:

for (j in 1:3) {
  for (i in 1:(Rows-4)) {
    try(Model<- lm(data[i:(4+i),1] ~ data[i:(4+i), j+1]), silent=T)
    betas[i,j] <- coefficients(Model)[2]
  }
}

Включение try позволило мне продолжить выполнение l oop и получить окончательное значение в последнем столбце. Спасибо всем за вашу помощь.

0 голосов
/ 09 мая 2020

Мы могли бы применить подход outer для применения произвольной функции ко всем комбинациям элементов и двух объектов (списков / векторов).

Нам понадобится row.list возрастающих последовательностей из пяти,

row.list <- lapply(1:(nrow(dat)-4), function(x) x:(x+4))
# [[1]]
# [1] 1 2 3 4 5
# 
# [[2]]
# [1] 2 3 4 5 6
# 
# [[3]]
# [1] 3 4 5 6 7
# 
# [[4]]
# [1] 4 5 6 7 8

и вектор ev наших независимых переменных.

ev <- c("X1", "X2", "X3")

Нам также понадобится наш regFUN, который использует reformulate для создания формул из строк,

regFUN <- Vectorize(function(x, i) lm(reformulate(x, "Y"), dat[i, -1])$coe[2])

и который мы наконец применяем ко всем комбинациям элементов наших двух объектов, используя outer.

res <- t(outer(ev, row.list, regFUN))

Result

`colnames<-`(res, ev)
#                X1          X2        X3
# [1,] 1.428571e-01 -0.05882353 0.2500000
# [2,] 3.333333e-01 -0.12500000 0.3461538
# [3,] 1.648597e-15 -0.37500000 0.1764706
# [4,] 0.000000e+00  0.37500000 0.2872340

Данные:

dat <- read.table(text="Row Y X1 X2 X3 
 1  1  2  3  NA
 2  1  3  5  NA
 3  1  4  6  NA
 4  2  4  6  4
 5  3  3  4  8
 6  4  4  6  7 
 7  3  5  5  3
 8  5  4  6  7", header=TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...