【问题标题】:R - using regression functions within a groupR - 在组内使用回归函数
【发布时间】:2013-08-05 09:20:18
【问题描述】:

假设我有一个数据框df,其中包含三个变量df$xdf$ydf$z,并且有一个分组变量df$g

通常,要在每个组内计算一个函数,我会执行以下操作

df$new<-unlist(tapply(df$x,df$g,FUN=myfunc))

现在假设我想在yzg 的每个值内从x 的回归生成残差,我该如何实现它?

更具体地说,如果不使用组,我会这样做

df$new<-resid(lm(df$x ~ df$y + df$z, na.action, na.exclude))

在组内执行前面的操作的一个解决方案是对 `df$g' 的唯一元素使用循环,但如果有任何矢量化解决方案,那就太好了。

【问题讨论】:

  • 你检查过 plyr 包中的ddply 吗?
  • 检查?by中的最后一个示例
  • This post 可能会有所帮助。

标签: r loops vectorization regression


【解决方案1】:
library(plyr)
ddply(mydata,.(g),transform, new=resid(lm(x ~ y + z, na.action, na.exclude)))

使用mtcars数据进行测试:

mydata<-mtcars

myres<-ddply(mydata,.(carb),transform, new=resid(lm(mpg ~ disp + hp))) # g=carb, x=mpg,y=disp,z=hp
> head(myres)
   mpg cyl  disp  hp drat    wt  qsec vs am gear carb         new
1 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1  0.20604566
2 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1  2.03023747
3 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 -2.39754247
4 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1  1.31212635
5 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1  2.60271481
6 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1  0.03913515

【讨论】:

    【解决方案2】:

    data.table 中你可以使用by

    library(data.table)
    DT <- data.table(df)
    
    
    DT[, new := resid(lm(x ~ y + z, na.action, na.exclude)), by = g]
    

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 2018-10-10
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多