在 R 中使用 dplyr 对数据子集进行多元回归

Multiple regressions with subsets of data using dplyr in R

我有一个数据框 "DF" 这个 glimpse():

Observations: 1244160
Variables:
$ Test      (fctr) 72001.txt, 72002.txt, 72003.txt, 72004.txt, 72005.txt,...
$ x         (int) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
$ y         (int) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2...
$ Value     (dbl) -77.111111, -13.111111, 13.888889, 235.888889, 138.8888...

对于每个测试,我想使用数据的 子集 模型 "Value":

  1. 函数:值 ~ x + y
  2. 数据:(x, y) / 0 < x < 6, 0 < y < 6

然后,我想使用这些模型预测 "Value" 所有数据 "DF" .

对于这些计算,我想使用 dplyr。但是,我找不到这样做的方法。这是我最后一次尝试:

DF %>% 
    group_by(Test) %>% 
    do({
        mod = lm(Value ~ x + y, data = (. %>% filter((x > 0) &  (x < 6) & (y > 0) & (y < 6))))
        print(mod)
        Pred <- predict(mod, .)
        data.frame(. , Pred)
    })
glimpse()

但它正在失败。你能帮帮我吗?

可重现的例子

为了测试答案,我们可以使用一个虚拟的可复制数据框,例如 mtcars:

mtcars %>% 
    group_by(cyl) %>% 
    do({ 
        mod = lm(mpg ~ wt + qsec, data = . %>% filter(vs == 0))
        print(mod)
        Pred <- predict(mod)
        data.frame(. , Pred)
    })
glimpse()

使用 lm 函数的 subset 参数。

results <- DF %>% 
           group_by(Test) %>% 
           do(mod = lm(Value ~ x + y, data = ., subset = foo))

要生成预测值,试试这个:

predict <- results %>% 
           do(data.frame(pred = predict(.$mod), Test = .[["Test"]]))

group_by之前保留filter

mtcars %>% 
  filter(vs==0) %>%
  group_by(cyl) %>% 
  do({ 
    mod = lm(mpg ~ wt + qsec, data = .)
    Pred <- predict(mod)
    data.frame(Pred)
  })

dplyr解决方案:

lapply(split(mtcars,mtcars$cyl), function(i){
  mod <- lm(mpg ~ wt + qsec, i[i$vs == 0,])
  Pred <- predict(mod)
  data.frame(Pred)
  })

我想我有一个答案,接近我的尝试:

results <- mtcars %>% 
    group_by(cyl) %>% 
    do({ 
        mod = lm(mpg ~ wt + qsec, data = filter(., vs == 0))
        print(mod)
        Pred <- predict(mod, .)
        data.frame(. , Pred)
    })

print(results, n=100)