关于 R 中 LFE 包中具有集群标准错误的 p 值的问题
Question about p-values with clustered standard errors in LFE package in R
我正在使用 lfe-package 估计具有固定效果和聚类标准误差的模型。
事实证明,我有一个很大的 t 值 (23.317),但只有一个相对较小的 p 值 (0.0273)。这似乎与我使用固定效果的投影有关。当我手动估计固定效应作为控制变量时,我的 p 值太小而无法报告 <2e-16 .
考虑以下工作示例(如果它比严格必要的更复杂,我很抱歉,我试图接近我的应用程序):
我只是在估计 50 个时期内 10 个时间序列的合并面板估计量。我假设时间序列中有两个集群。
library(data.table)
library(lfe)
x <- rnorm(50, mean = 1, sd = 1)
common_shock <- rnorm(50, mean = 0, sd = 1)
y1 = 0.5 + 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y2 = 0.5 + 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y3 = 0.5 + 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y4 = 0.5+ 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y5 = 0.5+ 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y6 = x + rnorm(50, mean = 0, sd = 2)
y7 = x + rnorm(50, mean = 0, sd = 2)
y8 = x + rnorm(50, mean = 0, sd = 2)
y9 = x + rnorm(50, mean = 0, sd = 2)
y10 = x + rnorm(50, mean = 0, sd = 2)
DT <- data.table(periods = 1:50, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10)
Controls <- data.table(periods = 1:50, x)
indicators <- data.table(y_label = paste0("y", 1:10),
indicator = c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0))
DT <- melt(DT, id.vars= c("periods"))
DT <- merge(DT, Controls, by="periods", all = TRUE)
DT <- merge(DT, indicators, by.x="variable", by.y="y_label", all = TRUE)
results <- felm(as.formula("value ~ -1 + indicator + x:indicator | periods | 0 | periods + indicator"), data = DT)
results2 <- felm(as.formula("value ~ -1 + indicator + x:indicator + as.factor(periods) | 0 | 0 | periods + indicator"), data = DT)
summary(results)
summary(results2)
第一个结果给了我
指标:x 3.8625 0.1657 23.317 0.0273 *
第二个结果2给了我
指标:x 3.86252 0.20133 19.185 < 2e-16 ***
所以这肯定和固定效应的投影有关,但是这个差异太大了,我想多了解一下。有人知道这里的根本问题是什么吗?
您正在尝试调整标准误差以在 "indicator"
上进行聚类,这是二进制的。
table(DT$indicator)
# 0 1
# 250 250
换句话说,你只有两个集群。您的第一个 "results"
似乎是 "correct",因为它们正确地给出了 1
作为自由度。
(df1 <- results$df)
# [1] 1
而 "results2"
有 448
个自由度。
(df2 <- results2$df)
# [1] 448
当我们计算每手的 p 值时,我们可能会使用一个自由度复制您的第一个结果(因为它应该只有两个集群),您的第二个结果具有 448 个自由度。
PV <- function(x, df) 2 * pt(-abs(x), df=df)
r1 <- summary(results)$coe
t1 <- r1[grep("indicator:x", rownames(r1)), "t value"]
PV(t1, df1)
# [1] 0.02937402
r2 <- summary(results2)$coe
t2 <- r2[grep("indicator:x", rownames(r2)), "t value"]
PV(t2, df2)
# [1] 2.371641e-55
似乎 felm
不能将 factor
变量作为固定效应来处理,因为它的标准符号是 y ~ x1 + x2 | f1 + f2 | (Q|W ~ x3+x4) | clu1 + clu2.
请注意,您的第一个结果不是 "correct",即使它已根据自由度进行了调整。只有两个集群对我来说意义不大,也许你可能想过度考虑你的模型。无论如何,如果你的集群少于 ~50 个,你应该使用类似于 wild cluster bootstrap 方法的方法(参见 Cameron and Miller, 2015)。
数据:
我将你的数据用于 set.seed(42)
。
我正在使用 lfe-package 估计具有固定效果和聚类标准误差的模型。
事实证明,我有一个很大的 t 值 (23.317),但只有一个相对较小的 p 值 (0.0273)。这似乎与我使用固定效果的投影有关。当我手动估计固定效应作为控制变量时,我的 p 值太小而无法报告 <2e-16 .
考虑以下工作示例(如果它比严格必要的更复杂,我很抱歉,我试图接近我的应用程序):
我只是在估计 50 个时期内 10 个时间序列的合并面板估计量。我假设时间序列中有两个集群。
library(data.table)
library(lfe)
x <- rnorm(50, mean = 1, sd = 1)
common_shock <- rnorm(50, mean = 0, sd = 1)
y1 = 0.5 + 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y2 = 0.5 + 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y3 = 0.5 + 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y4 = 0.5+ 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y5 = 0.5+ 5*x + rnorm(50, mean = 0, sd = 2) + common_shock
y6 = x + rnorm(50, mean = 0, sd = 2)
y7 = x + rnorm(50, mean = 0, sd = 2)
y8 = x + rnorm(50, mean = 0, sd = 2)
y9 = x + rnorm(50, mean = 0, sd = 2)
y10 = x + rnorm(50, mean = 0, sd = 2)
DT <- data.table(periods = 1:50, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10)
Controls <- data.table(periods = 1:50, x)
indicators <- data.table(y_label = paste0("y", 1:10),
indicator = c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0))
DT <- melt(DT, id.vars= c("periods"))
DT <- merge(DT, Controls, by="periods", all = TRUE)
DT <- merge(DT, indicators, by.x="variable", by.y="y_label", all = TRUE)
results <- felm(as.formula("value ~ -1 + indicator + x:indicator | periods | 0 | periods + indicator"), data = DT)
results2 <- felm(as.formula("value ~ -1 + indicator + x:indicator + as.factor(periods) | 0 | 0 | periods + indicator"), data = DT)
summary(results)
summary(results2)
第一个结果给了我
指标:x 3.8625 0.1657 23.317 0.0273 *
第二个结果2给了我
指标:x 3.86252 0.20133 19.185 < 2e-16 ***
所以这肯定和固定效应的投影有关,但是这个差异太大了,我想多了解一下。有人知道这里的根本问题是什么吗?
您正在尝试调整标准误差以在 "indicator"
上进行聚类,这是二进制的。
table(DT$indicator)
# 0 1
# 250 250
换句话说,你只有两个集群。您的第一个 "results"
似乎是 "correct",因为它们正确地给出了 1
作为自由度。
(df1 <- results$df)
# [1] 1
而 "results2"
有 448
个自由度。
(df2 <- results2$df)
# [1] 448
当我们计算每手的 p 值时,我们可能会使用一个自由度复制您的第一个结果(因为它应该只有两个集群),您的第二个结果具有 448 个自由度。
PV <- function(x, df) 2 * pt(-abs(x), df=df)
r1 <- summary(results)$coe
t1 <- r1[grep("indicator:x", rownames(r1)), "t value"]
PV(t1, df1)
# [1] 0.02937402
r2 <- summary(results2)$coe
t2 <- r2[grep("indicator:x", rownames(r2)), "t value"]
PV(t2, df2)
# [1] 2.371641e-55
似乎 felm
不能将 factor
变量作为固定效应来处理,因为它的标准符号是 y ~ x1 + x2 | f1 + f2 | (Q|W ~ x3+x4) | clu1 + clu2.
请注意,您的第一个结果不是 "correct",即使它已根据自由度进行了调整。只有两个集群对我来说意义不大,也许你可能想过度考虑你的模型。无论如何,如果你的集群少于 ~50 个,你应该使用类似于 wild cluster bootstrap 方法的方法(参见 Cameron and Miller, 2015)。
数据:
我将你的数据用于 set.seed(42)
。