запустить модель для каждой строки параметров модели (мета) data.frame - PullRequest
0 голосов
/ 07 ноября 2019

В духе мурлыкания, метлы, моделиста я пытаюсь создать «мета» data.frame, в котором каждая строка обозначает набор данных (d) и параметры модели (yvar, xvars, FEvars). Например:

iris2 <- iris %>% mutate(Sepal.Length=Sepal.Length^2)
meta <- data.frame(n=1:4,
           yvar = c('Sepal.Length','Sepal.Length','Sepal.Length','Sepal.Length'),
           xvars= I(list(c('Sepal.Width'),
                         c('Sepal.Width','Petal.Length'),
                         c('Sepal.Width'),
                         c('Sepal.Width','Petal.Length'))),
           data= I(list(iris,iris,iris2,iris2)) )

Теперь я хотел бы запустить модель для каждого столбца «мета». Затем добавьте столбец списка «модель» с выходным объектом модели. Для запуска модели я использую вспомогательную функцию, которая использует набор данных, переменную y и вектор переменных x:

OLS_help <- function(d,y,xvars){
  paste(y, paste(xvars, collapse=" + "), sep=" ~ ") %>% as.formula %>% 
    lm(d)
}
y <- 'Sepal.Length'
xvars <- c('Sepal.Width','Petal.Length')
OLS_help(iris,y,xvars)

Как мне выполнить OLS_help для всех строк мета и добавить выходные данныеOLS_help как столбец списка в meta? Я попробовал следующий код, но он не сработал:

meta %>% mutate(model = map2(d,yvar,xvars,OLS_help) )
Error: Can't convert a `AsIs` object to function
Call `rlang::last_error()` to see a backtrace

OBS: решение, когда только столбец со списком «данных» (вложенный) ( врезался в книгу Хэдли здесь )это:

by_country <- gapminder %>% group_by(country, continent) %>% nest()
country_model <- function(df) {  lm(lifeExp ~ year, data = df) }
by_country <- by_country %>% mutate(model = map(data, country_model)) 

1 Ответ

2 голосов
/ 08 ноября 2019

Мы можем использовать pmap следующим образом

df <- meta %>%
    as_tibble() %>%
    mutate_if(is.factor, as.character) %>%
    mutate(fit = pmap(
        list(yvar, xvars, data),
        function(y, x, df) lm(reformulate(x, response = y), data = df)))
## A tibble: 4 x 5
#      n yvar         xvars     data               fit
#  <int> <chr>        <I<list>> <I<list>>          <list>
#1     1 Sepal.Length <chr [1]> <df[,5] [150 × 5]> <lm>
#2     2 Sepal.Length <chr [2]> <df[,5] [150 × 5]> <lm>
#3     3 Sepal.Length <chr [1]> <df[,5] [150 × 5]> <lm>
#4     4 Sepal.Length <chr [2]> <df[,5] [150 × 5]> <lm>

Объяснение: pmap выполняет итерации по нескольким аргументам одновременно (аналогично базовым R * Map);здесь мы одновременно зацикливаем записи в столбцах yvar, xvar и data, затем используем reformulate для построения формулы, которая будет использоваться в lm. Мы храним lm подходящий объект в столбце fit.

...