从 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)
}))
我想创建最近 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)
}))