R中的组回归系数?

机器算法验证 r 回归 回归系数
2022-03-29 03:04:11

我有一个数据框,其中包含一个组变量 GRP(范围为 1-100)以及每个变量的 X 和 Y。我想获得每个组内 lm(Y~X) 的回归截距和斜率列表。截距和斜率不需要在同一个数据框中。

有什么建议么?R初学者在这里,所以简单会很棒!

4个回答

@Henry 和 @Zach 的回复都有效,但我认为做你想做的最直接的方法是lmListnlme包中使用:

dat <- data.frame(
  GRP = sample(c("A","B","C"), 100, replace=TRUE), 
  X = runif(100), 
  Y = runif(100)
)
require(nlme)
lmList(Y ~ X | GRP, data=dat)

data.table 也有很好的工具来解决这样的问题:

library(data.table)
set.seed(1)
dat <- data.table(x=runif(100), y=runif(100), grp=rep(1:2,50))
dat[,coef(lm(y~x)),by=grp]

每组第一行是截距,第二行是系数:

     grp         V1
[1,]   1  0.5991761
[2,]   1 -0.1350489
[3,]   2  0.4401174
[4,]   2  0.1400153

如果您宁愿拥有一个广泛的 data.frame,那只需要更多的规范:

dat[,list(intercept=coef(lm(y~x))[1], coef=coef(lm(y~x))[2]),by=grp]
     grp intercept       coef
[1,]   1 0.5991761 -0.1350489
[2,]   2 0.4401174  0.1400153

或者你可以更简洁地说:

    dat[,as.list(coef(lm(y~x))),by=grp]
    (Intercept)          x
    1:   1   0.5991761 -0.1350489
    2:   2   0.4401174  0.1400153

改编自help("by"),这个例子可以满足你的需要

mydf <- data.frame( GRP = rep(c("A","B","C"), each=100), X = rep(1:100,3), 
                    Y = rep(c(2,4,8),each=100) + 
                        rep(c(4,2,1),each=100) * rep(1:100,3) + rnorm(300))   
by(mydf, mydf$GRP, function(z) lm(Y ~ X, data = z))

如果您使用包“tidyr”,您可以执行以下操作

library(data.table)
library(tidyr)
set.seed(1)
dat <- data.table(x=runif(100), y=runif(100), grp=rep(1:2,50))

ncoefs <- 1
dat <- dat[, coef( lm(y ~ x) ), by = grp]
dat[, est := rep( c("intercept", "coef"), .N/(ncoefs + 1)) ]
dat <- dat %>% spread(est, V1)

结果是

   grp       coef intercept
1:   1 -0.1350489 0.5991761
2:   2  0.1400153 0.4401174

这种方法易于放大,并且必须比估计每个系数的回归更快。