我是R的新手,但我需要使用面板数据为不同的ID运行几个简单的回归。 我有4列1. ID 2.时间3. Y 4. X和我需要为每个ID回归Y~X。我有100个ID,每个ID有120个时间段,所以我需要运行100个简单的回归,包含120个观察值。
我该怎么做?
非常感谢你提前!!!
答案 0 :(得分:2)
我们可以使用data.table
library(data.table)
setDT(df1)[, coef(lm(Y~X)), by = ID]
或者获取pvalues
setDT(df1)[, summary(lm(Y~X))$coef[,4], by = ID]
如果我们使用broom
,那么我们可以获得更多的输出列
library(broom)
setDT(df1)[, glance(lm(Y~X)), Species]
或broom/dplyr
library(dplyr)
df1 %>%
group_by(ID) %>%
do(model = lm(Y~X, .)) %>%
glance(model)
可重复的示例
data(iris)
iris %>%
group_by(Species) %>%
do(model = lm(Sepal.Width ~Petal.Width, .)) %>%
glance(model)
# Species r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual
# <fctr> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <int>
#1 setosa 0.0541735 0.03446878 0.3724741 2.749265 1.038211e-01 2 -20.546993 47.093987 52.830056 6.659375 48
#2 versicolor 0.4408943 0.42924626 0.2370691 37.851387 1.466661e-07 2 2.043799 1.912403 7.648472 2.697685 48
#3 virginica 0.2891514 0.27434209 0.2747206 19.524930 5.647610e-05 2 -5.326334 16.652669 22.388738 3.622626 48
和data.table/broom
as.data.table(iris)[, glance(lm(Sepal.Width~Petal.Width)), by = Species]
# Species r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual
#1: setosa 0.0541735 0.03446878 0.3724741 2.749265 1.038211e-01 2 -20.546993 47.093987 52.830056 6.659375 48
#2: versicolor 0.4408943 0.42924626 0.2370691 37.851387 1.466661e-07 2 2.043799 1.912403 7.648472 2.697685 48
#3: virginica 0.2891514 0.27434209 0.2747206 19.524930 5.647610e-05 2 -5.326334 16.652669 22.388738 3.622626 48
答案 1 :(得分:1)
nlme包有lmList
:
library(nlme)
fm <- lmList(Y ~ X | ID, DF, pool = FALSE)
或使用pool = TRUE
(默认值),如果您想要一个共同的池化方差。另请查看对"lmList"
类对象进行操作的这些方法:
methods(class = "lmList")