关于级别数据的预测(使用组模型)

Ali*_*ork 4 r

我迫切需要帮助:所以我使用dplyr按组运行回归.就是这样的:

regressions <- mtcars %>% group_by(cyl) %>%
do(fit = lm(wt ~ mpg + qsec + gear, .))
Run Code Online (Sandbox Code Playgroud)

我在数据框中得到如下所示的模型:

  ##     cyl     fit
  ##   (dbl)   (chr)
  ## 1     4 <S3:lm>
  ## 2     6 <S3:lm>
  ## 3     8 <S3:lm>
Run Code Online (Sandbox Code Playgroud)

现在我想预测新数据更短(即与我的训练数据不同),并且具有相同的水平.即4,6,8缸.我的问题是:如何使用new/testdata预测每个模型仅指我的测试集中的级别.

 so model cyl 4 only uses data 4 cyl to predict 
model cyl 6 uses data 6 cyl to predict
model cyl 8 uses data 8 cyl to predict
and so on and so forth.enter code here
Run Code Online (Sandbox Code Playgroud)

请记住,测试数据中包含所有级别/组.

有没有更简单的方法来做到这一点.即按级别进行预测.目前我正在尝试在扫帚包中使用扩充,但它并没有真正起作用.它的作用是:它通过我的所有测试数据运行每个模型,同时忽略级别.

请帮忙!我这样做的规模要大得多,需要快速有效的东西.

aos*_*ith 5

对于purrr以及dplyrtidyr 来说,这可能是一个很好的工作.该 purrr包是由具有列出的工作,我相信会取代do从长远来看.

例如,如果你有一个测试数据集,其中包含相同的变量,我正在调用它mtcars_test.

mtcars_test = mtcars
Run Code Online (Sandbox Code Playgroud)

您可以将此数据集拆分为三个部分cyl.

test_split = split(mtcars_test, mtcars_test$cyl)
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用map2三个模型以及拆分测试数据来进行预测.

library(purrr)

map2(regressions$fit, test_split, predict)
Run Code Online (Sandbox Code Playgroud)

结果是一个列表.在您的实际情况中,您可能希望以更整洁的格式得出结果.在这种情况下,您可以使用purrr函数和mutateplus tidyr::nest来形成原始回归结果:

library(tidyr)

regs = mtcars %>%
    group_by(cyl) %>%
    nest() %>%
    mutate(fit = map(data, ~lm(wt ~ mpg + qsec + gear, .)))
Run Code Online (Sandbox Code Playgroud)

然后通过map2如上所述添加预测mutate.do在您的示例中尝试使用after时,此方法不起作用.

regs %>% 
    mutate(testpred = map2(fit, test_split, predict))
Run Code Online (Sandbox Code Playgroud)

要获得气缸数和测试预测的最终结果,请使用tidyr::unnest.

regs %>% 
    mutate(testpred = map2(fit, test_split, predict)) %>%
    unnest(testpred)

# A tibble: 32 × 2
     cyl testpred
   <dbl>    <dbl>
1      6 3.607719
2      6 4.263550
3      6 5.418092
4      6 4.386157
5      6 3.898692
6      6 4.632542
...
Run Code Online (Sandbox Code Playgroud)