从具有多组的线性回归中有效地提取拟合值



如何有效地从几个线性回归模型中提取拟合值,并将它们附加到用于构建模型的原始数据中?

示例数据:

library(dplyr)
# Fit several (3 in this case) linear regression models 
fitted_models <- iris %>%
group_by(Species) %>%
do(model = lm(Petal.Length~Sepal.Length+Sepal.Width, data = .))

我可以提取每组的拟合值(见下文(,但这很麻烦,如果你有10或100的模型,效率会很低。如何更有效地从模型中提取拟合数据,并将其附加回用于构建模型的数据集?

df2 <- iris[,c(5,3)]
df2$predicted <- NA
df2[1:50,3] <- fitted_models$model[[1]]$fitted.values
df2[51:100,3] <- fitted_models$model[[2]]$fitted.values 
df2[101:150,3] <- fitted_models$model[[3]]$fitted.values 
df2

创建模型后,有rowwise分组,因此我们可以直接在listunnest中提取列表列

library(dplyr)
library(tidyr)
fitted_models %>%
transmute(Species, fitted.values = list(model$fitted.values)) %>% 
ungroup %>%
unnest(fitted.values)

-输出

# A tibble: 150 × 2
Species fitted.values
<fct>           <dbl>
1 setosa           1.47
2 setosa           1.46
3 setosa           1.42
4 setosa           1.41
5 setosa           1.46
6 setosa           1.51
7 setosa           1.40
8 setosa           1.46
9 setosa           1.38
10 setosa           1.45
# … with 140 more rows

习惯嵌套的数据帧对这类事情很有帮助。以下是解决整个问题的一种方法。

你可以在这里找到更多的例子:

https://cran.r-project.org/web/packages/broom/vignettes/broom_and_dplyr.html

library(dplyr)
library(tidyr)
library(purrr)
fitted_models <- iris %>%
nest(data = -Species) %>% 
mutate(fit = map(data, ~ lm(Petal.Length ~ Sepal.Length + Sepal.Width, data = .x)),
fitted.values = map(fit, "fitted.values")) %>% 
unnest(cols = c(data, fitted.values)) %>% 
select(-fit)
> fitted_models
# A tibble: 150 x 6
Species Sepal.Length Sepal.Width Petal.Length Petal.Width fitted.values
<fct>          <dbl>       <dbl>        <dbl>       <dbl>         <dbl>
1 setosa           5.1         3.5          1.4         0.2          1.47
2 setosa           4.9         3            1.4         0.2          1.46
3 setosa           4.7         3.2          1.3         0.2          1.42
4 setosa           4.6         3.1          1.5         0.2          1.41
5 setosa           5           3.6          1.4         0.2          1.46
6 setosa           5.4         3.9          1.7         0.4          1.51
7 setosa           4.6         3.4          1.4         0.3          1.40
8 setosa           5           3.4          1.5         0.2          1.46
9 setosa           4.4         2.9          1.4         0.2          1.38
10 setosa           4.9         3.1          1.5         0.1          1.45
# ... with 140 more rows

最新更新