2017-06-06 57 views
1

爲了在我的數據中使用tidyrpurrr在我的數據組中運行模型,我從此R Bloggers link得到以下代碼。但是,我想在我的嵌套數據上使用glmnet而不僅僅是lm。不像lm,glmnet/cv.glmnet需要model.matrix作爲x的論點,我需要抽象的公式提供給那個model.matrix這就是讓我困擾。R - 使用glmnet with purrr/tidyr

所以此工程:

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 
+1

什麼'mod_form < - MPG〜缸* hp'? – mt1022

+0

@ mt1022,是的,似乎這樣做。 ''。''我有點過分了。我想這只是'y'參數需要的,因爲'model.matrix'已經獲得了'data = .'參數。隨意發佈作爲答案。 –

回答

1

第一部分爲什麼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會尋找像data.$mpg列。實際上,這些列被稱爲mpg而不是.$mpg。然後它會在env中查找與公式R_GlobalEnv相關的.$mpg。在全球環境中沒有稱爲.的對象。因此報告了錯誤。

(糾正我,如果有的這部分是錯誤的)


二,解決方案,嘗試:

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

如果您想要公式/數據框架接口glmnet,可以使用glmnetUtils。這使得與tidyverse接口更方便一些。

install.packages("glmnetUtils") 

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