我迫切需要帮助:所以我使用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)
请记住,测试数据中包含所有级别/组.
有没有更简单的方法来做到这一点.即按级别进行预测.目前我正在尝试在扫帚包中使用扩充,但它并没有真正起作用.它的作用是:它通过我的所有测试数据运行每个模型,同时忽略级别.
请帮忙!我这样做的规模要大得多,需要快速有效的东西.
对于purrr以及dplyr和tidyr 来说,这可能是一个很好的工作.该 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函数和mutate
plus 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)