将不同的模型拟合到 R 中的每个数据子集

Div*_*ivi 5 r data.table

我有一个包含多个类的大型数据集。我的目标是为每个类别拟合一个模型,然后预测结果并在一个方面将每个类别的结果可视化。

对于可重现的示例,我使用创建了一些基本的东西mtcars。这对于每个类别的简单回归模型来说效果很好。

mtcars = data.table(mtcars)
model = mtcars[, list(fit = list(lm(mpg~disp+hp+wt))), keyby = cyl]
setkey(mtcars, cyl)
mtcars[model, pred := predict(i.fit[[1]], .SD), by = .EACHI]
ggplot(data = mtcars, aes(x = mpg, y = pred)) + geom_line() + facet_wrap(~cyl)
Run Code Online (Sandbox Code Playgroud)

但是,我想尝试像下面这样的方法,但它还不起作用。这次尝试使用了一个公式列表,但我也希望将不同的模型(一些 glms、一些树)发送到每个数据子集。

mtcars = data.table(mtcars)
factors = list(c("disp","wt"), c("disp"), c("hp"))
form = lapply(factors, function(x) as.formula(paste("mpg~",paste(x,collapse="+"))))
model = mtcars[, list(fit = list(lm(form))), keyby = cyl]
setkey(mtcars, cyl)
mtcars[model, pred := predict(i.fit[[1]], .SD), by = .EACHI]
ggplot(data = mtcars, aes(x = mpg, y = pred)) + geom_line() + facet_wrap(~cyl)
Run Code Online (Sandbox Code Playgroud)

Wei*_*ong 4

这是一种方法,我们将每个模型设置predict为未评估的列表,在data.table对象、gather输出中评估它们,并将其传递到ggplot

models = quote(list(
      predict(lm(form[[1]], .SD)),
      predict(lm(form[[2]], .SD)), 
      predict(lm(form[[3]], .SD))))

d <- mtcars
d[, c("est1", "est2", "est3") := eval(models), by = cyl]
d <- tidyr::gather(d, key = model, value = pred, est1:est3)

library(ggplot2)
ggplot(d, aes(x = mpg, y = pred)) + geom_line() + facet_grid(cyl ~ model)
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述