Вот решение, основанное на какой-то другой работе, которую я сделал. Я уверен, что это можно превратить в чисто мурлыканье и буду рад любым предложениям в этом направлении.
Мне пришлось внести некоторые изменения в ваши данные, так как значения NA
приводили к их поломке.
library(purrr)
library(dplyr)
library(tidyr)
library(broom)
d1 <- structure(list(cyear=c(2012, 2012, 2013, 2013, 2014, 2014),
x1=c(5L, 5L, 17L, 29L, 27L, 10L),
x2=c(30L, 19L, 22L, 20L, 11L,24L),
x3=c(5L, 23L, 22L, 27L, 21L, 26L),
x4=c(30L, 28L, 23L,24L, 10L, 17L),
x5=c(12L, 18L, 17L, 16L, 30L, 26L)),
row.names=c(NA, 6L), class="data.frame")
models <- nest(d1, -cyear)
str(models)
reg_vars <- c("x1", "x2", "x3", "x4")
# The following loops through each of the independent
for(i in 1:length(reg_vars)){
var_mdl <- rlang::sym(paste0(reg_vars[i], "_mdl")) # create the name of a model
var_res <- rlang::sym(paste0(reg_vars[i], "_res")) # create the name of the results
formula = as.formula(paste0(reg_vars[i], " ~ x5")) # create the regression formula
print(formula)
models <- models %>%
mutate(
# create the model as an element in the nested data
!!var_mdl := map(data, ~ lm(formula, data = ., na.action = "na.omit")),
# tidy the model results into an element
!!var_res := map(!!var_mdl, tidy)
)
}
models
reg_vars2 <- paste0(reg_vars, "_res")
reg_vars2
# clean up ####
# this will extract the regression results into a new data frame
for(i in 1:length(reg_vars2)){
if(i == 1){
results <- rlang::sym(reg_vars2[i])
out_df <- models %>%
select(cyear, !!results) %>%
unnest(!!results)
}
results <- rlang::sym(reg_vars2[i])
temp_df <- models %>%
select(cyear, !!results) %>%
unnest(!!results)
out_df <- bind_rows(out_df, temp_df)
}
head(out_df)