Устойчивая стандартная ошибка (HC3) с использованием vcovHC (), coeftest для объекта plm

Я хочу оценить модель с фиксированным эффектом и использовать надежную ковариационную матрицу с корректировкой HC3 для малой выборки.

Для самой модели я использую следующие строки кода:

require(plm)
require(sandwich)
require(lmtest)
require(car)
QSFE <- plm(log(SPREAD)~PERIOD, data = na.omit(QSREG), index = c("STOCKS", "TIME"), model = "within")

Это работает очень хорошо, теперь для расчета устойчивой стандартной ошибки HC3 я использовал функцию coeftest с vcovHC в ней.

coeftest(x = QSFE, vcov = vcovHC(QSFE, type = "HC3", method = "arellano"))

И это не работает. Возвращенная ошибка выглядит следующим образом:

Error in 1 - diaghat : non-numeric argument to binary operator

Проблема в vcovHC: когда задается тип "HC3". Он использует функцию hatvalues() для вычисления "diaghat", которая не поддерживает объекты plm и возвращает ошибку:

Error in UseMethod("hatvalues") : 
no applicable method for 'hatvalues' applied to an object of class "c('plm', 'panelmodel')"

Кто-нибудь знает, как использовать оценщик HC3 (HC2) для plm. Я думаю, это должно зависеть от значений функции, используемых в vcov, поскольку HC0 / HC1 отлично работает, потому что это не нужно.


person dpendi    schedule 13.04.2020    source источник
comment
У меня работает аналогичный пример. Похоже, что vcovHC не отправляется методу, предоставленному plm для объектов plm, поскольку в plm нет функции hatvalues, слово hatvalues ​​отсутствует даже в исходном коде plm. Убедитесь, что пакет plm загружен при выполнении coeftest.   -  person Helix123    schedule 13.04.2020
comment
Спасибо за ваш ответ. hatvalues ​​должен находиться в vcovHC () (см. rdrr.io/cran/sandwich /src/R/vcovHC.R). Думаю, моя проблема также может заключаться в переменной PERIOD, это фактор с 3 уровнями.   -  person dpendi    schedule 13.04.2020
comment
Убедитесь, что у вас установлена ​​последняя версия plm из CRAN.   -  person Helix123    schedule 13.04.2020


Ответы (2)


В методе, предоставленном plm для объектов plm, в пакете plm нет функции hatvalues, слово hatvalues ​​отсутствует даже в исходном коде plm. Убедитесь, что пакет plm загружен при выполнении coeftest. Кроме того, убедитесь, что у вас установлена ​​последняя версия plm из CRAN (в настоящее время это версия 2.2-3).

Если у вас загружен пакет plm, код должен работать. Это касается игрушечного примера на моей машине. Конечно, вы можете захотеть принудительно использовать vcovHC, предоставленный plm:

Кулак, попробуйте vcovHC(QSFE, type = "HC3", method = "arellano"). Если это дает ту же ошибку, попробуйте plm::vcovHC(QSFE, type = "HC3", method = "arellano").

Затем попробуйте: coeftest(QSFE, vcov.=function(x) vcovHC(QSFE, method="arellano", type="HC3"))

Изменить. Используя предоставленный набор данных, ясно, что отправка на vcovHC.plm работает правильно. Пакет sandwich здесь не задействован. Основная причина - потребность в памяти функции vcovHC.plm с аргументом type, установленным в "HC3" (и другими). Это также объясняет ваш комментарий о функции, работающей с подмножеством данных.

Edit2: потребность в памяти для небольших настроек образца vcovHC.plm значительно ниже, начиная с версии plm 2.4-0 (внутренняя функция dhat оптимизирована), и ошибка больше не возникает.

