2013-05-23 10 views
6

Próbuję oszacować zestaw danych panelu z terminem interakcji dla obszarów geograficznych (LoadArea, DischargeArea), który oznacza trasę. Wykorzystuje specyfikację efekty stałe, to nie podoba mi się określenie interakcji (LoadArea * DischargeArea) i produkuje następujący błąd podczas podsumowania regresji:Naprawiono efekty Regresja z interakcją Termin Przyczyny Błąd

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 

Działa to dobrze w normalnym OLS regresji zastępującego PLM z funkcją lm . Pytanie dlaczego nie działa dla mojego modelu?

Odpowiedz

4

Jest to problem kolinearności między zmiennymi.

Polecenie lm automatycznie umieszcza NA w wektorze beta dla zmiennych, które nie zostały oszacowane z powodu kolinearności, ale PLM tego nie robi.

Kiedy masz LoadArea * DischargeArea PLM będą trzy zmienne do modelu:

LoadArea + DischargeArea + LoadArea:DischargeArea 

Po tym PLM je poniżać.

W tym przypadku, bez dalszych informacji na temat danych Domyślam się, że jedna z tych zmiennych jest idealnie współliniowe z jednym z poziomów czynników:

as.factor(Laycan.Day.Diff) 

w Twoim przypadku chciałbym spróbować oszacować model bez czynnika. Jeśli to działa, wiesz, że czynniki powodują problem. Jeśli dojdzie do tego, możesz przekonwertować każdy czynnik na wyraźny manekin 0/1 i dodać je jeden po drugim, aż zrozumiesz, skąd się bierze problem.

Aby określić, które zmienne są współliniowe możesz spróbować coś takiego:

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

Linia 5 to poniżające. Ten drugi numer stack overflow post opisuje operacje tabeli data.table, które zostały szczegółowo opisane powyżej.

Wyjście z kodem powyżej będą:

> 
       demeaned_var1 demeaned_var2 
demeaned_var1    1    1 
demeaned_var2    1    1 

To powie Ci który poniżana Vars są idealnie współliniowe.

+1

Mam ten sam problem.Ale w moim modelu mam 41 niezależnych zmiennych. Skąd mogę wiedzieć, które z nich powodują wieloklinowość? – Riccardo

+0

Jeśli masz plik data.table (który jest świetnym pakietem), możesz to zrobić łatwo, usuwając wszystkie swoje partycje ręcznie, a następnie obliczając tabelę korelacji. Coś jak to, co wkleiłem powyżej. – mmgm

+0

Od pewnego czasu pakiet 'plm' ma dwie funkcje do wykrywania zależności liniowej:' detect_lin_dep' i 'alias'. Należy przeczytać ich dokumentację, ponieważ zależność liniowa po przekształceniach danych (np. Transformacja wewnętrzna/depresja) może być trudna do wykrycia. – Helix123

5

Zauważ, że funkcja plm() gra dobrze przez cały czas, a funkcja summary.plm() jest fatalna! Zagłębianie się w tę funkcję ujawnia problem w części, w której oblicza R^2.

Read more here on the same problem at stackexchange

Szybkie i nie tak eleganckie obejścia obejmują:

(1) Wymiana LoadArea: DischargeArea z LoadArea * DischargeArea

(2) Ręczne tworzenie oddzielnej interakcji zmiennej

LoadxDischarge <- LoadArea*DischargeArea 
0

Sposób na co najmniej standardowe błędy itp. To użycie

library("sandwich") 
library("lmtest") 
coeftest(mult_fe) 
Powiązane problemy