Я не могу прочитать ваши данные, но, используя BOD
(который поставляется с R), мы выполняем скользящую регрессию, используя окно из 5 строк, или, если 5 строк недоступны, тогда используем количество доступных строк при условии, по крайней мере, 3строки доступны.Также мы проверяем, что есть как минимум 3 полных дела.
Мы делаем выше, используя вектор ширины, а не одну ширину.Этот вектор указывает, сколько строк использовать. Если доступно как минимум 5 строк, мы используем 5, а в противном случае используем количество доступных строк;однако, если количество доступных строк меньше 3, то мы используем 3, что приведет к созданию NA для этой строки.
В пределах coefs
мы также проверяем, есть ли менее 3 завершенных случаев, и возвращаемNA, если да.
library(zoo)
n <- nrow(BOD) # 6
w <- pmax(pmin(1:n, 5), 3) # 3 3 3 4 5 5
coefs <- function(x) {
if (sum(complete.cases(x)) >= 3) coef(lm(as.data.frame(x))) else c(NA, NA)
}
rollapplyr(BOD[2:1], w, coefs, by.column = FALSE, fill = NA)
дает:
(Intercept) Time
[1,] NA NA
[2,] NA NA
[3,] 1.833333 5.350000
[4,] 5.450000 3.180000
[5,] 7.750000 2.030000
[6,] 10.674324 1.301351
Это дает то же самое:
rbind(c(NA, NA),
c(NA, NA),
coefs(BOD[1:3, 2:1]),
coefs(BOD[1:4, 2:1]),
coefs(BOD[1:5, 2:1]),
coefs(BOD[2:6, 2:1]))
Обновление
Короче dput
добавленный вывод дал синтаксическую ошибку, но на этот раз он был достаточно коротким, чтобы я смог отредактировать его (см. примечание в конце) во что-то, что работает.
Мы используем ширину 8 или если доступно менее 8мы используем минимум 4, иначе мы возвращаем NA.Также мы используем как минимум 3 полных случая, если coefs
.
Мы конвертируем DF в объект зоопарка и предполагаем, что последний (3-й столбец) является зависимой переменной, а два других столбца являются независимыми переменными.
library(zoo)
n <- nrow(DF) # 10
w <- pmax(pmin(1:n, 8), 4) # [1] 4 4 4 4 5 6 7 8 8 8
coefs <- function(x) {
if (sum(complete.cases(x)) >= 3) coef(lm(as.data.frame(x))) else c(NA, NA)
}
z <- read.zoo(DF)[, c(3, 1, 2)]
rollapplyr(z, w, coefs, by.column = FALSE, fill = NA)
давая этому объекту зоопарка:
(Intercept) `10001` `93436`
2016-01-04 NA NA NA
2016-01-05 NA NA NA
2016-01-06 NA NA NA
2016-01-07 -0.031077046 -2.44567879 -2.7398798
2016-01-08 -0.034601587 -2.65028219 -3.2757924
2016-01-11 0.003069533 0.35951677 1.2452355
2016-01-12 -0.001737647 0.15052197 0.7341502
2016-01-13 -0.001773568 0.09143210 0.5979455
2016-01-14 -0.001173643 0.07543222 0.6164919
2016-01-15 -0.005337689 0.28461054 0.6305395
Примечание
DF <- structure(list(date = structure(c(16804, 16805, 16806, 16807,
16808, 16811, 16812, 16813, 16814, 16815), class = "Date"), `10001` = c(NA,
-0.0132978723404255, 0.0148247978436657, 0.0146082337317397,
0.0196335078534031, 0.0346598202824133, 0.0235732009925558, 0,
-0.0145454545454544, -0.0172201722017221), `93436` = c(NA, 8.95215075422673e-05,
-0.0196482119679542, -0.0154766252739225, -0.0215627173661025,
-0.0149289099526067, 0.0101996632186674, -0.0460065723674811,
0.0293045779042485, -0.00577165583470751), mktrf = c(-0.0159,
0.0012, -0.0135, -0.0244, -0.0111, -6e-04, 0.0071, -0.0267, 0.0165,
-0.0214)), row.names = c(NA, 10L), class = "data.frame")