Исправлена ​​ошибка регрессии эффектов с термином взаимодействия.

Я пытаюсь оценить набор данных панели с термином взаимодействия для географических областей (LoadArea, DischargeArea), который обозначает маршрут. Используя спецификацию фиксированных эффектов, он не любит термин взаимодействия (LoadArea * DischargeArea) и выдает следующую ошибку при суммировании регрессии:

mult_fe<-plm(log(DayRate)~LoadArea *DischargeArea + factor(Laycan.Day.Diff) + CapUtil + Age
+ I(Age^2) + WFRDWT + lag_BDTI, data=mult_reg1,model="within");


summary(mult_fe)
Error in crossprod(t(X), beta) : non-conformable arguments

Это нормально работает в обычной регрессии OLS, заменяя plm функцией lm. Вопрос в том, почему это не работает для моей модели?

3 ответа

Решение

Это проблема коллинеарности среди ваших переменных.

Команда lm автоматически помещает NA в бета-вектор для переменных, которые не были оценены из-за коллинеарности, а PLM - нет.

Когда у вас есть LoadArea*DischargeArea, PLM будет иметь три переменные для вашей модели:

LoadArea + DischargeArea + LoadArea:DischargeArea

После этого PLM унизит их.

В этом случае, и без дополнительной информации о ваших данных, я предполагаю, что одна из этих переменных совершенно коллинеарна с одним из уровней факторов в:

as.factor(Laycan.Day.Diff)

В вашем случае я бы попытался оценить модель без учета фактора. Если это работает, вы знаете, что факторы являются причиной проблемы. Если дело доходит до этого, вы можете затем преобразовать каждый фактор в явный манекен 0/1 и добавлять их один за другим, пока не поймете, откуда возникла проблема.

Чтобы определить, какие переменные коллинеарны, вы можете попробовать что-то вроде:

require(data.table)
tmp      <- data.table(var1=1:10,var2=55:64,userid=rep(c(1,2),5))
cols     <- c('var1','var2')
newnames <- c('demeaned_var1','demeaned_var2')
tmp[,(newnames):=.SD-lapply(.SD,mean),.SDcols=cols,by=userid]
cor(tmp[,newnames,with=F])

Строка 5 является унизительным. Этот другой пост переполнения стека подробно описывает операции data.table, который я использовал выше.

Вывод кода выше будет:

> 
              demeaned_var1 demeaned_var2
demeaned_var1             1             1
demeaned_var2             1             1

Это скажет вам, какие уклоненные вены идеально коллинеарны.

Пожалуйста, обратите внимание, что plm() играет нормально все время, это функция summary.plm(), которая плохо работает! Углубление вглубь функции обнаруживает проблему в той части, где она вычисляет R^2.

Подробнее об этой проблеме читайте здесь на stackexchange

Быстрые и не очень элегантные обходные пути включают в себя:

(1) Замена LoadArea:DischargeArea на LoadArea * DischargeArea

(2) вручную создать отдельную переменную взаимодействия

LoadxDischarge <- LoadArea*DischargeArea 

Способ получить хотя бы стандартные ошибки и т. Д. - использовать

library("sandwich")
library("lmtest")
coeftest(mult_fe)
Другие вопросы по тегам