(Эффективное) решение
Вот что вы можете сделать:
p <- 3 ## number of parameters in lm()
n <- nrow(dat) - 1
## a function to return what you desire for subset dat[1:x, ]
bundle <- function(x) {
fit <- lm(log(clicks) ~ log(v1) + log(v12), data = dat, subset = 1:x, model = FALSE)
pred <- predict(fit, newdata = dat[x+1, ], se.fit = TRUE)
c(summary(fit)$adj.r.squared, pred$fit, pred$se.fit)
}
## rolling regression / prediction
result <- t(sapply(p:n, bundle))
colnames(result) <- c("adj.r2", "prediction", "se")
Обратите внимание, что я сделал несколько вещей внутри функции bundle
:
- Я использовал аргумент
subset
для выбора подмножества, которое подходит
- Я использовал
model = FALSE
, чтобы не сохранять кадр модели, поэтому мы сохраняем рабочее пространство.
В целом, очевидной петли нет, но используется sapply
.
- Подгонка начинается с
p
, минимального количества данных, необходимых для подбора модели с p
коэффициентами;
- Подгонка заканчивается на
nrow(dat) - 1
, так как нам как минимум нужен последний столбец для предсказания.
Тест
Пример данных (с 30 «наблюдениями»)
dat <- data.frame(clicks = runif(30, 1, 100), v1 = runif(30, 1, 100),
v12 = runif(30, 1, 100))
Применение кода выше дает results
(всего 27 строк, усеченный вывод для 5 строк)
adj.r2 prediction se
[1,] NaN 3.881068 NaN
[2,] 0.106592619 3.676821 0.7517040
[3,] 0.545993989 3.892931 0.2758347
[4,] 0.622612495 3.766101 0.1508270
[5,] 0.180462206 3.996344 0.2059014
Первый столбец представляет собой скорректированное значение R.squared для подобранной модели, а второй столбец представляет собой прогноз. Первое значение для adj.r2
равно NaN
, потому что первая модель, которую мы подогнали, имеет 3 коэффициента для 3 точек данных, поэтому разумная статистика недоступна. То же самое происходит и с se
, поскольку подобранная линия не имеет нулевых остатков, поэтому прогноз выполняется без неопределенности.
person
Zheyuan Li
schedule
26.06.2016