我正在尝试估算一个面板数据集,其中包含一个表示路线的地理区域(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
这在使用lm函数替换plm的正常OLS回归中工作正常。 问题是为什么它不适用于我的模型?
答案 0 :(得分:5)
请注意plm()一直都很好,它的summary.plm()函数坏了!深入研究该函数揭示了计算R ^ 2的部分的麻烦。
Read more here on the same problem at stackexchange
快速而不那么优雅的解决方法包括:
(1)用LoadArea替换LoadArea:DischargeArea * DischargeArea
(2)手动创建单独的交互变量
LoadxDischarge <- LoadArea*DischargeArea
答案 1 :(得分:4)
这是变量之间共线性的问题。
lm命令自动将NAs放在β矢量中,用于因共线性而未估计的变量,但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行是贬低。另一个stack overflow post描述了我在上面详细使用的data.table的操作。
上面代码的输出将是:
>
demeaned_var1 demeaned_var2
demeaned_var1 1 1
demeaned_var2 1 1
这将告诉你哪些贬低的变量是完全共线的。
答案 2 :(得分:0)
至少获得标准错误等的方法是使用
if