#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. Мне не следовало пытаться писать код так поздно. Вот рабочая версия. Если вы действительно просто выполняете двумерную регрессию, вам понадобится ОГРОМНОЕ количество наблюдений для выполнения с учетом ограничения памяти. В любом случае, я также использую разреженные матрицы, чтобы минимизировать использование памяти при этой операции с единичной матрицей. Так что это тоже могло бы немного помочь.