【问题标题】:extract model info from model saved as list column in r从保存为r中的列表列的模型中提取模型信息
【发布时间】:2017-08-12 04:16:15
【问题描述】:

我正在尝试从列表列中的模型中提取模型信息。 使用 mtcars 来说明我的问题:

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))

谁能解释为什么?为什么第二种方法有效?我想不通。在这两种情况下,列表列“模型”都包含模型信息。但可能会有一些差异......非常感谢。

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    让我们比较一下这两种方法的区别。除了最后一次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 不是。这是关键。

    要提取数据帧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
    

    或者我们可以使用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
    

    【讨论】:

    • 不错的答案。一个小问题:第二个代码块中的b 不应该有aic 列。
    • @mt1022 感谢 cmets。我已经修复了我的输出。
    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多