使用 dplyr 和 augment 预测值

Predicting values with dplyr and augment

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

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

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

您需要使 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)))