आर में एक नेल्स मॉडल के लिए सही शुरुआती मूल्य प्राप्त करना


13

मैं एक साधारण पावर लॉ मॉडल को एक डेटा सेट में फिट करने की कोशिश कर रहा हूं जो इस प्रकार है:

mydf:

rev     weeks
17906.4 1
5303.72 2
2700.58 3
1696.77 4
947.53  5
362.03  6

लक्ष्य के माध्यम से बिजली लाइन को पारित करने और revभविष्य के हफ्तों के लिए vlaues भविष्यवाणी करने के लिए इसका इस्तेमाल किया जा रहा है। अनुसंधान के एक समूह ने मुझे nlsकार्य करने के लिए प्रेरित किया , जिसे मैंने निम्नानुसार कार्यान्वित किया।

newMod <- nls(rev ~ a*weeks^b, data=modeldf, start = list(a=1,b=1))
predict(newMod, newdata = data.frame(weeks=c(1,2,3,4,5,6,7,8,9,10)))

जब यह एक lmमॉडल के लिए काम करता है , तो मुझे एक singular gradientत्रुटि मिलती है , जिसे मैं समझता हूं कि मेरे शुरुआती मूल्यों के साथ क्या करना है aऔर b। मैंने विभिन्न मूल्यों की कोशिश की, यहां तक ​​कि एक्सेल में इसे प्लॉट करने के लिए, एक अकेला पास करने के लिए, एक समीकरण प्राप्त करें, फिर समीकरण से मूल्यों का उपयोग करें, लेकिन मुझे अभी भी त्रुटि मिलती है। मैंने इस तरह के उत्तरों का एक गुच्छा देखा और दूसरे उत्तर की कोशिश की (पहले नहीं समझ सका), लेकिन कोई नतीजा नहीं निकला।

मैं वास्तव में यहां कुछ मदद का उपयोग कर सकता हूं कि सही शुरुआती मान कैसे पाएं। या वैकल्पिक रूप से, मैं nls के बजाय अन्य फ़ंक्शन का क्या उपयोग कर सकता हूं।

मामले में आप mydfआसानी से विश्राम करना चाहते हैं :

mydf <- data.frame(rev=c(17906.4, 5303.72, 2700.58 ,1696.77 ,947.53 ,362.03), weeks=c(1,2,3,4,5,6)) 

1
हालांकि आर के संदर्भ में कहा गया है (यह वास्तव में कुछ भाषा में कहा गया है), गैर-रेखीय मॉडल फिट के लिए उपयुक्त शुरुआती मूल्य कैसे प्राप्त करें, यहां पर विषय के लिए पर्याप्त रूप से सांख्यिकीय है, आईएमओ। यह वास्तव में एक प्रोग्रामिंग क्यू नहीं है, जैसे।
गंग -

जवाबों:


14

यह नॉनलिअर कम से कम वर्गों के मॉडल के साथ एक आम समस्या है; यदि आपके आरंभिक मूल्य इष्टतम से बहुत दूर हैं, तो एल्गोरिथम अभिसरण नहीं कर सकता है, भले ही यह इष्टतम के निकट व्यवहार किया जा सकता है।

यदि आप दोनों पक्षों के लॉग लेने से शुरू करते हैं और एक रेखीय मॉडल फिट करते हैं, तो आपको ढलान और अवरोधन (9.947 और -2.011) के रूप में और अनुमान मिलते हैं (संपादित करें: यह प्राकृतिक लॉग है)बीlog(a)b

यदि आप उन चीज़ों का उपयोग करते हैं जो और लिए शुरुआती मूल्यों का मार्गदर्शन करते हैं तो सब कुछ ठीक काम करने लगता है:bab

 newMod <- nls(rev ~ a*weeks^b, data=mydf, start = list(a=exp(9.947),b=-2.011))
 predict(newMod, newdata = data.frame(weeks=c(1,2,3,4,5,6,7,8,9,10)))
 [1] 17919.2138  5280.7001  2584.0109  1556.1951  1050.1230   761.4947   580.3091   458.6027
 [9]   372.6231   309.4658

यह बहुत उपयोगी है, बहुत बहुत धन्यवाद! मेरे पास एक सवाल है कि आपको अपना "मूल्य" यहां कैसे मिला। मैंने lm (log10 (Rev) ~ log10 (सप्ताह)) चलाने की कोशिश की और फिर "सारांश" फ़ंक्शन का उपयोग कर रहा हूं, और जब मुझे समान "b" मान मिलता है, तो मेरा "a" मान 4.3201 तक निकल जाता है। = 9.947 पर पहुंचने के लिए आपने क्या किया?
नियोनब्यूहेयर

