0

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

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

仅使用 Rbase函数

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)) })
4

2 回答 2

1

我通常plyr自己使用这些类型的任务,所以我猜在基础 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
于 2013-09-16T16:33:35.590 回答
1

试试这个(ix <- 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
于 2013-09-16T16:46:12.063 回答