Гетероскедастическая согласованная ковариационная матрица с одномерной регрессией [R]

#r

#r

Вопрос:

Как я могу вычислить гетероскедастическую согласованную ковариационную матрицу (HCCM) для одномерной регрессии (т. Е. регрессии OLS с одним регрессором и без перехвата)?

Предыстория: У меня есть регрессия панели с фиксированным эффектом, но только с одним регрессором. Итак, я могу сделать это либо с помощью метода фиктивной переменной наименьших квадратов (LSDV)

 lm.ser.yr <- lm(realwage ~ placebo.ser   factor(incyear)   0, data = cps)
  

или я могу понизить LHS на уровне года и регрессировать

 cps <- ddply(cps, .(incyear), transform, realwage.dm.yr = realwage - mean(realwage))
lm.ser.yr <- lm(realwage.dm.yr ~ placebo.ser   0, data = cps)
  

Но есть проблемы с обоими.

  • При использовании подхода LSDV и достаточного количества макетов lm объект становится огромным (по 1 ГБ каждый). В основном это из-за большой qr матрицы, которую я должен сохранить, чтобы передать ее vcovHC() для вычисления HCCM, которая часто останавливается при ошибках «не удается выделить вектор размера» (или выполняет много подкачки).

  • С оценщиком demeaned within все работает отлично, но я не могу вычислить HCCM, потому что ни vcovHC() , ни hccm() не обрабатывают одномерный lm объект без перехвата (т. Е. он выдает ответ NA , что, насколько я могу судить, связано с тем, что без переменных intercept и dummy мои остатки намного дальше от нулевого среднего).

Есть ли решение этой проблемы за исключением очень агрессивного управления памятью и / или перехода в облако?

Комментарии:

1. Может принадлежать math.overflow.com

2. @duffymo — Это могло бы. Я думаю, что это проблема эконометрики / вычислений, и я чувствую, что хочу увидеть больше таких здесь.

Ответ №1:

vcovHC() из plm пакета, похоже, отлично обрабатываются lm() модели без перехватов:

 library(plm)
df <- data.frame('a'=rnorm(1000), 'b'=rnorm(1000))
mod <- lm(a ~ b -1, df)
vcovHC(mod)
  

Редактировать: вот некоторый код для их вычисления вручную.

 library(Matrix)
e2 = mod$residuals ^ 2
X = model.matrix(mod)
N = nrow(X)
bread = solve(crossprod(X))
I <- Matrix(data=0, ncol=N, nrow=N, sparse=TRUE)
diag(I) <- e2
salami <- t(X) %*% I %*% X 
V = bread %*% salami %*% bread
  

Комментарии:

1. @Vincent — Большое спасибо! Я поработал с plm , но был немного перегружен всеми настройками… Я совершенно забыл, что у них есть своя vcovHC() . Спасибо!

2. @Vincent — Я сглазил себя. Я не смотрел на все результаты и пропустил два, которые завершились неудачей — так что на самом деле это не «одномерная» проблема, должно быть, у меня есть модель со слишком большим количеством остатков, которая не будет решаться должным образом (я думаю, здесь mod пришлось бы plm вызывать vcovHC.plm ). Я углублюсь в sandwich и посмотрю, что смогу найти.

3. Вы пробовали вычислять белые ошибки вручную? Таким образом, вы увидите, где происходит сбой. Это действительно легко реализовать, так что вы также можете попробовать это.

4. Когда я запускаю ваш код, я получаю эту ошибку: Error in array(0, c(n, p)) : 'dim' specifies too large an array

5. Мне не следовало пытаться писать код так поздно. Вот рабочая версия. Если вы действительно просто выполняете двумерную регрессию, вам понадобится ОГРОМНОЕ количество наблюдений для выполнения с учетом ограничения памяти. В любом случае, я также использую разреженные матрицы, чтобы минимизировать использование памяти при этой операции с единичной матрицей. Так что это тоже могло бы немного помочь.