【问题标题】:R - Using glmnet with purrr/tidyrR - 将 glmnet 与 purrr/tidyr 一起使用
【发布时间】:2017-11-07 11:50:48
【问题描述】:

我正在关注此 R Bloggers link 的代码,以便使用 tidyrpurrr 在我的数据中的组上运行模型。但是,我想在嵌套数据上使用glmnet 而不仅仅是lm。与lm 不同,glmnet/cv.glmnetmodel.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

【问题讨论】:

  • mod_form &lt;- mpg ~ cyl * hp 呢?
  • @mt1022,是的,似乎可以。我在.$ 上有点过火了。我想这仅在 y 参数上需要,因为 model.matrix 已经获得了 data = . 参数。随时发布作为答案。

标签: r dplyr tidyr glmnet purrr


【解决方案1】:

如果您想要 glmnet 的公式/数据框接口,您可以使用 glmnetUtils。这使得与 tidyverse 的交互更加方便。

install.packages("glmnetUtils")

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

【讨论】:

    【解决方案2】:

    第一部分,为什么是Error in mutate_impl(.data, dots) : object '.' not found?以下是我的推理:

    参见as.formula的手册:

    用 as.formula 创建的公式将使用 env 参数作为它们的 环境。

    创建mod_test时:根据as.formula(object, env = parent.frame()),就是&lt;environment: R_GlobalEnv&gt;

    接下来,

    一个公式对象有一个关联的环境,并且这个环境 (而不是父环境)由 model.frame 用于 评估在提供的数据参数中找不到的变量。

    因此,model.matrix 将在 data 中查找类似 @​​987654327@ 的列。显然,这些列被称为mpg 而不是.$mpg。然后它将在与公式相关联的 env 中查找.$mpg:R_GlobalEnv。全局环境中没有名为 . 的对象。因此报错。

    (如果这部分有错误,请纠正我。)


    二、解决办法,试试:

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

    【讨论】:

      猜你喜欢
      • 2019-03-17
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多