क्यों nls () मुझे "प्रारंभिक पैरामीटर अनुमानों में विलक्षण ढाल मैट्रिक्स" त्रुटियों दे रहा है?


21

मेरे पास उत्सर्जन में कटौती और प्रति कार लागत पर कुछ बुनियादी आंकड़े हैं:

q24 <- read.table(text = "reductions  cost.per.car
    50  45
    55  55
    60  62
    65  70
    70  80
    75  90
    80  100
    85  200
    90  375
    95  600
    ",header = TRUE, sep = "")

मुझे पता है कि यह एक घातीय कार्य है, इसलिए मैं एक ऐसे मॉडल को खोजने में सक्षम होने की उम्मीद करता हूं जो इसके साथ फिट बैठता है:

    model <- nls(cost.per.car ~ a * exp(b * reductions) + c, 
         data = q24, 
         start = list(a=1, b=1, c=0))

लेकिन मुझे एक त्रुटि मिल रही है:

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates

मैंने जो त्रुटि देखी है, उस पर मैंने एक टन प्रश्न पढ़े हैं और मैं यह इकट्ठा कर रहा हूं कि समस्या शायद यह है कि मुझे बेहतर / अलग startमूल्य ( initial parameter estimatesथोड़ा अधिक समझ में आता है) की आवश्यकता है, लेकिन मुझे यकीन नहीं है, दिया डेटा जो मेरे पास है, मैं बेहतर मापदंडों का आकलन कैसे करूंगा।


मैं सुझाव दूंगा कि त्रुटि संदेश के लिए हमारी साइट को खोजकर आपकी व्याख्या शुरू करें ।
whuber

3
वास्तव में, मैंने ऐसा किया और पूर्ण त्रुटि के लिए मेरी खोज ने तीन डेटा बिंदुओं के साथ एक आधा बेक किया हुआ प्रश्न और कोई उत्तर नहीं दिया। लेकिन आपकी अधिक विशिष्ट खोज के कुछ परिणाम मिलते हैं। संभवतः इसलिए कि आपको यहां अधिक अनुभव है और जानते हैं कि कौन से शब्द प्रासंगिक हैं।
अमांडा

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

1
आपके शुरुआती मूल्यों के लिए फिट डेटा से बहुत दूर है; तुलना करें exp(50)और exp(95)y- मानों पर x = 50 और x = 95 पर। यदि आप c=0y का लॉग सेट करते हैं और लेते हैं (एक रैखिक संबंध बनाते हैं), तो आप लॉग ( ) और लिए प्रारंभिक अनुमान प्राप्त करने के लिए प्रतिगमन का उपयोग कर सकते हैं जो आपके डेटा के लिए पर्याप्त होगा (या यदि आप मूल के माध्यम से एक पंक्ति फिट करते हैं, तो आप छोड़ सकते हैं 1 पर है और बस के लिए अनुमान का उपयोग ; वह भी अपने डेटा के लिए पर्याप्त होता है)। यदि उन दो मूल्यों के आसपास काफी संकीर्ण अंतराल के बाहर है, तो आप कुछ समस्याओं में भाग लेंगे। [वैकल्पिक रूप से एक अलग एल्गोरिथ्म आज़माएं]b a b b
Glen_b -Reinstate Monica

1
धन्यवाद @Glen_b मैं उम्मीद कर रहा था कि मैं एक रेखांकन कैलकुलेटर के बदले में आर का उपयोग कर सकता हूं एक आँकड़े इंट्रो पाठ्यपुस्तक के माध्यम से काम करने के लिए (और पाठ्यक्रम को खुद से हटा देना) इसलिए मैं केवल सबसे अच्छे सांख्यिकीय अंतर्दृष्टि के साथ शुरू कर रहा हूं, लेकिन आर में अन्य स्लाइसिंग और डाइलिंग करने का बहुत अनुभव है। ।
अमांडा

जवाबों:


38

नॉनलाइन मॉडल के लिए स्वचालित रूप से अच्छे शुरुआती मूल्य खोजना एक कला है। (यह एक-बंद डेटासेट के लिए अपेक्षाकृत आसान है जब आप डेटा को केवल प्लॉट कर सकते हैं और नेत्रहीन रूप से कुछ अच्छे अनुमान लगा सकते हैं।) एक दृष्टिकोण मॉडल को रैखिक बनाना और कम से कम वर्गों के अनुमानों का उपयोग करना है।

इस मामले में, मॉडल के पास रूप है

(Y)=exp(एक्स)+सी

अज्ञात मापदंडों के लिए । घातांक की उपस्थिति हमें लघुगणक का उपयोग करने के लिए प्रोत्साहित करती है - लेकिन के अतिरिक्त को ऐसा करना मुश्किल बनाता है। सूचना है, हालांकि, यह है कि अगर है सकारात्मक तो में सबसे छोटी उम्मीद मूल्य से कम होगी --और इसलिए थोड़ा कम छोटी से छोटी से हो सकता है मनाया का मूल्य । (यदि ऋणात्मक हो सकता है तो आपको मान पर भी विचार करना होगा जो के सबसे बड़े देखे गए मान से थोड़ा अधिक है ।)एक सी वाई वाई एक Y,,सीसीसीYYसीY

तो, आइए, प्रारंभिक अनुमान रूप में उपयोग करके ध्यान रखें, जैसे कि टिप्पणियों का आधा न्यूनतम । मॉडल को अब उस कंटीले योजक शब्द के बिना फिर से लिखा जा सकता हैc 0 y iसीसी0yमैं

(Y)-सी0exp(एक्स)

हम इसका लॉग ले सकते हैं:

लॉग((Y)-सी0)लॉग()+एक्स

यह मॉडल के लिए एक रैखिक सन्निकटन है। दोनों और कम से कम वर्गों के साथ अनुमान लगाया जा सकता है।बीलॉग()

यहाँ संशोधित कोड है:

c.0 <- min(q24$cost.per.car) * 0.5
model.0 <- lm(log(cost.per.car - c.0) ~ reductions, data=q24)
start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2], c=c.0)
model <- nls(cost.per.car ~ a * exp(b * reductions) + c, data = q24, start = start)

