मैं alway मुसीबत कैसे S3 पद्धतियों को बुलाया जाता संबंधी दस्तावेज़ को समझने, और इस समय यह मुझे वापस काट रहा है लिया है के आदेश।S3 और कक्षाओं
मैं एक से अधिक सवाल पूछने के लिए सामने माफी माँगता हूँ, लेकिन वे सभी बारीकी से जुड़े हुए हैं। कार्यों के जटिल सेट के दिल में गहराई से, मैं विशेष रूप से लॉजिस्टिक वाले glmnet
फिट करता हूं। अब, glmnet
दस्तावेज दोनों वर्गों "ग्लैमनेट" और (लॉजिस्टिक रिग्रेशन के लिए) "लॉगनेट" रखने के लिए इसके वापसी मूल्य को निर्दिष्ट करता है। वास्तव में, ये इस क्रम में निर्दिष्ट हैं।
हालांकि, glmnet
के कार्यान्वयन के अंत में की तलाश में, Righter करने के लिए कॉल (आंतरिक समारोह) lognet
, कि fit
के वर्ग सेट के बाद करने के लिए "lognet", मैं सिर्फ वापसी से पहले कोड की इस पंक्ति को देखने के (चर fit
) का:
class(fit) = c(class(fit), "glmnet")
इस से, मैं निष्कर्ष निकालना होगा कि वर्गों के आदेश "lognet" वास्तव में, "glmnet" है।
दुर्भाग्य से, फिट मैं था, था (doc की तरह चलता है):
> class(myfit)
[1] "glmnet" "lognet"
इस के साथ समस्या यह रास्ता S3 तरीकों इसके लिए भेज दिया जाता है विशेष रूप से predict
में, है। यहाँ predict.lognet
के लिए कोड है:
function (object, newx, s = NULL, type = c("link", "response",
"coefficients", "class", "nonzero"), exact = FALSE, offset,
...)
{
type = match.arg(type)
nfit = NextMethod("predict") #<- supposed to call predict.glmnet, I think
switch(type, response = {
pp = exp(-nfit)
1/(1 + pp)
}, class = ifelse(nfit > 0, 2, 1), nfit)
}
मैं अपने तर्क समझाने के लिए एक टिप्पणी जोड़ दिया है। अब जब मैं एक नया DataMatrix mydata
और type="response"
के साथ इस myfit
पर भविष्यवाणी कहते हैं, इस तरह:
predict(myfit, newx=mydata, type="response")
, मुझे नहीं पता, प्रलेखन के अनुसार, भविष्यवाणी की संभावनाओं, लेकिन रैखिक संयोजन हो जाता है, जो वास्तव में तुरंत predict.glmnet
पर कॉल करने का नतीजा।
मैं वर्गों के आदेश को पलटने की कोशिश की है, इसलिए जैसे:
orgclass<-class(myfit)
class(myfit)<-rev(orgclass)
और फिर कर भविष्यवाणी फिर से फोन: लो और निहारना: यह काम करता है! मैं संभावनाएं प्राप्त करता हूं।
तो, यहाँ कुछ सवाल आते हैं:
- हूँ सही में 'सीखा होने' कि S3 तरीकों आदेश कक्षाओं की उपस्थिति के में भेज दिया जाता है मैं?
- मैं सही
glmnet
में कोड संभालनेpredict
का सही भेजने के लिए गलत क्रम का कारण होता है में हूं? - मेरे कोड में कुछ भी नहीं है कि manipulates कक्षाएं स्पष्ट रूप से/दिख मेरी जानकारी के लिए वहाँ है। में परिवर्तन का कारण क्या हो सकता है?
पूर्णता 'खातिर: यहाँ के साथ चारों ओर खेलने के लिए (के रूप में मैं अपने आप को अब कर रहा हूँ) कुछ नमूना कोड:
library(glmnet)
y<-factor(sample(2, 100, replace=TRUE))
xs<-matrix(runif(100), ncol=1)
colnames(xs)<-"x"
myfit<-glmnet(xs, y, family="binomial")
mydata<-matrix(runif(10), ncol=1)
colnames(mydata)<-"x"
class(myfit)
predict(myfit, newx=mydata, type="response")
class(myfit)<-rev(class(myfit))
class(myfit)
predict(myfit, newx=mydata, type="response")
class(myfit)<-rev(class(myfit))#set it back
class(myfit)
उत्पन्न डेटा के आधार पर, अंतर कम या ज्यादा स्पष्ट (है मेरे सच्चे डेटासेट में मैंने तथाकथित संभावनाओं में नकारात्मक मूल्यों को देखा, इस तरह मैंने समस्या को उठाया), लेकिन आपको वास्तव में एक अंतर देखना चाहिए।
किसी भी इनपुट के लिए धन्यवाद।
संपादित:
मैं सिर्फ भयानक सच्चाई पता चला: या तो आदेश glmnet 1.5.2 (जो सर्वर जहाँ मैं वास्तविक कोड भाग गया, वर्ग आदेश के साथ फिट है, जिसके परिणामस्वरूप पर मौजूद है में काम किया उलट दिया गया), लेकिन 1.6 से कोड को "लॉगनेट", "ग्लैमनेट" होने की आवश्यकता होती है। मैंने अभी तक जांच नहीं की है कि 1.7 में क्या होता है।
सूचनाओं की मूल बातें याद दिलाने के लिए @Aaron के लिए धन्यवाद ('अगर सब कुछ विफल हो जाता है, फिर से शुरू करें': 'अपने संस्करणों की जांच करें')। मैंने गलती से यह माना था कि सांख्यिकीय सीखने के देवताओं द्वारा एक पैकेज इस प्रकार की त्रुटि से संरक्षित किया जाएगा), और @Gavin को S3 कैसे काम करता है इसके पुनर्निर्माण की पुष्टि के लिए।
जब मैं अपना कोड चलाता हूं तो मुझे पहले 'कक्षा' कॉल के बाद ऑर्डर '' लॉगनेट "" ग्लैनेट "मिलता है, जो आपको जो मिलता है उससे पीछे है। मेरे पास glmnet 1.7 है; आपके पास क्या संस्करण है? – Aaron