2017-08-12 83 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