我在一张表中存储了许多线性模型。现在,在给定相应行中一个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中提供解决方案答案 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