2017-08-12 63 views
2

我試圖從列表中的模型中提取模型信息。 使用mtcars來說明我的問題:從模型中提取模型信息保存爲r列表中的列

mtcars %>% 
    nest(-cyl) %>% 
    mutate(model= map(data, ~lm(mpg~wt, data=.))) %>% 
    mutate(aic=AIC(model)) 

我得到的是錯誤信息:

Error in mutate_impl(.data, dots) : 
    Evaluation error: no applicable method for 'logLik' applied to an object of class "list". 

但是,當我這樣做,這樣一來,它的工作原理。

mtcars %>% 
    group_by(cyl) %>% 
    do(model= lm(mpg~wt, data=.)) %>% 
    mutate(aic=AIC(model)) 

任何人都可以解釋爲什麼嗎?爲什麼第二種方式有效?我無法弄清楚。在這兩種情況下,列表列「模型」都包含模型信息。但是可能會有一些差異......非常感謝。

回答

3

我們來比較這兩種方法之間的差異。除了最後的AIC呼叫外,我們還可以運行您的全部代碼,並將結果保存到ab

a <- mtcars %>% 
    nest(-cyl) %>% 
    mutate(model= map(data, ~lm(mpg~wt, data=.))) 

b <- mtcars %>% 
    group_by(cyl) %>% 
    do(model= lm(mpg~wt, data=.)) 

現在我們可以在控制檯上打印結果。

a 
# A tibble: 3 x 3 
    cyl    data model 
    <dbl>    <list> <list> 
1  6 <tibble [7 x 10]> <S3: lm> 
2  4 <tibble [11 x 10]> <S3: lm> 
3  8 <tibble [14 x 10]> <S3: lm> 

b 
Source: local data frame [3 x 2] 
Groups: <by row> 

# A tibble: 3 x 2 
    cyl model 
* <dbl> <list> 
1  4 <S3: lm> 
2  6 <S3: lm> 
3  8 <S3: lm> 

現在我們可以看到數據框b由行分組,而數據幀a不是。這是關鍵。

要提取數據幀中的AIC a,我們可以使用rowwise函數按每行對數據幀進行分組。

mtcars %>% 
    nest(-cyl) %>% 
    mutate(model= map(data, ~lm(mpg~wt, data=.))) %>% 
    rowwise() %>% 
    mutate(aic=AIC(model)) 

Source: local data frame [3 x 4] 
Groups: <by row> 

# A tibble: 3 x 4 
    cyl    data model  aic 
    <dbl>    <list> <list> <dbl> 
1  6 <tibble [7 x 10]> <S3: lm> 25.65036 
2  4 <tibble [11 x 10]> <S3: lm> 61.48974 
3  8 <tibble [14 x 10]> <S3: lm> 63.31555 

或者,我們可以使用map_dbl功能,因爲我們知道每一個AIC是數字。

mtcars %>% 
    nest(-cyl) %>% 
    mutate(model= map(data, ~lm(mpg~wt, data=.))) %>% 
    mutate(aic = map_dbl(model, AIC)) 

# A tibble: 3 x 4 
    cyl    data model  aic 
    <dbl>    <list> <list> <dbl> 
1  6 <tibble [7 x 10]> <S3: lm> 25.65036 
2  4 <tibble [11 x 10]> <S3: lm> 61.48974 
3  8 <tibble [14 x 10]> <S3: lm> 63.31555 
+0

不錯的答案。一個小問題:第二個代碼塊中的「b」不應該有「aic」列。 – mt1022

+0

@ mt1022感謝您的評論。我已經修復了我的輸出。 – www