vcovHC(QSFE, type = "HC3", method = "arellano")
Error in 1 - diaghat : non-numeric argument to binary operator
Called from: omega(uhat, diaghat, df, G)
Browse[1]> diaghat
[1] "Error : cannot allocate vector of size 59.7 Gb\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError: cannot allocate vector of size 59.7 Gb>
person Helix123    schedule 13.04.2020
comment
Я обновил пакет plm, он все равно не работает для всего моего образца. Я пробовал с меньшим. только с меньшим подмножеством он работает очень хорошо, но не со всем. Я ценю вашу помощь, я постараюсь улучшить качество всего набора данных и запустить его снова. Спасибо за помощь! - person dpendi; 13.04.2020
comment
Я пробовал и этот подход. Но это не сработает. Моя выборка данных включает 288 человек и 312 наблюдений на каждого человека. Код подходит максимум для 148 человек. в том числе более 148 акций, вызывает указанные проблемы - person dpendi; 14.04.2020
comment
Есть ли у вас возможность где-нибудь сделать доступными полные данные? - person Helix123; 14.04.2020
comment
Вы можете найти его на github.com/dpendi/data/blob/master/STOFDAT .csv - person dpendi; 14.04.2020
comment
Спасибо. Пожалуйста, ознакомьтесь с изменением моего ответа. Требования к памяти слишком высоки, по крайней мере, слишком высоки, чтобы справиться с моей машиной - person Helix123; 15.04.2020
comment
Большое спасибо за Вашу помощь! Поскольку я должен использовать все данные, я нашел функцию lm_robust () из пакета: Estimatr. Он может использовать фиксированные эффекты и оценивать те же коэффициенты. Единственное, чему я не верю, так это стандартные ошибки с HC3. Поскольку использование coeftest с HC1 значительно увеличивает стандартную ошибку. HC3 должен быть более строгим. Использование lm_robust - нет. Использование HC3 в lm_robust дает лишь небольшие изменения стандартной ошибки. Но это, вероятно, должно быть в другом вопросе о stackoverflow. - person dpendi; 15.04.2020

PLM разработчик здесь. Хотя вопрос эффективности интересен с точки зрения вычислений, со статистической точки зрения эти поправки с малой выборкой не нужны, когда у вас есть панель 300 x 300. Вы можете с радостью использовать HC0 (или, если вам определенно нужна коррекция с малой выборкой панели "sss" (панель DF), в любом случае будет лучше, а последняя в вычислительном отношении намного легче).

Тот факт, что поправки с малой выборкой становятся бесполезными при увеличении размера данных, является основной причиной, по которой мы не уделили мало времени разработчику, чтобы сделать их более эффективными. Кроме того, со статистической точки зрения имейте в виду, что свойства "кластеризации" vcovs, таких как White-Arellano, не идеальны для T ~ N, они предназначены для N >> T.

Наконец, одно уточнение относительно вашего исходного сообщения: хотя изначально vcovHC была общей функцией в пакете 'sandwich', в контексте панели применяется специализированный метод vcovHC.plm из пакета 'plm'. Лучшее объяснение здесь: https://www.jstatsoft.org/article/view/v082i03

person Giovanni Millo    schedule 15.04.2020
comment
Благодарю за ваш ответ; У меня небольшой вопрос относительно vcovHC.plm из пакета 'plm'. Поскольку vcovHC.plm использует vcovG из пакета plm, вся матрица шляп вычисляется с помощью функции dhat в vcovG. Я имею в виду rdrr.io/cran/plm/src/R/tool_vcovG. R. Не было бы более эффективным не вычислять всю матрицу (что, на мой взгляд, приводит к моей ошибке), а вместо этого просто вычислять диагональ, которая необходима для HC2 и HC3 - person dpendi; 15.04.2020
comment
Спасибо за наблюдение, выглядит разумно. Посмотрим. - person Giovanni Millo; 16.04.2020
comment
Я изменил теперь с помощью trace (plm ::: vcovG.plm, edit = TRUE) функцию dhat на: dhat <- function(X){ S1 <- X %*% solve(t(X) %*% X) diaghat <- rowSums(S1 * X) return(diaghat) }. Теперь он отлично работает; Спасибо Хеликсу и Джованни за помощь! - person dpendi; 16.04.2020
comment
Реализация, использующая эту оптимизацию, находится в версии plm ›= 2.4-0, поэтому потребность в памяти значительно ниже. - person Helix123; 18.07.2021