【问题标题】:Predicting values with dplyr and augment使用 dplyr 和 augment 预测值
【发布时间】:2018-07-04 08:45:34
【问题描述】:

我想将模型拟合到分组数据框,然后为每个模型(即组)预测一个新值。

library(dplyr)
library(broom)

data(iris)
dat <- rbind(iris, iris) 
dat$Group <- rep(c("A", "B"), each = 150)

new.dat <- data.frame(Group = rep(c("A", "B"), each = 3),
                      Species = rep(c("setosa", "versicolor", "virginica"), times = 2),
                      Sepal.Width = 1:6)
> new.dat
  Group    Species val
1     A     setosa   1
2     A versicolor   2
3     A  virginica   3
4     B     setosa   4
5     B versicolor   5
6     B  virginica   6

但是,augment 返回 36 行,好像每个新值都适合每个模型。如何在此处保留分组并为每组获取一个拟合值?

dat %>%
  group_by(Species, Group) %>%
  do(augment(lm(Sepal.Length ~ Sepal.Width, data = .), newdata = new.dat))

# A tibble: 36 x 5
# Groups:   Species, Group [6]
   Group Species    Sepal.Width .fitted .se.fit
   <fct> <fct>            <int>   <dbl>   <dbl>
 1 A     setosa               1    3.33  0.221 
 2 A     versicolor           2    4.02  0.133 
 3 A     virginica            3    4.71  0.0512
 4 B     setosa               4    5.40  0.0615
 5 B     versicolor           5    6.09  0.145 
 6 B     virginica            6    6.78  0.234 
 7 A     setosa               1    3.33  0.221 
 8 A     versicolor           2    4.02  0.133 
 9 A     virginica            3    4.71  0.0512
10 B     setosa               4    5.40  0.0615
# ... with 26 more rows

(请注意,由于示例数据,行实际上是重复的,但我的原始数据并非如此)。

【问题讨论】:

    标签: r dplyr predict broom


    【解决方案1】:

    您需要使new.datSpeciesGroupdo 中当前正在处理的组匹配。你可以这样做:

    group.cols <- c("Species", "Group")
    dat %>%
        group_by(!!! group.cols) %>%
        do(augment(lm(Sepal.Length ~ Sepal.Width, data = .),
                   newdata = semi_join(new.dat, ., by = group.cols)))
    

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 2020-11-21
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 2015-09-17
      • 2020-12-25
      • 1970-01-01
      相关资源
      最近更新 更多