मल्टीमोनियल [बंद] में glmnet चलाते समय त्रुटि


9

इस प्रश्न में वर्णित समस्या आर पैकेज ग्लमनेट के 1.7.3 संस्करण में तय की गई है।

मुझे परिवार के साथ glmnet चलाने में कुछ समस्याएं हो रही हैं = बहुराष्ट्रीय, और सोच रहा था कि ऐसा ही कुछ हुआ है या मुझे यह बताने में सक्षम हो सकता है कि मैं क्या कर रहा हूं।

जब मैं अपना खुद का डमी डेटा डालता हूं, तो त्रुटि "लागू करने में त्रुटि (nz, 1, मंझला): मंद (एक्स) एक सकारात्मक लंबाई होनी चाहिए" जब मैं चलता हूं 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])

मैं पैकेज डॉक्स से उदाहरण कोड को चलाने में सक्षम हूं, जिससे मुझे संदेह होता है कि मैं या तो कुछ गलत समझ रहा हूं या फिर ग्लमैनेट में एक बग है।

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

एक सूक्ष्म बग है।

जो हो रहा है वह निम्न है: आपके कृत्रिम डेटा सेट में, तीन समूह साधन एक पंक्ति में हैं, और अपेक्षाकृत छोटे मानक विचलन के साथ, तीन समूह आपके 10-आयामी स्थान में रैखिक रूप से अलग हो जाते हैं। परिणामस्वरूप, दूसरे समूह से संबंधित सभी मापदंडों का अनुमान सभी के लिए 0 हैλ। चेक

coef(glm)

आंतरिक रूप से प्रत्येक के लिए निर्धारित cv.glmnetकरने के predictलिए एक कॉल हैλगैर-शून्य गुणांक की संख्या। प्रयत्न

predict(glm, type = "nonzero")

संरचना है, cv.glmnetकोड को पढ़ने से , सूचियों की एक सूची माना जाता है, लेकिन सूची में दूसरी प्रविष्टि 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))
}

दो नेस्टेड sapplyकॉल से लौटा परिणाम एक मैट्रिक्स नहीं है जैसा कि अंतिम कॉल में अपेक्षित है apply। यह त्रुटि उत्पन्न करता है।

व्यवहार में त्रुटि के कारण इसे चलाने की संभावना बहुत कम हो सकती है, लेकिन कोड चरम मामलों के लिए निश्चित रूप से मजबूत होना चाहिए। आपको अनुरक्षक को समस्या की रिपोर्ट करनी चाहिए, ट्रेवर हस्ती (उसका ईमेल लिंक पर सूचीबद्ध है)।


विचारशील और त्वरित उत्तर के लिए धन्यवाद। आपके द्वारा कही गई अधिकांश बातें सही प्रतीत होती हैं, लेकिन मुझे यकीन नहीं है कि इसका कारण जरूरी है कि वे रैखिक रूप से अलग हैं। यदि आप इनपुट में rnorm की एसडी को बढ़ाते हैं, तो त्रुटि दूर हो जाती है:
BenJWoodcroft

1
NRH: एक व्यक्ति ने असंबंधित सोचा - मुझे संदेह है कि प्रो.हस्ती आपके ईमेल को सादे पाठ में इस तरह से डालने की सराहना नहीं कर सकता है क्योंकि यह संभवतः स्पैम को आमंत्रित करता है (हालांकि यह निश्चित रूप से बताना असंभव है)। मेरे
कहने का

2
@BenJWoodcroft, यह रैखिक पृथक्करण नहीं है जैसे कि त्रुटि को ट्रिगर करता है लेकिन एक रेखा के साथ तीन समूहों का ज्यामितीय संगठन। रेखीय पृथक्करण इस संगठन को सैंपल किए गए डेटा में अधिक स्पष्ट करता है, और यदि आप मानक विचलन को पर्याप्त रूप से बढ़ाते हैं, तो glmnet संगठन को "खोज" नहीं करता है। जैसा कि आपका दूसरा उदाहरण दिखाता है, आपको वास्तव में रैखिक पृथक्करण की आवश्यकता नहीं है। आप ईमेल पते के बारे में सही हैं, धन्यवाद।
एनआरएच

3
मुझे यह त्रुटि glmnet 1.9.8 के साथ और R 3.1.1 के साथ ऊपर के कोड के साथ-साथ नमूना डेटा के साथ विगनेट पर प्रदान किए गए कोड के साथ भी मिल रही है।
user2030668

1
मैं Windows और glmnet 2.0-2 पर R 3.2.1 का उपयोग करके वास्तविक दुनिया के डेटा के साथ इस त्रुटि को देख रहा हूं। प्रशिक्षण के आंकड़ों में 229 भविष्यवक्ताओं की 449 टिप्पणियां हैं। प्रतिक्रिया चर के 9 स्तर हैं। आगे बढ़ने का कोई सुझाव स्वागत योग्य होगा।
केंट जॉनसन

-1

पहले अपने मैट्रिक्स को उदाहरण के लिए रूपांतरित करें

संख्यात्मक में प्रतिक्रिया के बिना x। उसके बाद मॉडल में योगदान करने वाले महत्वपूर्ण गुणांक (ओं) को खोज के रूप में खोज के रूप में नामांकनों या रोनामेस द्वारा बनाया गया है जैसा कि डेटा संरचना में चर हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.