Исправлена ошибка регрессии эффектов с термином взаимодействия.
Я пытаюсь оценить набор данных панели с термином взаимодействия для географических областей (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)