R:具有组固定效应的回归和具有估算数据集的聚类标准误差
R: Regressions with group fixed effects and clustered standard errors with imputed dataset
我正在尝试 运行 R 中的回归(多个模型 - 泊松、二项式和连续),其中包括群体(例如学校)的固定效应,以针对一般的群体水平差异(本质上是按群体贬低)进行调整) 并且聚类标准误差以说明组中参与者的嵌套。我还 运行 对这些估算数据框(用鼠标创建)进行了调整。似乎不同的学科对“固定效应”一词的使用方式不同,所以我很难找到解决问题的办法。
我有拟合随机截距模型(使用 lme4),但它们不考虑学校固定效应(随机效应对我的研究问题不感兴趣)。将这些组作为假人放置会大大减慢 运行 的速度。我也可以 运行 单个级别 glm/lm 与组假人,但我一直无法找到一种策略来将标准错误与估算数据进行聚类(尝试了 clusterSE 包)。我可以手算贬低,但似乎应该有更直接的方法来实现这一目标。
我也查看了 lfe 包,但它似乎没有 glm 选项,而且 demeanlist 函数似乎与估算的数据帧不兼容。
在 Stata 中,命令将是 xtreg、fe vce(聚类变量),(fe = 固定效应,vce = 聚类标准误差,mi 添加到 运行 推算数据帧上)。我可以切换到 Stata 进行建模,但如果可能的话我肯定更愿意继续使用 R!
请让我知道这是否更好地张贴在交叉验证中 - 我在栅栏上,但选择了这个,因为它似乎更像是一个编码问题。
谢谢!
我会阻止 bootstrap。 "block" 处理聚类,"bootstrap" 处理生成的回归变量。
可能有一种更优雅的方法可以将其扩展到其他估算器,但这应该可以帮助您入门。
# junk data
x <- rnorm(100)
y <- 1 + 2*x + rnorm(100)
dat1 <- data.frame(y, x, id=seq_along(y))
summary(lm(y ~ x, data=dat1))
# same point estimates, but lower SEs
dat2 <- dat1[rep(seq_along(y), each=10), ]
summary(lm(y ~ x, data=dat2))
# block boostrap helper function
require(boot)
myStatistic <- function(ids, i) {
myData <- do.call(rbind, lapply(i, function(i) dat2[dat2$id==ids[i], ]))
myLm <- lm(y ~ x, data=myData)
myLm$coefficients
}
# same point estimates from helper function if original data
myStatistic(unique(dat2$id), 1:100)
# block bootstrap recovers correct SEs
boot(unique(dat2$id), myStatistic, 500)
我正在尝试 运行 R 中的回归(多个模型 - 泊松、二项式和连续),其中包括群体(例如学校)的固定效应,以针对一般的群体水平差异(本质上是按群体贬低)进行调整) 并且聚类标准误差以说明组中参与者的嵌套。我还 运行 对这些估算数据框(用鼠标创建)进行了调整。似乎不同的学科对“固定效应”一词的使用方式不同,所以我很难找到解决问题的办法。
我有拟合随机截距模型(使用 lme4),但它们不考虑学校固定效应(随机效应对我的研究问题不感兴趣)。将这些组作为假人放置会大大减慢 运行 的速度。我也可以 运行 单个级别 glm/lm 与组假人,但我一直无法找到一种策略来将标准错误与估算数据进行聚类(尝试了 clusterSE 包)。我可以手算贬低,但似乎应该有更直接的方法来实现这一目标。
我也查看了 lfe 包,但它似乎没有 glm 选项,而且 demeanlist 函数似乎与估算的数据帧不兼容。
在 Stata 中,命令将是 xtreg、fe vce(聚类变量),(fe = 固定效应,vce = 聚类标准误差,mi 添加到 运行 推算数据帧上)。我可以切换到 Stata 进行建模,但如果可能的话我肯定更愿意继续使用 R!
请让我知道这是否更好地张贴在交叉验证中 - 我在栅栏上,但选择了这个,因为它似乎更像是一个编码问题。
谢谢!
我会阻止 bootstrap。 "block" 处理聚类,"bootstrap" 处理生成的回归变量。
可能有一种更优雅的方法可以将其扩展到其他估算器,但这应该可以帮助您入门。
# junk data
x <- rnorm(100)
y <- 1 + 2*x + rnorm(100)
dat1 <- data.frame(y, x, id=seq_along(y))
summary(lm(y ~ x, data=dat1))
# same point estimates, but lower SEs
dat2 <- dat1[rep(seq_along(y), each=10), ]
summary(lm(y ~ x, data=dat2))
# block boostrap helper function
require(boot)
myStatistic <- function(ids, i) {
myData <- do.call(rbind, lapply(i, function(i) dat2[dat2$id==ids[i], ]))
myLm <- lm(y ~ x, data=myData)
myLm$coefficients
}
# same point estimates from helper function if original data
myStatistic(unique(dat2$id), 1:100)
# block bootstrap recovers correct SEs
boot(unique(dat2$id), myStatistic, 500)