我有一个数据框,其中包含一列响应变量和几列预测变量。我想分别使用每个预测变量来拟合响应变量的模型,最后创建一个包含模型系数的数据框。以前,我会这样做:
data(iris)
iris_vars <- c("Sepal.Width", "Petal.Length", "Petal.Width")
fits.iris <- lapply(iris_vars, function(x) {lm(substitute(Sepal.Length ~ i, list(i = as.name(x))), data = iris)})
# extract model coeffs, so forth and so on, eventually combining into a result dataframe
iris.p <- as.data.frame(lapply(fits.iris, function(f) summary(f)$coefficients[,4]))
iris.r <- as.data.frame(lapply(fits.iris, function(f) summary(f)$r.squared))
dplyr
但是,现在我已经开始使用,broom
等,这似乎有点麻烦。使用purrr::map
我可以或多或少地重新创建这个模型列表:
# using purrr, still uses the Response variable "Sepal.Length" as a predictor of itself
iris %>%
select(1:4) %>%
# names(select(., 2:4)) %>% this does not work
names() %>%
paste('Sepal.Length ~', .) %>%
map(~lm(as.formula(.x), data = iris))
但是,我不确定如何将此列表转换为与broom::tidy
. 如果我使用分组行而不是列,我将存储模型拟合并broom::tidy
用于执行以下操作:
iris.fits <- group_by(Species) %>% do(modfit1 = lm(Sepal.Length~Sepal.Width,data=.))
tidy(iris.fits, modfit1)
当然这不是我正在做的,但我希望在使用数据列时有类似的过程。有没有办法,也许可以使用purrr::nest
或类似的东西来创建所需的输出?