Гетероскедастическая согласованная ковариационная матрица с одномерной регрессией [R] - PullRequest
3 голосов
/ 29 апреля 2011

Как рассчитать матрицу гетероскедастической согласованной ковариации (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, которая часто останавливается на ошибках «не удается выделить вектор размера» (или выполняет много операций подкачки ).

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

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

1 Ответ

3 голосов
/ 29 апреля 2011

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...