【问题标题】:R base vs plyr regression outputR base vs plyr回归输出
【发布时间】:2013-09-16 16:23:27
【问题描述】:

我正在使用 plyr 包按 SUBJECT 和 YEAR 对面板数据进行回归。我想仅使用 R base 函数复制来自 plyr 的输出。特别是,plyr 包保留了 SUBJECT 和 YEAR 变量名称,但 base 函数没有。是否可以仅使用 R base 函数复制 plyr 输出?以下是我尝试过的代码示例:

data <- data.frame(SUBJECT=c(rep('FISHER',10), rep('HUNTER',10)), YEAR=c(rep(2011,5), rep(2012,5), rep(2011,5), rep(2012,5)), y=rnorm(20), x=rnorm(20))
data

仅使用 R base 函数

with(data, t(sapply(split(data, list(SUBJECT,YEAR), drop=TRUE), function(x) { coef(lm(y ~ x, data = x)) })))

使用plyr 函数

library(plyr)
ddply(data, .(SUBJECT,YEAR), function(x) { coef(lm(y ~ x, data = x)) })

【问题讨论】:

    标签: r output regression plyr


    【解决方案1】:

    试试这个(ix &lt;- 1:2 也可以):

    ix <- c("SUBJECT", "YEAR")
    reg <- function(DF) cbind(  DF[1, ix],  t(coef(lm(y ~ x, DF)))  )
    do.call(rbind, by(data, data[ix], reg))
    

    这给出了这个:

      SUBJECT YEAR (Intercept)           x
    1  FISHER 2011   0.8665496  0.25377389
    2  HUNTER 2011   0.4954567  0.05370458
    3  FISHER 2012   0.5280182  0.95038956
    4  HUNTER 2012  -0.8319516 -0.04778639
    

    【讨论】:

    • 没有注意到你几乎相同的反应。我已经对其进行了一些小的改进。
    • @G.Grothendieck,没有结束括号肯定更容易看:p
    【解决方案2】:

    我自己通常使用plyr 来处理这些类型的任务,所以我猜在base R 中有一种更简洁的方法可以做到这一点,但这里有一个解决方案:

    > runRegression <- function(v){
    +   sub <- data[data$SUBJECT == v[1] & data$YEAR == v[2],]
    +   coef(lm(y ~ x, data = sub))
    + }
    > 
    > cbind(unique(data[,c("SUBJECT","YEAR")]),t(apply(unique(data[,c("SUBJECT","YEAR")]),1,runRegression)))
       SUBJECT YEAR (Intercept)          x
    1   FISHER 2011   0.3409430  0.2860310
    6   FISHER 2012   0.1065906  0.5851614
    11  HUNTER 2011  -0.3774422  0.9029407
    16  HUNTER 2012   0.1697793 -0.5429523
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多