2017-08-12 9 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)) 

誰でも理由を説明できますか?なぜ二番目の方法が働くのですか?私はそれを理解できませんでした。どちらの場合も、リスト列 'model'にはモデル情報が含まれています。しかし、いくつかの違いがあるかもしれません...ありがとうございます。

答えて

3

これらの2つのアプローチの違いを比較しましょう。最後の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> 

今、私たちは、データフレームaがない間のデータフレームbは、行ごとにグループ化され見ることができます。これが鍵です。

データフレームaでAICを抽出するには、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 

または、それぞれのAICが数字であることがわかっているので、map_dbl関数を使用できます。

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

小さな問題:2番目のコードブロックの 'b'は' aic'カラムを持つべきではありません。 – mt1022

+0

@ mt1022コメントありがとうございます。私は自分の出力を修正しました。 – www

関連する問題