【问题标题】:Linear regression with ongoing data, in R在 R 中使用正在进行的数据进行线性回归
【发布时间】:2021-02-03 06:34:57
【问题描述】:

模型

y ~ x1 + x2 + x3

大约 1000 行

我想做的是“一步一步”做预测

使用行 0:20 预测 21:30 的 y,然后使用 11:30 预测 31:40 的 y,依此类推。

【问题讨论】:

  • “用最后 20 行预测接下来的 10 个结果”中的“最后 20 行”是什么意思?此外,您应该添加您尝试过的代码,以及一些供我们使用的数据(您的 df 中的第一行,尝试使用 dput 函数)
  • 您可以考虑在训练和验证数据集中使用数据集的随机 2/3 拆分。然后在训练数据集上训练一个线性模型,并在您的验证数据集上对其进行验证。根据您的数据集和想法,它可能更有意义。

标签: r loops regression lm


【解决方案1】:

你可以使用predict函数:

mod = lm(y ~ ., data=df[1:990,])
pred = predict(mod, newdata=df[991:1000,2:4])

编辑:在循环中更改训练数据的范围:

index = seq(10,990,10)
pred = matrix(nrow=10, ncol=length(index)) 

for(i in index){
  mod = lm(y ~ ., data=df[1:i,])
  pred[,i/10] = predict(mod, newdata=df[(i+1):(i+10),2:4])
  MSE[i/10] = sum((df$y[(i+1):(i+10)]-pred[,i/10])^2)}

mean(MSE)

【讨论】:

  • 我之前确实使用过 lm 函数,结果非常糟糕,我想尝试的是在循环中“逐步”进行回归,我使用 0:20 来预测20:30 然后 10:30 到 30:40 以此类推,但非常感谢您的快速答复
  • 检查它现在是否有效。如果可以,请添加一些数据,以便我在回答之前对其进行测试。
  • 谢谢,我会试试的。
  • 我的索引有误,刚刚重新编辑。还在循环内添加了 MSE 计算。
【解决方案2】:

你在寻找这样的东西吗?

# set up mock data
set.seed(1)
df <- data.frame(y = rnorm(1000),
                 x1 = rnorm(1000),
                 x2 = rnorm(1000),
                 x3 = rnorm(1000))

# for loop
prd <- list()

for(i in 1:970){
 
 # training data
 trn <- df[i:(i+20), ]

 # test data
 tst <- df[(i+21):(i+30), ]
 
 # lm model 
 mdl <- lm(y ~ x1 + x2 + x3, trn)

 # append a list of data.frame with both predicted and actual values
 # for later confrontation
 prd[[i]] <- data.frame(prd = predict(mdl, tst[-1]),
                        act = tst[[1]])
 
}

# your list
prd

您还可以通过slider 包尝试更高级的东西:

# define here your model and how you wanna handle the preditions
sliding_lm <- function(..., frm, n_trn, n_tst){

 df <- data.frame(...)
 trn <- df[1:n_trn, ]
 tst <- df[n_trn+1:n_tst, ]
 
 mdl <- lm(y ~ x1 + x2 + x3, trn)
 data.frame(prd = predict(mdl, tst[-1]),
            act = tst[[1]])
 
}

n_trn <- 20 # number of training obs
n_tst <- 10 # number of test obs
frm <- y ~ x1 + x2 + x3 # formula of your model

prd <- slider::pslide(df, sliding_lm, 
                      frm = frm,
                      n_trn = n_trn,
                      n_tst = n_tst,
                      .after = n_trn + n_tst, 
                      .complete = TRUE)

请注意,列表中的最后 30 个条目为 NULL,因为您只查看完整的窗口 [30 个带有训练和测试的观察结果]

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 2022-01-11
    • 2019-09-11
    • 2013-10-23
    • 2015-10-03
    • 2018-07-31
    • 2021-03-02
    • 1970-01-01
    相关资源
    最近更新 更多