多項式でglmnetを実行するとエラーが発生する[終了]


9

この質問で言及されている問題は、Rパッケージglmnetのバージョン1.7.3で修正されています。

私はfamily = multinomialでglmnetを実行する際にいくつかの問題を抱えており、同様の何かに遭遇したり、私が間違っていることを教えたりできるのではないかと思っていました。

自分のダミーデータを入力すると、実行時に「apply(nz、1、median)のエラー:dim(X)は正の長さでなければなりません」というエラーが表示されますcv.glmnet。私にとってあまり有益ではありませんでした。

y=rep(1:3,20) #=> 60 element vector
set.seed(1011)
x=matrix(y+rnorm(20*3*10,sd=0.4),nrow=60) # 60*10 element matrix
glm = glmnet(x,y,family="multinomial")   #=> returns without error
crossval = cv.glmnet(x,y,family="multinomial")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="class")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="mae")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
cvglm = cv.glmnet(x,y,family="multinomial",lambda=2)   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length

以下は、glmnetで解決しようとしていた問題の視覚的な説明です(それが役立つ場合)。

my_colours = c('red','green','blue')
plot(x[,1],x[,2],col=my_colours[y])

パッケージのドキュメントからサンプルコードを実行できます。そのため、何かを誤解しているか、glmnetにバグがあるのではないかと疑っています。

library(glmnet)
set.seed(10101)
n=1000;p=30
x=matrix(rnorm(n*p),n,p) #=> 1000*30 element matrix
beta3=matrix(rnorm(30),10,3)
beta3=rbind(beta3,matrix(0,p-10,3))
f3=x%*% beta3
p3=exp(f3)
p3=p3/apply(p3,1,sum)
g3=rmult(p3) #=> 1000 element vector
set.seed(10101)
cvfit=cv.glmnet(x,g3,family="multinomial")

これはRバージョン2.13.1(2011-07-08)とglmnet 1.7.1を使用していますが、R 2.14.1でも同じ問題が発生する可能性があります。アイデアはありますか?

回答:


11

微妙なバグがあります。

λ

coef(glm)

cv.glmnetpredictλ

predict(glm, type = "nonzero")

構造は、cv.glmnetコードの読み取りから、リストのリストであることが想定されていますが、リストの2番目のエントリはNULLであり、リストではありません!これによりエラーが発生します。これは、次のコードブロックで発生します。cv.glmnet

if (inherits(glmnet.object, "multnet")) {
    nz = predict(glmnet.object, type = "nonzero")
    nz = sapply(nz, function(x) sapply(x, length))
    nz = ceiling(apply(nz, 1, median))
}

ネストされた2つのsapply呼び出しから返される結果は、の最後の呼び出しで期待されるような行列ではありませんapply。これによりエラーが発生します。

実際にはエラーが発生する可能性は非常に低いかもしれませんが、コードはもちろん、極端な場合に対して堅牢でなければなりません。メンテナーのTrevor Hastieに問題を報告してください(彼のメールはリンクに記載されています)。


思慮深く迅速な返信をありがとう。あなたが言うほとんどのことは正しいように見えますが、理由はそれらが線形的に分離可能であるという理由が必ずしも必要であるかどうかはわかりません。あなたが入力中rnormのSDを増やす場合は、エラーが消える:
BenJWoodcroft

1
NRH:無関係だと思った人がいると思います-Hastie教授は、スパムを招く可能性があるため、このようにプレーンテキストでメールを送信することを認めていない可能性があります(もちろん、確かに言うことはできません)。あなたの答えは非常に有用だったと私は..過酷に音を意味するものではありません
BenJWoodcroft

2
@BenJWoodcroft、エラーをトリガーするのは線形分離可能性ではなく、直線に沿った3つのグループの幾何学的構成です。線形分離可能性により、サンプリングされたデータでこの組織がより明確になり、標準偏差を十分に大きくすると、glmnetは組織を「発見」しません。2番目の例が示すように、線形分離可能性は実際には必要ありません。ありがとうございます。
NRH 2012年

3
また、glmnet 1.9.8およびR 3.1.1で、上記のコードとサンプルデータを含むビネットで提供されるコードを使用して、このエラーが発生しています。
user2030668 2014年

1
WindowsのR 3.2.1とglmnet 2.0-2を使用している実際のデータでこのエラーが発生します。トレーニングデータには、229の予測子の449の観測があります。応答変数には9つのレベルがあります。続行する方法についての提案は大歓迎です。
ケントジョンソン

-1

たとえば、まずマトリックスを変換します

数値への応答なしのx。その後、モデルに寄与する重要な係数は、データ構造と同様に、変数が列名または行名を検索して見つけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.