2011-12-10 50 views
20

データセットでglmnetパッケージを使用しようとしています。私はglmnet()のラムダ値を得るためにcv.glmnet()を使用しています。ここではデータセットとエラーメッセージです:R glmnet:「(リスト)オブジェクトを強制的に「double」と入力することはできません」

> head(t2) 
    X1 X2  X3 X4 X5   X6 X7 X8 X9 X10 X11 X12 
1 1 1 0.7661266 45 2 0.80298213 9120 13 0 6 0 2 
2 2 0 0.9571510 40 0 0.12187620 2600 4 0 0 0 1 
3 3 0 0.6581801 38 1 0.08511338 3042 2 1 0 0 0 
4 4 0 0.2338098 30 0 0.03604968 3300 5 0 0 0 0 
5 5 0 0.9072394 49 1 0.02492570 63588 7 0 1 0 0 
6 6 0 0.2131787 74 0 0.37560697 3500 3 0 1 0 1 
> str(t2) 
'data.frame': 150000 obs. of 12 variables: 
$ X1 : int 1 2 3 4 5 6 7 8 9 10 ... 
$ X2 : int 1 0 0 0 0 0 0 0 0 0 ... 
$ X3 : num 0.766 0.957 0.658 0.234 0.907 ... 
$ X4 : int 45 40 38 30 49 74 57 39 27 57 ... 
$ X5 : int 2 0 1 0 1 0 0 0 0 0 ... 
$ X6 : num 0.803 0.1219 0.0851 0.036 0.0249 ... 
$ X7 : int 9120 2600 3042 3300 63588 3500 NA 3500 NA 23684 ... 
$ X8 : int 13 4 2 5 7 3 8 8 2 9 ... 
$ X9 : int 0 0 1 0 0 0 0 0 0 0 ... 
$ X10: int 6 0 0 0 1 1 3 0 0 4 ... 
$ X11: int 0 0 0 0 0 0 0 0 0 0 ... 
$ X12: int 2 1 0 0 0 1 0 0 NA 2 ... 
> cv1 <- cv.glmnet(t2[,-c(1,2,7,12)], t2[,2], family="multinomial") 
Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs, : 
    (list) object cannot be coerced to type 'double' 

彼らがそうであるように、私は列1,2,7,12を除くてる:idカラム、応答欄、NAのを含んでおり、NAのが含まれています。どんな提案も素晴らしいだろう。

答えて

39

cv.glmnetは、データフレームではなく、予測子の行列を必要とします。一般的に、あなたは

X <- model.matrix(<formula>, data=<data>) 

を経由して、これを入手することができますが、あなたはどの因子変数または複雑かもしれない他の問題を持っているように見えないので、あなたのケースでは、おそらく

X <- as.matrix(t2[,-c(1,2,7,12)]) 

でより簡単にそこに着くことができます問題。


この答えは、ヒットの多くを取得しているので:glmnetUtils packageは、ほとんどのRのモデリング機能のために使用されるように、glmnetする式ベースのインターフェイスを提供します。これには、glmnetcv.glmnetのメソッドと、alphaとlambdaの両方のクロス検証を行う新しいcva.glmnet関数が含まれています。

上記

cv.glmnet(X2 ~ ., data=t2[-1], family="multinomial") 

NAさんになる自動的に処理されているので、あなたは、欠損値の列を除外することはありません。

+6

as.matrix()の代わりに、data.matrix()を使用する必要がありました。 – screechOwl

+1

@screechOwl: 'data.matrix()'を使う必要はないと思います。すべての変数はintまたはnumでした。なぜ再チェックできますか? – smci

関連する問題