У меня есть фреймворк с одним столбцом переменной ответа и несколькими столбцами переменных-предикторов. Я хочу подобрать модели для переменной ответа, используя каждую из переменных-предикторов отдельно, и, наконец, создать фрейм данных, содержащий коэффициенты модели. Раньше я бы сделал так:
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
или что-то подобное для создания желаемого результата?
map_df(tidy)
, добавленный в вашу трубу, близок к тому, что вы хотите? - person aosmith   schedule 20.12.2016map_df(tidy)
близко. Хотя,map_df(glance)
не работает. - person nofunsally   schedule 20.12.2016setNames
перед использованиемglance
, если вы определите вектор переменных, используемых в качестве независимых переменных. Например, если вы просто работаете сiris_vars
, вы можете сделать что-то вроде... %>% setNames(., iris_vars) %>% map_df(glance, .id = "variable")
- person aosmith   schedule 20.12.2016Error in data.frame(r.squared = r.squared, adj.r.squared = adj.r.squared, : object 'fstatistic' not found
- person nofunsally   schedule 20.12.2016glance
и тем фактом, что одна из ваших моделей имеет проблемы с использованием одной и той же переменной в левой и правой частях формулыlm
. Почувствуйте разницу сmap(iris_vars, ~lm(as.formula(paste("Sepal.Length ~", .x)), data = iris)) %>% setNames(., iris_vars) %>% map_df(glance, .id = "variable")
- person aosmith   schedule 20.12.2016