dplyr 中的多元线性模型预测

时间:2020-12-23 21:46:20

标签: r dplyr regression prediction

我正在尝试使用 dplyr 使用下面的脚本同时为多个模型生成预测。不幸的是,这导致了没有意义的重复数据。我想要的只是原始数据以及 2 个模型列(每个模型 1 个)和 2 个带有预测值的列。 谢谢

library(modelr)
install.packages("gapminder")
library(gapminder)                           
data(gapminder) 

d<-gapminder %>% 
  group_by(continent) %>%
  nest() %>% 
  mutate(model = data %>% map(~lm(lifeExp ~ pop, data = .))) %>% 
  mutate(model = data %>% map(~lm(lifeExp ~ pop + gdpPercap , data = .))) %>% 
  mutate(Pred = map2(model, data, predict)) %>% 
  mutate(Pred1 = map2(model, data, predict)) %>% 
  unnest(Pred,Pred1 data) ```

1 个答案:

答案 0 :(得分:0)

我们可以使用 nest_by 并在 mutate 中创建模型列,然后使用 ungroup 删除由 rowwise 创建的 nest_by 属性,循环遍历 ' model' 和 'data' 列带有 pmap,按照 selection 的顺序提取列,即 ..1 -> data, ..2 -> model1 和 {{ 1}}-> 模型 3。在 'data' (..3) 中创建新的“Pred”列,删除 ..1 中的 model 列和 select 'data'

unest

或者不使用 library(dplyr) library(purrr) library(tidyr) gapminder %>% nest_by(continent) %>% mutate(model1 = list(lm(lifeExp ~ pop, data = data)), model2 = list(lm(lifeExp ~ pop + gdpPercap, data = data ))) %>% ungroup %>% mutate(data = pmap(select(., data, model1, model2), ~ ..1 %>% mutate(Pred1 = predict(..2, ..1), Pred2 = predict(..3, ..1)))) %>% select(-model1, -model2) %>% unnest(c(data)) # A tibble: 1,704 x 8 # continent country year lifeExp pop gdpPercap Pred1 Pred2 # <fct> <fct> <int> <dbl> <int> <dbl> <dbl> <dbl> # 1 Africa Algeria 1952 43.1 9279525 2449. 48.8 49.2 # 2 Africa Algeria 1957 45.7 10270856 3014. 48.9 50.0 # 3 Africa Algeria 1962 48.3 11000948 2551. 48.9 49.4 # 4 Africa Algeria 1967 51.4 12760499 3247. 49.1 50.5 # 5 Africa Algeria 1972 54.5 14760787 4183. 49.2 52.0 # 6 Africa Algeria 1977 58.0 17152804 4910. 49.4 53.2 # 7 Africa Algeria 1982 61.4 20033753 5745. 49.6 54.6 # 8 Africa Algeria 1987 65.8 23254956 5681. 49.8 54.7 # 9 Africa Algeria 1992 67.7 26298373 5023. 50.0 54.0 #10 Africa Algeria 1997 69.2 29072015 4797. 50.2 53.9 # … with 1,694 more rows ,我们可以使用 pmapacross 创建新列,然后 mutate

unnest

-输出

gapminder %>%
     nest_by(continent) %>% 
     mutate(model1 = list(lm(lifeExp ~ pop, data = data)),
            model2 = list(lm(lifeExp ~ pop + gdpPercap, data = data )),
            across(starts_with('model'),  ~ list(Predict = predict(., data)),
             .names = "{.col}_Predict")) %>% 
     select(-model1, -model2)  %>%
     ungroup %>% 
     unnest(c(data, model1_Predict, model2_Predict))
相关问题