ध्यान दें कि मैं expइसे अनलॉग्ड मानों पर वापस ले जाता था, जो यह दर्शाता है कि मैंने सादे logफ़ंक्शन का उपयोग किया है । जब तक आप किस लॉग और एंटीलॉग का उपयोग करते हैं, तब तक आप संगत मूल्य के लिए एक ही उत्तर प्राप्त करेंगे। तो आप बेस 10 कर सकते हैं और मैं बेस और सब कुछ वैसा ही कर सकता हूं । e
Glen_b -Reinstate मोनिका

आह, तुम बिलकुल सही हो। मेरी ओर से शौकिया गलती। गणितीय संकेतन के बारे में सोच "लॉग" का मतलब लॉग बेस 10 और प्राकृतिक लॉग के लिए "ln" से है। स्पष्टीकरण के लिए धन्यवाद।
नियॉनब्यूहेयर

1
कई गणितज्ञों (और कई सांख्यिकीविदों) के लिए, एक अनडॉर्नड "लॉग" प्राकृतिक लॉग है, जितना कि एक पाप फ़ंक्शन के अनडॉर्न किए गए तर्क रेडियंस में है। [समापन सम्मेलनों से भ्रम की स्थिति पैदा हो सकती है, दुर्भाग्य से, लेकिन जब मैंने R का उपयोग करना शुरू किया, उदाहरण के लिए, मैंने आर के बाद से लॉग फ़ंक्शन के उपयोग के बारे में दो बार नहीं सोचा और मैं एक ही सम्मेलन को साझा करता हूं।]
Glen_b -Reinstone Monica

4

प्रयत्न

 newMod <- nls(rev ~ a*weeks^b, data=mydf, startlist(a=17919.2127344,b=-1.76270557120))

मुझे इस उत्तर को थोड़ा विस्तार देने के लिए कहा गया है। यह समस्या इतनी सरल है कि मैं आश्चर्यचकित हूं कि इसमें nls विफल है। हालांकि वास्तविक समस्या नॉनलाइन मॉडल फिटिंग के संपूर्ण आर दृष्टिकोण और दर्शन के साथ है। वास्तविक दुनिया में कोई व्यक्ति x को -1 और 1 के बीच और y और y के बीच 0 1 a (y = ax ^ b) के बीच लेटने के लिए स्केल करेगा। यह संभवत: सम्‍मिलित करने के लिए nls पाने के लिए पर्याप्त होगा। निश्चित रूप से ग्लेन बताते हैं कि आप इसी लॉग-लीनियर मॉडल को फिट कर सकते हैं। यह इस तथ्य पर निर्भर करता है कि एक सरल परिवर्तन मौजूद है जो मॉडल को रैखिक करता है। अक्सर ऐसा नहीं होता है। आर रूटीन के साथ nls की समस्या यह है कि वे मॉडल को पुन: व्यवस्थित करने के लिए समर्थन की पेशकश नहीं करते हैं। इस मामले में पुनर्मूल्यांकन सरल है, बस पुनर्विक्रय / हाल ही में x और y। हालाँकि, मॉडल के फिट होने से उपयोगकर्ता के पास अलग-अलग पैरामीटर होंगे और मूल लोगों से बी। हालांकि इनमें से मूल लोगों की गणना करना सरल है, दूसरी कठिनाई यह है कि इन पैरामीटर अनुमानों के लिए अनुमानित मानक विचलन प्राप्त करना सामान्य रूप से इतना सरल नहीं है। यह डेल्टा विधि द्वारा किया जाता है जिसमें लॉग-लाइबिलिटी और कुछ डेरिवेटिव के हेस्सियन शामिल होते हैं। नॉनलाइनियर पैरामीटर आकलन सॉफ्टवेयर को इन गणनाओं को स्वचालित रूप से आपूर्ति करनी चाहिए, ताकि मॉडल के पुनर्मूल्यांकन आसानी से समर्थित हो। एक और चीज जिसका सॉफ्टवेयर को समर्थन करना चाहिए, वह है चरणों की धारणा। आप पहले चरण के रूप में ग्लेन के संस्करण के साथ मॉडल को फिट करने के बारे में सोच सकते हैं। चरण 2 में "वास्तविक" मॉडल फिट है। दूसरी कठिनाई यह है कि इन पैरामीटर अनुमानों के लिए अनुमानित मानक विचलन प्राप्त करना सामान्य रूप से इतना सरल नहीं है। यह डेल्टा विधि द्वारा किया जाता है जिसमें लॉग-लाइबिलिटी और कुछ डेरिवेटिव के हेस्सियन शामिल होते हैं। नॉनलाइनियर पैरामीटर आकलन सॉफ्टवेयर को इन गणनाओं को स्वचालित रूप से आपूर्ति करनी चाहिए, ताकि मॉडल के पुनर्मूल्यांकन आसानी से समर्थित हो। एक और चीज जिसका सॉफ्टवेयर को समर्थन करना चाहिए, वह है चरणों की धारणा। आप पहले चरण के रूप में ग्लेन के संस्करण के साथ मॉडल को फिट करने के बारे में सोच सकते हैं। चरण 2 में "वास्तविक" मॉडल फिट है। दूसरी कठिनाई यह है कि इन पैरामीटर अनुमानों के लिए अनुमानित मानक विचलन प्राप्त करना सामान्य रूप से इतना सरल नहीं है। यह डेल्टा विधि द्वारा किया जाता है जिसमें लॉग-लाइबिलिटी और कुछ डेरिवेटिव के हेस्सियन शामिल होते हैं। नॉनलाइनियर पैरामीटर आकलन सॉफ्टवेयर को इन गणनाओं को स्वचालित रूप से आपूर्ति करनी चाहिए, ताकि मॉडल के पुनर्मूल्यांकन आसानी से समर्थित हो। एक और चीज जिसका सॉफ्टवेयर को समर्थन करना चाहिए, वह है चरणों की धारणा। आप पहले चरण के रूप में ग्लेन के संस्करण के साथ मॉडल को फिट करने के बारे में सोच सकते हैं। चरण 2 में "वास्तविक" मॉडल फिट है। नॉनलाइनियर पैरामीटर आकलन सॉफ्टवेयर को इन गणनाओं को स्वचालित रूप से आपूर्ति करनी चाहिए, ताकि मॉडल के पुनर्मूल्यांकन आसानी से समर्थित हो। एक और चीज जिसका सॉफ्टवेयर को समर्थन करना चाहिए, वह है चरणों की धारणा। आप पहले चरण के रूप में ग्लेन के संस्करण के साथ मॉडल को फिट करने के बारे में सोच सकते हैं। चरण 2 में "वास्तविक" मॉडल फिट है। नॉनलाइनियर पैरामीटर आकलन सॉफ्टवेयर को इन गणनाओं को स्वचालित रूप से आपूर्ति करनी चाहिए, ताकि मॉडल के पुनर्मूल्यांकन आसानी से समर्थित हो। एक और चीज जिसका सॉफ्टवेयर को समर्थन करना चाहिए, वह है चरणों की धारणा। आप पहले चरण के रूप में ग्लेन के संस्करण के साथ मॉडल को फिट करने के बारे में सोच सकते हैं। चरण 2 में "वास्तविक" मॉडल फिट है।

