R - Использование glmnet с муррр/тидыр

Я использую код по этой ссылке R Bloggers. чтобы запускать модели в группах в моих данных, используя tidyr и purrr. Однако я хотел бы использовать glmnet, а не просто lm для вложенных данных. В отличие от lm, glmnet/cv.glmnet принимает model.matrix в качестве аргумента x, и мне нужно абстрагировать формулу, переданную этому model.matrix, и это то, что меня удерживает.

Итак, это работает:

library(purrr)
library(tidyr)
library(dplyr)
library(glmnet)

mod_test <- mtcars %>%
  nest(-vs) %>%
  mutate(cv_mod = map(data, ~ cv.glmnet(
    x = model.matrix(data = ., .$mpg ~ .$cyl * .$hp)[,-1],
    y = .$mpg
  )))
mod_test
> mod_test
# A tibble: 2 x 3
     vs               data          cv_mod
  <dbl>             <list>          <list>
1     0 <tibble [18 x 10]> <S3: cv.glmnet>
2     1 <tibble [14 x 10]> <S3: cv.glmnet>

Но когда я пытаюсь создать формулу для model.matrix отдельно, это не так.

mod_form <- as.formula(".$mpg ~ .$cyl * .$hp")

mod_test2 <- mtcars %>%
  nest(-vs) %>%
  mutate(cv_mod = map(data, ~ cv.glmnet(
    x = model.matrix(data = ., mod_form)[,-1],
    y = .$mpg
  )))
Error in mutate_impl(.data, dots) : object '.' not found

person Nick Criswell    schedule 06.06.2017    source источник
comment
А как насчет mod_form <- mpg ~ cyl * hp?   -  person mt1022    schedule 06.06.2017
comment
@ mt1022, да, похоже, так и есть. Я немного переборщил с .$. Я предполагаю, что это необходимо только для аргумента y, потому что model.matrix уже получает аргумент data = .. Не стесняйтесь публиковать в качестве ответа.   -  person Nick Criswell    schedule 06.06.2017


Ответы (2)


Первая часть, почему Error in mutate_impl(.data, dots) : object '.' not found? Следующее мое рассуждение:

см. руководство as.formula:

Формулы, созданные с помощью as.formula, будут использовать аргумент env для своей среды.

При создании mod_test: согласно as.formula(object, env = parent.frame()) будет <environment: R_GlobalEnv>.

Следующий,

Объект формулы имеет связанную среду, и эта среда (а не родительская среда) используется model.frame для оценки переменных, которые не найдены в предоставленном аргументе данных.

Таким образом, model.matrix будет искать такие столбцы, как .$mpg, в data. Очевидно, эти столбцы называются mpg, а не .$mpg. Затем он будет искать .$mpg в env, связанный с формулой: R_GlobalEnv. В глобальной среде нет объекта с именем .. Поэтому было сообщено об ошибке.

(поправьте меня, если какая-то часть этой части неверна.)


Во-вторых, решение, попробуйте:

mod_form <- mpg ~ cyl * hp
# or
mod_form <- as.formula('mpg ~ cyl * hp')
person mt1022    schedule 06.06.2017

Вы можете использовать glmnetUtils, если вам нужен интерфейс формулы/фрейма данных для glmnet. Это делает взаимодействие с tidyverse немного более удобным.

install.packages("glmnetUtils")

mod_test <- mtcars %>%
  nest(-vs) %>%
  mutate(cv_mod=map(data, ~ cv.glmnet(mpg ~ cyl + hp, data=.)))
person Hong Ooi    schedule 06.06.2017