Я пытаюсь разместить несколько разных моделей в одном наборе данных. Каждая из моделей использует различную комбинацию исходной переменной и подмножества данных. Чтобы соответствовать всем этим моделям, я создал фрейм данных с одним столбцом для переменной результата и одним столбцом, определяющим подмножество данных (в виде строки). (Обратите внимание, что подмножества перекрываются, поэтому не представляется очевидным способ сделать это с помощью nest ().) Затем я создал новую функцию, которая берет одну строку этого фрейма данных и вызывает «lm», используя эти параметры. Наконец, я использую pmap для отображения этой функции на фрейм данных.
После нескольких экспериментов я нашел подход, который работает, но он довольно не элегантен (см. Ниже упрощенную версию того, что я сделал). Похоже, должен быть способ передать условие подмножества в аргумент подмножества в lm, а не использовать parse (eval (text = condition)), чтобы сначала создать логический вектор. Я прочитал раздел Advanced R по метапрограммированию в надежде, что они дадут некоторое представление, но я не смог найти ничего, что работает.
Любые предложения будут полезны.
library(tidyverse)
outcomes <- c("mpg", "disp")
sub_conditions <- c("mtcars$cyl >=6", "mtcars$wt > 2")
models <- expand.grid(y = outcomes, condition = sub_conditions) %>% mutate_all(as.character)
fit <- function(y, condition) {
# Create the formula to use in all models
rx <- paste(y, "~ hp + am")
log_vec <- eval(parse(text = condition))
lm(rx, data = mtcars[log_vec,])
}
t <- pmap(models, fit)