将 'clustering functions' 应用于一系列线性模型
Applying 'clustering functions' to a series of linear models
我想遍历线性模型列表,并使用 vcovCL
函数将 "clustered" 标准误差应用于每个模型。我的目标是尽可能高效地执行此操作(我是 运行 跨数据框多列的线性模型)。我的问题是试图在匿名函数中指定额外的参数。下面我模拟了一些假数据。辖区代表我的横截面维度;月代表我的时间维度(在 4 个月内观察到 5 个单位)。变量 int
是干预何时发生的虚拟变量。
df <- data.frame(
precinct = c( rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4), rep(5, 4) ),
month = rep(1:4, 5),
crime = rnorm(20, 10, 5),
int = c(c(0, 1, 1, 0), rep(0, 4), rep(0, 4), c(1, 1, 1, 0), rep(0, 4))
)
df[1:10, ]
outcome <- df[3]
est <- lapply(outcome, FUN = function(x) { lm(x ~ as.factor(precinct) + as.factor(month) + int, data = df) })
se <- lapply(est, function(x) { sqrt(diag(vcovCL(x, cluster = ~ precinct + month))) })
我在 vcovCL
函数中添加 cluster
参数时收到以下错误消息。
Error in eval(expr, envir, enclos) : object 'x' not found
据我估计,唯一的解决方法是索引数据帧,即 df$
,然后指定 'clustering' 变量。这可以通过在函数调用中为 df
指定一个附加参数来实现吗? 这段代码高效吗?
我想也许用公式指定模型方程是更好的方法。
任何 thoughts/comments 总是有帮助的:)
这是一种可以检索多个模型的集群标准误差的方法:
library(sandwich)
# I am going to use the same model three times to get the "sequence" of linear models.
mod <- lm(crime ~ as.factor(precinct) + as.factor(month) + int, data = df)
# define function to retrieve standard errors:
robust_se <- function(mod) {sqrt(diag(vcovCL(mod, cluster = list(df$precinct, df$month))))}
# apply function to all models:
se <- lapply(list(mod, mod, mod), robust_se)
如果您想调整整个输出,以下内容可能会有所帮助:
library(lmtest)
adj_stats <- function(mod) {coeftest(mod, vcovCL(mod, cluster = list(df$precinct, df$month)))}
adjusted_models <- lapply(list(mod, mod, mod), adj_stats)
解决多列问题:
如果您正在努力处理 运行 多个列的线性模型,以下内容可能会有所帮助。除了您将模型列表传递给 lapply
.
之外,以上所有内容都将保持不变
首先,让我们在这里使用这个数据框:
df <- data.frame(
precinct = c( rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4), rep(5, 4) ),
month = rep(1:4, 5),
crime = rnorm(20, 10, 5),
crime2 = rnorm(20, 10, 5),
crime3 = rnorm(20, 10, 5),
int = c(c(0, 1, 1, 0), rep(0, 4), rep(0, 4), c(1, 1, 1, 0), rep(0, 4))
)
让我们定义结果列:
outcome_columns <- c("crime", "crime2", "crime3")
现在,让我们运行对每个结果进行回归:
models <- lapply(outcome_columns,
function(outcome) lm( eval(parse(text = paste0(outcome, " ~ as.factor(precinct) + as.factor(month) + int"))), data = df) )
然后您只需调用
adjusted_models <- lapply(models, adj_stats)
关于效率:
上面的代码是高效的,因为它易于调整并且编写起来很快。对于大多数用例,它会非常好。为了计算效率,请注意您的设计矩阵在所有情况下都是相同的,即通过预先计算公共元素(例如 inv(X'X)*X'
),您可以节省一些计算。然而,您会失去许多内置函数的便利性。
我想遍历线性模型列表,并使用 vcovCL
函数将 "clustered" 标准误差应用于每个模型。我的目标是尽可能高效地执行此操作(我是 运行 跨数据框多列的线性模型)。我的问题是试图在匿名函数中指定额外的参数。下面我模拟了一些假数据。辖区代表我的横截面维度;月代表我的时间维度(在 4 个月内观察到 5 个单位)。变量 int
是干预何时发生的虚拟变量。
df <- data.frame(
precinct = c( rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4), rep(5, 4) ),
month = rep(1:4, 5),
crime = rnorm(20, 10, 5),
int = c(c(0, 1, 1, 0), rep(0, 4), rep(0, 4), c(1, 1, 1, 0), rep(0, 4))
)
df[1:10, ]
outcome <- df[3]
est <- lapply(outcome, FUN = function(x) { lm(x ~ as.factor(precinct) + as.factor(month) + int, data = df) })
se <- lapply(est, function(x) { sqrt(diag(vcovCL(x, cluster = ~ precinct + month))) })
我在 vcovCL
函数中添加 cluster
参数时收到以下错误消息。
Error in eval(expr, envir, enclos) : object 'x' not found
据我估计,唯一的解决方法是索引数据帧,即 df$
,然后指定 'clustering' 变量。这可以通过在函数调用中为 df
指定一个附加参数来实现吗? 这段代码高效吗?
我想也许用公式指定模型方程是更好的方法。
任何 thoughts/comments 总是有帮助的:)
这是一种可以检索多个模型的集群标准误差的方法:
library(sandwich)
# I am going to use the same model three times to get the "sequence" of linear models.
mod <- lm(crime ~ as.factor(precinct) + as.factor(month) + int, data = df)
# define function to retrieve standard errors:
robust_se <- function(mod) {sqrt(diag(vcovCL(mod, cluster = list(df$precinct, df$month))))}
# apply function to all models:
se <- lapply(list(mod, mod, mod), robust_se)
如果您想调整整个输出,以下内容可能会有所帮助:
library(lmtest)
adj_stats <- function(mod) {coeftest(mod, vcovCL(mod, cluster = list(df$precinct, df$month)))}
adjusted_models <- lapply(list(mod, mod, mod), adj_stats)
解决多列问题:
如果您正在努力处理 运行 多个列的线性模型,以下内容可能会有所帮助。除了您将模型列表传递给 lapply
.
首先,让我们在这里使用这个数据框:
df <- data.frame(
precinct = c( rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4), rep(5, 4) ),
month = rep(1:4, 5),
crime = rnorm(20, 10, 5),
crime2 = rnorm(20, 10, 5),
crime3 = rnorm(20, 10, 5),
int = c(c(0, 1, 1, 0), rep(0, 4), rep(0, 4), c(1, 1, 1, 0), rep(0, 4))
)
让我们定义结果列:
outcome_columns <- c("crime", "crime2", "crime3")
现在,让我们运行对每个结果进行回归:
models <- lapply(outcome_columns,
function(outcome) lm( eval(parse(text = paste0(outcome, " ~ as.factor(precinct) + as.factor(month) + int"))), data = df) )
然后您只需调用
adjusted_models <- lapply(models, adj_stats)
关于效率:
上面的代码是高效的,因为它易于调整并且编写起来很快。对于大多数用例,它会非常好。为了计算效率,请注意您的设计矩阵在所有情况下都是相同的,即通过预先计算公共元素(例如 inv(X'X)*X'
),您可以节省一些计算。然而,您会失去许多内置函数的便利性。