मैं आपके मॉडल को AD मॉडल बिल्डर के साथ फिट करता हूं जो प्राकृतिक तरीके से चरणों का समर्थन करता है। पहले चरण में केवल अनुमान लगाया गया था। यह आपके मॉडल को बॉलपार्क में मिलता है। दूसरे चरण में ए और बी को समाधान प्राप्त करने का अनुमान है। AD मॉडल बिल्डर, डेल्टा मापदंडों के माध्यम से मॉडल मापदंडों के किसी भी फ़ंक्शन के लिए मानक विचलन की गणना स्वचालित रूप से करता है ताकि यह मॉडल के स्थिर पुनर्संरचना को प्रोत्साहित करे।


2

लेवेनबर्ग-मार्क्वार्ड एल्गोरिदम मदद कर सकता है:

modeldf <- data.frame(rev=c(17906.4, 5303.72, 2700.58 ,1696.77 ,947.53 ,362.03), weeks=c(1,2,3,4,5,6))

require(minpack.lm)
fit <- nlsLM(rev ~ a*weeks^b, data=modeldf, start = list(a=1,b=1))

require(broom)
fit_data <- augment(fit)

plot(.fitted~rev, data=fit_data)

1

मेरे अनुभव में एनएलआर मॉडल के मापदंडों के लिए शुरुआती मूल्य खोजने का एक अच्छा तरीका एक विकासवादी एल्गोरिथ्म का उपयोग करना है। एक खोज स्थान में यादृच्छिक अनुमानों (माता-पिता) की एक प्रारंभिक आबादी (100) से सर्वश्रेष्ठ 20 (वंश) का चयन करते हैं और एक सफल आबादी में खोज को परिभाषित करने में मदद करने के लिए इनका उपयोग करते हैं। अभिसरण तक दोहराएँ। ग्रेडिएंट या हेसियन की जरूरत नहीं है, बस SSE मूल्यांकन। यदि आप बहुत लालची नहीं हैं तो यह अक्सर काम करता है। लोगों को अक्सर होने वाली समस्याएं यह है कि वे एक वैश्विक खोज का काम करने के लिए एक स्थानीय खोज (न्यूटन-राफसन) का उपयोग कर रहे हैं। हमेशा की तरह यह काम के लिए सही उपकरण का उपयोग करने की बात है। न्यूटन स्थानीय खोज के लिए शुरुआती मूल्यों को खोजने के लिए एक ईए वैश्विक खोज का उपयोग करना अधिक समझ में आता है, और फिर इसे न्यूनतम तक चलने दें। लेकिन, सभी चीजों के साथ, शैतान विस्तार में है।

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