如何使用存储在data.table或tibble中的线性模型添加预测列?

时间:2019-07-03 21:15:24

标签: r data.table tidyverse lm predict

我在一张表中存储了许多线性模型。现在,在给定相应行中一个x值的情况下,我想使用覆盖范围行中的模型来预测一个y值。

困难是由data.table和tidyverse提取表中模型的方式引起的。 Forecast.lm函数需要在“列表”类中包含“ lm”类对象。

library(data.table)

model1 <- lm( y~x, data= data.table( x=c(1,2,3,4) , y=c(1,2,1,2) ))
model2 <- lm( y~x, data= data.table( x=c(1,2,3,4) , y=c(1,2,3,3) ))

model_dt <- data.table( id = c(1,2), model = list(model1, model2), x = c(3,3))

现在model_dt包含线性模型和所需的x值。

逐行预测效果很好:

predict.lm( model_dt[1]$model[[1]], model_dt[1])  # yields 1.6
predict.lm( model_dt[2]$model[[1]], model_dt[2])  # yields 2.6

但是直接添加列会导致错误:

model_dt[, pred_y := predict.lm( model , x )]         # ERROR
model_dt[, pred_y := predict.lm( model , x ), by=id]  # ERROR

================================================ =================

tidyverse中的相​​同设置:

library(tidyverse)

model1 <- lm( y~x, data= tibble( x=c(1,2,3,4) , y=c(1,2,1,2) ))
model2 <- lm( y~x, data= tibble( x=c(1,2,3,4) , y=c(1,2,3,3) ))

model_dt <- tibble( id = c(1,2), model = list(model1, model2), x = c(3,3))

predict.lm( model_dt[1,]$model[[1]], model_dt[1,])  # yields 1.6
predict.lm( model_dt[2,]$model[[1]], model_dt[2,])  # yields 2.6

添加带有mutate的变量失败:

model_dt %>% mutate( pred_y = predict.lm( model, x ) )  # ERROR

似乎有一个原因是,表内“ model”列中的模型不能提取为“ lm”类对象,但是在data.table或mutate函数中始终使用model [[1]]到第1行中的模型。

class( model_dt[1,]$model )      # results in class "list"
class( model_dt[1,]$model[[1]] ) # results in class "lm"

结果应为下表:

   id model x pred_y
1:  1  <lm> 3    1.6
2:  2  <lm> 3    2.6

我确信有一个简单的解决方案,并且会对输入感到非常满意。 map()或lapply()的可能解决方案也存在相同的问题。非常感谢。

================================================ =====================

编辑:除了问题using lm in list column to predict new values using purrr

之外,此问题还要求在data.table中提供解决方案

1 个答案:

答案 0 :(得分:3)

对于pip install python-gnupg,我们使用tidyverse循环遍历“模型”,对应的“ x”值,并将新数据作为map2或{ {1}}

predict

或者将data.frame(对象)与tibble

library(tidyverse)
model_dt %>% 
   mutate(pred_y = map2_dbl(model, x, ~ predict.lm(.x, tibble(x = .y))))
# A tibble: 2 x 4
#     id model      x pred_y
#   <dbl> <list> <dbl>  <dbl>
#1     1 <lm>       3   1.6 
#2     2 <lm>       3   2.60