用dplyr和扩增预测值

时间:2018-07-04 08:45:35

标签: r dplyr predict broom

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

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

(请注意,由于示例数据,这些行实际上是重复的,但是对于我的原始数据却不是这种情况。)

1 个答案:

答案 0 :(得分:1)

您需要使Species中的Groupnew.datdo中当前正在处理的组中的匹配。您可以这样操作:

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