2012-03-28 5 views
1

Ich habe einen Datensatz von Umgebungsvariablen, die ich für ein GLMM verwenden möchte. Ich verwende die Funktion corvif aus dem Paket AED (http://www.highstat.com/Book2/AED_1.0.zip), um Variablen mit hohen Inflationsfaktoren zu identifizieren und zu entfernen.Erstellen eines neuen Datensatzes zum Entfernen von Variablen mit hohen Inflationsfaktoren

Anstatt manuell eine Variable aus meinem Datensatz mit einem GVIF-Wert> 3 (höchster Wert zuerst entfernt) zu entfernen, würde ich gerne wissen, wie man eine Schleife schreibt, um diese Aufgabe automatisch zu erledigen, wobei das Ergebnis ein neues ist Datensatz mit nur den verbleibenden Variablen (dh solche mit GVIF values < 3).

Haben Sie Vorschläge, wie Sie dieses Problem für einen neuen R-Benutzer lösen können?

Hier ist mein Beispieldaten:

WW_Covs <- structure(list(Latitude = c(62.4419, 67.833333, 65.95, 63.72935, 
60.966667, 60.266667, 55.660455, 62.216667, 61.3, 61.4, 62.084139, 
55.662566, 64.48508, 63.208354, 62.87591, 62.70856, 62.64009, 
63.79488, 59.55, 62.84206), BIO_02 = c(87, 82, 75, 70, 77, 70, 
59, 84, 84, 79, 85, 60, 91, 87, 74, 74, 76, 70, 76, 74), BIO_03 = c(26, 
23, 25, 26, 25, 24, 25, 25, 26, 25, 26, 26, 24, 25, 24, 25, 25, 
25, 26, 24), BIO_04 = c(8443, 9219, 7594, 6939, 7928, 7593, 6160, 
8317, 8167, 7972, 8323, 6170, 9489, 8578, 7814, 7680, 7904, 7149, 
7445, 7803), BIO_05 = c(201, 169, 151, 166, 194, 210, 202, 205, 
204, 186, 205, 200, 200, 195, 170, 154, 180, 166, 219, 170), 
BIO_06 = c(-131, -183, -144, -102, -107, -75, -26, -119, 
-113, -120, -120, -28, -169, -143, -131, -142, -124, -111, 
-72, -129), BIO_08 = c(128, 109, 85, 78, 122, 145, 153, 134, 
130, 126, 132, 152, 120, 119, 115, 98, 124, 104, 147, 115 
), BIO_09 = c(-31, -81, -16, 13, -60, -6, 25, -25, -25, -70, 
-25, 23, -56, -39, -47, -60, -39, 8, 0, -46), BIO_12 = c(667, 
481, 760, 970, 645, 557, 645, 666, 652, 674, 670, 670, 568, 
598, 650, 734, 620, 868, 571, 658), BIO_13 = c(78, 77, 96, 
109, 85, 70, 67, 77, 84, 93, 78, 68, 72, 78, 93, 99, 90, 
96, 72, 93), BIO_15 = c(23, 40, 25, 21, 36, 30, 21, 24, 28, 
34, 24, 22, 28, 29, 34, 32, 36, 22, 30, 34), BIO_19 = c(147, 
85, 180, 236, 108, 119, 154, 149, 135, 118, 148, 162, 117, 
119, 120, 141, 111, 204, 111, 122)), .Names = c("Latitude", 
"BIO_02", "BIO_03", "BIO_04", "BIO_05", "BIO_06", "BIO_08", "BIO_09", 
"BIO_12", "BIO_13", "BIO_15", "BIO_19"), row.names = c(1:20), class = "data.frame") 

Beispielcode:

library(AED) 
WW_Final <- corvif(WW_Covs) 
test <- corvif(WW_Covs]) 
test[order(-test$GVIF), ] 
if(test$GVIF[1,] > 3, # this is where I get stuck... 
+0

Wenn Sie zeigen, was Sie haben versucht, die Menschen eher mit einer guten Antwort zu reagieren wäre. – Andrie

+0

Ich bin nicht vertraut mit Feinheiten der oben genannten Paket, so wäre es eine große Hilfe, wenn Sie mir (uns?) Zeigen könnten, wie Sie es von Hand tun. –

+0

Wenn GVIF in linearer Regression im gleichen Maßstab wie VIF ist, scheint die Eliminierung bei einem Wert über 3 zu restriktiv. –

Antwort

2

Hier ist ein Algorithmus, dies zu tun. Ich erläutere mit dem eingebauten in Dataset longley, und ich verwende auch Funktion vif in Paket car, anstatt Paket mit AED:

Es ist nicht schön, und soll innerhalb einer Funktion gewickelt werden, aber ich lasse das als eine Übung für der interessierte Leser.

Der Code:

library(car) 

dat <- longley 

cutoff <- 2 
flag <- TRUE 
while(flag){ 
    fit <- lm(Employed ~ ., data=dat) 
    vfit <- vif(fit) 
    if(max(vfit) > cutoff){ 
    dat <- dat[, -which.max(vfit)] 
    } else { 
    flag <- FALSE 
    } 
} 

print(fit) 
print(vfit) 

Der Ausgang:

Call: 
lm(formula = Employed ~ ., data = dat) 

Coefficients: 
(Intercept) Unemployed Armed.Forces 
    50.66281  0.02265  0.02847 

    Unemployed Armed.Forces 
    1.032501  1.032501 
Verwandte Themen