इसका आउटपुट (उदाहरण डेटा के लिए) है

Nonlinear regression model
  model: cost.per.car ~ a * exp(b * reductions) + c
   data: q24
        a         b         c 
 0.003289  0.126805 48.487386 
 residual sum-of-squares: 2243

Number of iterations to convergence: 38 
Achieved convergence tolerance: 1.374e-06

अभिसरण अच्छा लगता है। चलो इसे साजिश करते हैं:

plot(q24)
p <- coef(model)
curve(p["a"] * exp(p["b"] * x) + p["c"], lwd=2, col="Red", add=TRUE)

आकृति

यह अच्छी तरह से काम किया!

y<0


प्रारंभिक मूल्यों का अनुमान लगाने का एक अन्य तरीका यह समझने पर निर्भर करता है कि उनका क्या मतलब है, जो अनुभव, भौतिक सिद्धांत आदि पर आधारित हो सकता है एक विस्तारित उदाहरण (मामूली रूप से कठिन) nonlinear फिट जिसका प्रारंभिक मान इस तरह से निर्धारित किया जा सकता है, मेरे उत्तर में वर्णित है पर /stats//a/15769

स्कैटरप्लॉट का दृश्य विश्लेषण (प्रारंभिक पैरामीटर अनुमान निर्धारित करने के लिए) /stats//a/32832 पर वर्णित और सचित्र है ।

कुछ परिस्थितियों में, नॉनलाइनियर फिट का एक क्रम बनाया जाता है, जहां आप समाधान को धीरे-धीरे बदलने की उम्मीद कर सकते हैं। उस स्थिति में यह अगले समाधानों के लिए प्रारंभिक अनुमानों के रूप में पिछले समाधानों का उपयोग करने के लिए अक्सर सुविधाजनक (और तेज़) होता है । मुझे /stats//a/63169 पर इस तकनीक (टिप्पणी के बिना) का उपयोग करना याद है ।


2

यह लाइब्रेरी nls के साथ मेरी समस्या को हल करने में सक्षम थी singular gradient: http://www.r-bloggers.com/a-better-nls/ एक उदाहरण:

library(minpack.lm)
nlsLM(function, start=list(variable=2,variable2=12))

उस फंक्शन को nls.lmअब कहा जाता है।
मैट

-1

इसलिए ... मुझे लगता है कि मैं इसे एक घातीय फ़ंक्शन के रूप में गलत तरीके से पढ़ता हूं। मुझे बस जरूरत थीpoly()

model <- lm(cost.per.car ~ poly(reductions, 3), data=q24)
new.data <- data.frame(reductions = c(91,92,93,94))
predict(model, new.data)

plot(q24)
lines(q24$reductions, predict(model, list(reductions = q24$reductions)))

या, का उपयोग कर lattice:

xyplot(cost.per.car ~ reductions, data = q24,
       panel = function(x, y) {
         panel.xyplot(x, y)
         panel.lines(x, predict(model,list(reductions = x) ))
       }, 
       xlab = "Reductions", 
       ylab = "Cost per car")

2
यह आपके द्वारा पूछे गए प्रश्न का उत्तर नहीं देता है - यह इसे कुछ अलग करता है (और कम दिलचस्प, IMHO)।
व्हिबर

6
यद्यपि, यह डेटा का प्रतिनिधित्व करने के लिए एक फ़ंक्शन को फिट करने की समस्या को हल कर सकता है, आपके स्वीकृत उत्तर आपके प्रश्न की उम्मीद नहीं है। श्री @whuber ने आपको एक उत्कृष्ट स्पष्टीकरण प्रदान किया और स्वीकृत उत्तर के लायक है।
लूर्नकेनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.