我有一个数据框,其中包含一个组变量 GRP(范围为 1-100)以及每个变量的 X 和 Y。我想获得每个组内 lm(Y~X) 的回归截距和斜率列表。截距和斜率不需要在同一个数据框中。
有什么建议么?R初学者在这里,所以简单会很棒!
我有一个数据框,其中包含一个组变量 GRP(范围为 1-100)以及每个变量的 X 和 Y。我想获得每个组内 lm(Y~X) 的回归截距和斜率列表。截距和斜率不需要在同一个数据框中。
有什么建议么?R初学者在这里,所以简单会很棒!
@Henry 和 @Zach 的回复都有效,但我认为做你想做的最直接的方法是lmList
在nlme
包中使用:
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
这种方法易于放大,并且必须比估计每个系数的回归更快。