将两个回归预测模型(具有数据框的子集)合并回数据框(一列)
Merge two regression prediction models (with subsets of a data frame) back into the data frame (one column)
我正在构建一年前在 SO 上提出和回答的类似问题。
它与此有关post:how to merge two linear regression prediction models (each per data frame's subset) into one column of the data frame
我将使用与此处相同的数据,但使用新列。
我创建数据:
dat = read.table(text = " cats birds wolfs snakes trees
0 3 8 7 2
1 3 8 7 3
1 1 2 3 2
0 1 2 3 1
0 1 2 3 2
1 6 1 1 3
0 6 1 1 1
1 6 1 1 1 " ,header = TRUE)
对狼的数量进行建模,使用数据的两个子集来区分条件。每个子集的方程式都不同。
f0 = lm(wolfs~snakes,data = dat,subset=dat$cats==0)
f1 = lm(wolfs~snakes + trees,data = dat,subset=dat$cats==1)
预测每个子集中的狼数量。
f0_predict = predict(f0,data = dat,subset=dat$cats==1,type='response')
f1_predict = predict(f1,data = dat,subset=dat$cats==0,type='response')
然后(同样,根据 2015 post)我将数据按 cats 变量拆分。
dat.l = split(dat, dat$cats)
dat.l
...这里有点棘手。 2015 post 建议使用 lapply 将两组预测附加到数据集。但是,在这里,受访者函数不起作用,因为它假设两个回归方程基本相同。这是我的尝试(它接近原始版本,只是经过调整):
dat.l = lapply(dat.l, function(x){
mod =
ifelse(dat$cats==0,lm(wolfs~snakes,data=x),lm(wolfs~snakes+trees,data=x))
x$full_prediction = predict(mod,data=x,type='response')
return(x)
})
unsplit(dat.l, dat$cats)
关于最后几个步骤有什么想法吗?我对 S.O 还是比较陌生,是 R 的中级水平,所以如果我没有post完全按照社区的喜好进行编辑,请慢慢来。
这是一个 dplyr 解决方案,建立在您引用的先前 post 的基础上:
library(dplyr)
# create a new column defining the lm formula for each level of cats
dat <- dat %>% mutate(formula = ifelse(cats==0, "wolfs ~ snakes",
"wolfs ~ snakes + trees"))
# build model and find predicted values for each value of cats
dat <- dat %>% group_by(cats) %>%
do({
mod <- lm(as.formula(.$formula[1]), data = .)
pred <- predict(mod)
data.frame(., pred)
})
> dat
Source: local data frame [8 x 7]
Groups: cats [2]
cats birds wolfs snakes trees formula pred
(int) (int) (int) (int) (int) (chr) (dbl)
1 0 3 8 7 2 wolfs ~ snakes 7.5789474
2 0 1 2 3 1 wolfs ~ snakes 2.6315789
3 0 1 2 3 2 wolfs ~ snakes 2.6315789
4 0 6 1 1 1 wolfs ~ snakes 0.1578947
5 1 3 8 7 3 wolfs ~ snakes + trees 7.6800000
6 1 1 2 3 2 wolfs ~ snakes + trees 2.9600000
7 1 6 1 1 3 wolfs ~ snakes + trees 0.8400000
8 1 6 1 1 1 wolfs ~ snakes + trees 0.5200000
我正在构建一年前在 SO 上提出和回答的类似问题。 它与此有关post:how to merge two linear regression prediction models (each per data frame's subset) into one column of the data frame
我将使用与此处相同的数据,但使用新列。 我创建数据:
dat = read.table(text = " cats birds wolfs snakes trees
0 3 8 7 2
1 3 8 7 3
1 1 2 3 2
0 1 2 3 1
0 1 2 3 2
1 6 1 1 3
0 6 1 1 1
1 6 1 1 1 " ,header = TRUE)
对狼的数量进行建模,使用数据的两个子集来区分条件。每个子集的方程式都不同。
f0 = lm(wolfs~snakes,data = dat,subset=dat$cats==0)
f1 = lm(wolfs~snakes + trees,data = dat,subset=dat$cats==1)
预测每个子集中的狼数量。
f0_predict = predict(f0,data = dat,subset=dat$cats==1,type='response')
f1_predict = predict(f1,data = dat,subset=dat$cats==0,type='response')
然后(同样,根据 2015 post)我将数据按 cats 变量拆分。
dat.l = split(dat, dat$cats)
dat.l
...这里有点棘手。 2015 post 建议使用 lapply 将两组预测附加到数据集。但是,在这里,受访者函数不起作用,因为它假设两个回归方程基本相同。这是我的尝试(它接近原始版本,只是经过调整):
dat.l = lapply(dat.l, function(x){
mod =
ifelse(dat$cats==0,lm(wolfs~snakes,data=x),lm(wolfs~snakes+trees,data=x))
x$full_prediction = predict(mod,data=x,type='response')
return(x)
})
unsplit(dat.l, dat$cats)
关于最后几个步骤有什么想法吗?我对 S.O 还是比较陌生,是 R 的中级水平,所以如果我没有post完全按照社区的喜好进行编辑,请慢慢来。
这是一个 dplyr 解决方案,建立在您引用的先前 post 的基础上:
library(dplyr)
# create a new column defining the lm formula for each level of cats
dat <- dat %>% mutate(formula = ifelse(cats==0, "wolfs ~ snakes",
"wolfs ~ snakes + trees"))
# build model and find predicted values for each value of cats
dat <- dat %>% group_by(cats) %>%
do({
mod <- lm(as.formula(.$formula[1]), data = .)
pred <- predict(mod)
data.frame(., pred)
})
> dat
Source: local data frame [8 x 7]
Groups: cats [2]
cats birds wolfs snakes trees formula pred
(int) (int) (int) (int) (int) (chr) (dbl)
1 0 3 8 7 2 wolfs ~ snakes 7.5789474
2 0 1 2 3 1 wolfs ~ snakes 2.6315789
3 0 1 2 3 2 wolfs ~ snakes 2.6315789
4 0 6 1 1 1 wolfs ~ snakes 0.1578947
5 1 3 8 7 3 wolfs ~ snakes + trees 7.6800000
6 1 1 2 3 2 wolfs ~ snakes + trees 2.9600000
7 1 6 1 1 3 wolfs ~ snakes + trees 0.8400000
8 1 6 1 1 1 wolfs ~ snakes + trees 0.5200000