在 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":
- 函数:值 ~ x + y
- 数据:(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)
我有一个数据框 "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":
- 函数:值 ~ x + y
- 数据:(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)