2013-05-23 12 views
6

Sto provando a stimare un set di dati del pannello con un termine di interazione per aree geografiche (LoadArea, DischargeArea) che indica un percorso. Utilizzando la specifica effetti fissi, che non gli piace il termine di interazione (LoadArea * DischargeArea) e produce il seguente errore quando si riassumere la regressione:Regressione effetti fissi con errore di causa termini di interazione

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 

Questo funziona bene in un normale regressione OLS sostituzione PLM con la funzione lm . La domanda è: perché non funziona per la mia modella?

risposta

4

Questo è un problema di collinearità tra le variabili.

Il comando lm posiziona automaticamente le NA nel vettore beta per le variabili che non sono state stimate a causa della colinearità, ma il PLM no.

Quando si dispone di LoadArea * DischargeArea PLM tre variabili per il vostro modello:

LoadArea + DischargeArea + LoadArea:DischargeArea 

Dopo che il PLM li sminuire.

In questo caso, e senza ulteriori informazioni sui dati la mia ipotesi è che una di queste variabili è allineati perfettamente con uno dei livelli di fattori:

as.factor(Laycan.Day.Diff) 

Nel tuo caso vorrei provare a stimare il modello senza il fattore. Se funziona, sai che i fattori stanno causando il problema. Se si arriva a questo, è possibile convertire ciascun fattore in un manichino 0/1 esplicito e aggiungerli uno a uno finché non si capisce da dove proviene il problema.

Per determinare quali variabili sono allineati si potrebbe provare qualcosa di simile:

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]) 

Linea 5 è l'avvilente. Questo altro stack overflow post descrive le operazioni del data.table che ho usato sopra in dettaglio.

L'uscita del codice di cui sopra saranno:

> 
       demeaned_var1 demeaned_var2 
demeaned_var1    1    1 
demeaned_var2    1    1 

Questo vi dirà che umiliate Vars sono perfettamente allineati.

+1

Ho lo stesso problema.Ma nel mio modello ho 41 variabili indipendenti. Come posso sapere quali stanno causando la multicollinearità? – Riccardo

+0

Se hai data.table (che è un ottimo pacchetto) puoi farlo facilmente sminuendo tutti i tuoi vars manualmente e poi calcolando la tabella di correlazione. Qualcosa come quello che ho incollato sopra. – mmgm

+0

Da un po 'di tempo, il pacchetto 'plm' ha due funzioni per rilevare la dipendenza lineare:' detect_lin_dep' e 'alias'. Assicurati di leggere la loro documentazione perché la dipendenza lineare dopo le trasformazioni di dati (ad esempio la trasformazione all'interno/degradante) può essere difficile da individuare. – Helix123

5

Si prega di notare che plm() sta giocando bene per tutto il tempo, è la funzione summary.plm() che si sta rompendo male! L'approfondimento della funzione rivela il problema nella parte in cui calcola R^2.

Read more here on the same problem at stackexchange

soluzioni rapide e non così eleganti con:

(1) Sostituzione LoadArea: DischargeArea con LoadArea * DischargeArea

(2) Creare manualmente interazione separata variabile

LoadxDischarge <- LoadArea*DischargeArea 
0

Un modo per ottenere almeno gli errori standard ecc. È utilizzare

library("sandwich") 
library("lmtest") 
coeftest(mult_fe) 
Problemi correlati