【问题标题】:Add Column of Predicted Values to Data Frame with dplyr使用 dplyr 将预测值列添加到数据框中
【发布时间】:2015-09-25 02:00:14
【问题描述】:

我有一个包含一列模型的数据框,我正在尝试向其中添加一列预测值。一个最小的例子是:

exampleTable <- data.frame(x = c(1:5, 1:5),
                           y = c((1:5) + rnorm(5), 2*(5:1)),
                           groups = rep(LETTERS[1:2], each = 5))
                           
models <- exampleTable %>% group_by(groups) %>% do(model = lm(y ~ x, data = .))
exampleTable <- left_join(tbl_df(exampleTable), models)

estimates <- exampleTable %>% rowwise() %>% do(Est = predict(.$model, newdata = .["x"]))

如何向exampleTable 添加一列数字预测?我尝试使用mutate直接将列添加到表中,但没有成功。

exampleTable <- exampleTable %>% rowwise() %>% mutate(data.frame(Pred = predict(.$model, newdata = .["x"])))

错误:没有适用于“预测”的方法应用于“列表”类的对象

现在我使用bind_colsestimates 添加到exampleTable,但我正在寻找更好的解决方案。

estimates <- exampleTable %>% rowwise() %>% do(data.frame(Pred = predict(.$model, newdata = .["x"])))
exampleTable <- bind_cols(exampleTable, estimates)

如何一步完成?

【问题讨论】:

  • 您可以在一个do 步骤中进行模型拟合并获得预测值。请参阅 herehere。在您的情况下,它看起来像:exampleTable %&gt;% group_by(groups) %&gt;% do({ model = lm(y ~ x, data = .); data.frame(., estimates = predict(model))})(但通常使用换行符而不是分号)。

标签: r dplyr


【解决方案1】:

使用建模器,有一个使用 tidyverse 的优雅解决方案。

输入

library(dplyr)
library(purrr)
library(tidyr)

# generate the inputs like in the question
example_table <- data.frame(x = c(1:5, 1:5),
                            y = c((1:5) + rnorm(5), 2*(5:1)),
                            groups = rep(LETTERS[1:2], each = 5))

models <- example_table %>% 
  group_by(groups) %>% 
  do(model = lm(y ~ x, data = .)) %>%
  ungroup()
example_table <- left_join(tbl_df(example_table ), models, by = "groups")

解决方案

# generate the extra column
example_table %>%
  group_by(groups) %>%
  do(modelr::add_predictions(., first(.$model)))

解释

add_predictions 使用给定模型将新列添加到数据框中。不幸的是,它只需要一个模型作为参数。认识do。使用 do,我们可以在每个组上单独运行 add_prediction

. 代表分组数据框,.$model 模型列,first() 取每组的第一个模型。

简化

只有一个模型,add_predictions 效果很好。

# take one of the models
model <- example_table$model[[6]]

# generate the extra column
example_table %>%
  modelr::add_predictions(model)

食谱

如今,tidyverse 正在从 modelr 包转移到 recipes,因此一旦这个包成熟,这可能是新的发展方向。

【讨论】:

    【解决方案2】:

    使用 tidyverse:

    library(dplyr)
    library(purrr)
    library(tidyr)
    library(broom)
    
    exampleTable <- data.frame(
      x = c(1:5, 1:5),
      y = c((1:5) + rnorm(5), 2*(5:1)),
      groups = rep(LETTERS[1:2], each = 5)
    )
    
    exampleTable %>% 
      group_by(groups) %>%
      nest() %>% 
      mutate(model = data %>% map(~lm(y ~ x, data = .))) %>% 
      mutate(Pred = map2(model, data, predict)) %>% 
      unnest(Pred, data)
    
    # A tibble: 10 × 4
       groups      Pred     x          y
       <fctr>     <dbl> <int>      <dbl>
    1       A  1.284185     1  0.9305908
    2       A  1.909262     2  1.9598293
    3       A  2.534339     3  3.2812002
    4       A  3.159415     4  2.9283637
    5       A  3.784492     5  3.5717085
    6       B 10.000000     1 10.0000000
    7       B  8.000000     2  8.0000000
    8       B  6.000000     3  6.0000000
    9       B  4.000000     4  4.0000000
    10      B  2.000000     5  2.0000000
    

    【讨论】:

      【解决方案3】:

      嗯,这只是稍微好一点:

      answer = 
        exampleTable %>%
        group_by(groups) %>%
        do(lm( y ~ x , data = .) %>% 
             predict %>% 
             data_frame(prediction = .)) %>%
        bind_cols(exampleTable)
      

      我希望这会奏效,但它没有。

      answer = 
        exampleTable %>%
        group_by(groups) %>%
        mutate(prediction = 
                 lm( y ~ x , data = .) %>% 
                 predict)
      

      【讨论】:

        猜你喜欢
        • 2016-02-07
        • 2023-04-01
        • 1970-01-01
        • 2014-03-16
        • 2021-07-15
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        相关资源
        最近更新 更多