从 R 中的 lm 模型中获取最后 X 天数据的系数和截距值,并在第二天重复并使用它创建数据框

get the coefficients and intercept value of the last X days of data from a lm model in R and repeat for the next day and create a dataframe with it

我想创建最近 X 天的系数并在那天截取并粘贴,然后移至第二天并再次粘贴最后 X 天的系数并截取等等。

我使用 R 自带的数据集 economics

这是我目前的代码

library(plyr)
library(readr)
library(dplyr)
library(caret)
library(ggplot2)
library(repr)

dat <- economics

drops <- c("date")
dat <- dat[ , !(names(dat) %in% drops)]


cols = c('pce', 'pop', 'psavert', 'uempmed')

pre_proc_val <- preProcess(dat[,cols], method = c("center", "scale"))


dat[,cols] = predict(pre_proc_val, dat[,cols])




###### Linear Regression

number_days = 30

lr = lm(unemploy ~ uempmed + psavert + pop + pce, data = dat)


dataframecoefficients  <- as.data.frame(lr$coefficients)

这段代码会给我所有数据的系数,但我需要的是从第一行抓取数据,直到 number_days 的值计算该数据的系数和截距并粘贴它在第 30 行旁边,然后它将移动到第 31 行并重复该过程并将值粘贴到第 31 行,依此类推,直到到达文件末尾

最终结果会是这样

        ce           pop       psavert      uempmed    unemploy   (Intercept) uempmed psavert pop pce 
  

27   -1.1827734   -1.4739945  1.0231339  -0.951801535  3040            NA       NA      NA    NA   NA
28   -1.1812833   -1.4682151  0.9556616  -1.00050309   3049            NA       NA      NA    NA   NA
29   -1.1807210   -1.4628175  1.0231339  -0.927450756  2856            NA       NA      NA    NA   NA
30   -1.1800743   -1.4580468  1.0906062  -0.976152314  2884           1771      2343   3244   232  -34
31   -1.1784155   -1.4533034  1.0906062  -0.976152314  3201           1770      2234   3100   200  -40
..   ..           ...          ....       ....          ...          ...         ...    ...    ..   ..

使用 dplyr 或类似的东西可以有效地做到这一点吗

这里有一个在 base R 中的方法:

dat <- as.data.frame(dat)
new_cols <- c('Intercept', paste0(cols, '_predict'))
dat[new_cols] <- NA

inds <- nrow(dat) - number_days

dat[(number_days+1):nrow(dat), new_cols] <- do.call(rbind, lapply(seq(inds), function(x) {
  lr = lm(unemploy ~ uempmed + psavert + pop + pce, data = dat[x:(x + number_days - 1), ])
  t(lr$coefficients)
}))