2012-03-28 2 views
1

私はGLMMに使用したい環境変数のデータセットを持っています。私はAEDパッケージ(http://www.highstat.com/Book2/AED_1.0.zip)のcorvif関数を使用して、高いインフレ率の変数を特定して削除しています。インフレ率の高い変数を削除して新しいデータセットを作成する

GVIF値> 3(最初に高い値が削除された)でデータセットから一度に1つの変数を削除するのではなく、自動的にこのタスクを達成するループを作成する方法を知りたい残りの変数(すなわち、GVIF values < 3のもの)のみを持つデータセット。

この問題を新しいRユーザーにどのようにアプローチするかについての提案はありますか?ここで

は私のサンプルデータは、次のとおりです。

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

サンプルコード:

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

あなたがしようとしているかを示す場合には、人々は良い答えで応答する可能性が高いだろう。 – Andrie

+0

私は上記のパッケージの複雑さに精通していないので、あなたが手で行う方法(私たち)を私に見せることができれば大きな助けになるでしょう。 –

+0

GVIFが線形回帰のVIFと同じ縮尺である場合、3を超える値を削除するよりも過度に制限されているようです。 –

答えて

2

ここでは、これを行うためのアルゴリズムです。私は、組み込みのデータセットlongleyを示しており、私もむしろパッケージAED使用するよりも、パッケージcarに機能vifを使用:それはかなりではない、との関数内にラップする必要があります

を、私はのための運動としてそのままに興味のある読者。

コード:

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) 

出力:

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

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

    Unemployed Armed.Forces 
    1.032501  1.032501 
関連する問題