r - 为因子的每个级别拟合“lm”模型
问题描述
我正在尝试编写一个函数来迭代(或使用purrr::map()
)因子的每个级别,并lm()
为因子等于该级别的数据子集拟合模型。
要使用 制作一个简单的可重现示例mtcars
,只需说我想要lm
为 的每个值使用不同的模型mtcars$gear
。我将从使它成为一个因素开始,因为我真正的问题涉及通过一个因素进行迭代:
library(tidyverse)
mtcars <- mtcars %>%
mutate(factor_gear = factor(gear))
我希望该功能适合factor_gear
. 级别由下式给出:
levels(mtcars$factor_gear)
IE
[1] "3" "4" "5"
所以我要寻找的输出是:
fit1 <- lm(mpg ~ cyl, data = mtcars %>% filter(factor_gear=="3"))
fit2 <- lm(mpg ~ cyl, data = mtcars %>% filter(factor_gear=="4"))
fit3 <- lm(mpg ~ cyl, data = mtcars %>% filter(factor_gear=="5"))
fits <- list(fit1, fit2, fit3)
我已经开始使用该功能,但无法使其正常工作。
我认为一个函数应该:
- 将因子的每个级别都放入向量中
- 为每个级别运行一个 lm 模型。
fit_each_level <- function(factor_variable) {
# trying to: 1. get every level of of the factor into a vector
factor_levels <- levels(df_cars$factor_variable)
# trying to: 2. run an lm model for each level.
for i in factor_levels {
fit <- mtcars %>% filter(factor_variable==i [# every value of segment_levels]) %>%
lm(mpg ~ cyl, data = . )
}
}
fit_each_level(factor_gear)
如果该功能运行良好,我最终可以在另一个因素上做到这一点,例如:
mtcars <- mtcars %>%
mutate(factor_carb = factor(carb))
fit_each_level(factor_carb)
解决方案
您可以nest
将数据框和用于map
申请lm
每个factor_gear
.
library(dplyr)
mtcars %>%
group_by(factor_gear) %>%
tidyr::nest() %>%
mutate(model = map(data, ~lm(mpg ~ cyl, data = .x)))
# factor_gear data model
# <fct> <list> <list>
#1 4 <tibble [12 × 11]> <lm>
#2 3 <tibble [15 × 11]> <lm>
#3 5 <tibble [5 × 11]> <lm>
在新版本dplyr
中,您可以使用cur_data
来引用组中的当前数据,从而避免使用nest
和map
。
mtcars %>%
group_by(factor_gear) %>%
summarise(model = list(lm(mpg ~ cyl, data = cur_data())))
推荐阅读
- android - DropInResult 返回 null 作为响应
- python - 回调函数不会被触发
- c# - 模型字段中的数据未更新
- java - 如何使用一对多关系休眠查询从数据库中获取所有数据
- python-3.x - 使用python格式化word(.docx)文档
- ionic-framework - 带有输入文本和单选按钮的 Ionic3 警报
- google-apps-script - 插入的图像未显示在 Google 电子表格中
- python - 在创建元类实例之前获取@staticmethod 的签名
- html - 如何在 HTML 和 CSS 中使用很棒的字体?
- angular7 - 注销申请或清除本地存储值后,本地存储值仍返回之前的值