我正在尝试估计一个面板数据集,其中包含一个表示路线的地理区域(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
Run Code Online (Sandbox Code Playgroud)
这在使用lm函数替换plm的正常OLS回归中工作正常.问题是为什么它不适用于我的模型?
小智 5
请注意,plm()一直都很好,它的summary.plm()函数破坏了!深入研究该函数揭示了计算R ^ 2的部分的麻烦.
快速而不那么优雅的解决方法包括:
(1)用LoadArea*DischargeArea替换LoadArea:DischargeArea
(2)手动创建单独的交互变量
LoadxDischarge <- LoadArea*DischargeArea
Run Code Online (Sandbox Code Playgroud)
这是变量之间的共线性问题。
对于由于共线性而未估计的变量,lm 命令会自动将 NA 放入 beta 向量中,但 PLM 不会。
当您拥有 LoadArea*DischargeArea 时,PLM 会将三个变量添加到您的模型中:
LoadArea + DischargeArea + LoadArea:DischargeArea
Run Code Online (Sandbox Code Playgroud)
在那之后,PLM 就会贬低他们。
在这种情况下,如果没有关于您的数据的进一步信息,我的猜测是这些变量之一与以下因素水平之一完全共线:
as.factor(Laycan.Day.Diff)
Run Code Online (Sandbox Code Playgroud)
在你的情况下,我会尝试在没有因素的情况下估计模型。如果有效,您就知道导致问题的因素。如果遇到这种情况,您可以将每个因素转换为显式 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])
Run Code Online (Sandbox Code Playgroud)
第5行是贬义。另一篇堆栈溢出帖子详细描述了我上面使用的 data.table 的操作。
上面代码的输出将是:
>
demeaned_var1 demeaned_var2
demeaned_var1 1 1
demeaned_var2 1 1
Run Code Online (Sandbox Code Playgroud)
这将告诉您哪些贬低的变量是完全共线的。