Вопрос о p-значениях с кластерными стандартными ошибками в пакете LFE в R - PullRequest
4 голосов
/ 16 апреля 2020

Я оцениваю модель с фиксированными эффектами и кластерными стандартными ошибками, используя lfe-пакет.

Как оказалось, у меня огромное значение t (23,317), но только сравнительно небольшое значение p (0,0273). Похоже, это как-то связано со мной, используя проекцию из фиксированных эффектов. Когда я оцениваю фиксированные эффекты вручную как контрольные переменные, мое значение p слишком мало, чтобы о нем сообщалось <2e-16. </p>

Рассмотрим следующий рабочий пример (извините, если это сложнее, чем строго необходимо, я я пытаюсь быть ближе к моей заявке):

Я просто оцениваю оценщик пула из 10 временных рядов за 50 периодов. И я предполагаю, что во временном ряду есть два кластера.

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 ***</p>

Так что это должно быть связано с проецированием фиксированных эффектов, но эта разница настолько велика, что я хотел бы узнать немного больше об этом. Кто-нибудь знает, в чем заключается основная проблема?

1 Ответ

2 голосов
/ 26 апреля 2020

Вы пытаетесь настроить стандартные ошибки для кластеризации на "indicator", который является двоичным.

table(DT$indicator)
#   0   1 
# 250 250 

Другими словами, у вас есть только два кластера. Ваши первые "results" кажутся «правильными», так как они правильно дают 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 .

Обратите внимание, , что ваш первый результат не является "правильным", даже если он настроен на степени свободы. Просто два кластера не имеют большого смысла для меня, возможно, вы захотите переосмыслить свою модель. В любом случае, если у вас меньше ~ 50 кластеров, вам следует использовать метод, подобный дикому кластеру bootstrap (см. Cameron and Miller, 2015 ).


Данные:

Я использовал ваши данные с set.seed(42).

...