【问题标题】:Merge two regression prediction models (with subsets of a data frame) back into the data frame (one column)将两个回归预测模型(带有数据框的子集)合并回数据框(一列)
【发布时间】:2016-06-29 13:47:51
【问题描述】:

我正在构建一年前在 SO 上提出并回答的类似问题。 与此帖相关: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 年的帖子)我将数据按 cat 变量拆分。

dat.l = split(dat, dat$cats)
dat.l 

...这里有点棘手。 2015 年的帖子建议使用 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 的中间人,所以如果我没有按照社区的喜好准确发布,请慢慢走。

【问题讨论】:

    标签: r dataframe subset prediction


    【解决方案1】:

    这是一个 dplyr 解决方案,基于您引用的上一篇文章:

    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
    

    【讨论】:

    • 哇——太棒了!我认为一旦我弄清楚 dplyr 将成为我的圣杯 - 谢谢!
    • 它确实使清理和拆分应用重组应用程序变得更加容易;另一个对总结模型非常有用的包是 broom,它与 dplyr 结合使用时非常强大。见:cran.r-project.org/web/packages/broom/vignettes/…
    • 好东西。我去看看扫帚。
    猜你喜欢
    • 2015-04-18
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2020-12-23
    • 2021-12-18
    • 2018-10-30
    相关资源
    最近更新 更多