आर के nls () का उपयोग करके बिंदु विश्लेषण बदलें


16

मैं एक "परिवर्तन बिंदु" विश्लेषण को लागू करने की कोशिश कर रहा हूं, या nls()आर में उपयोग करके एक मल्टीफ़ेज़ प्रतिगमन ।

यहां मैंने कुछ नकली डेटा बनाए हैं । डेटा फिट करने के लिए मैं जिस सूत्र का उपयोग करना चाहता हूं वह है:

y=β0+β1एक्स+β2अधिकतम(0,एक्स-δ)

ऐसा करने वाला माना जाता है कि एक निश्चित अवरोधन और ढलान ( β0 और β1 ) के साथ डेटा को एक निश्चित बिंदु तक फिट किया जाता है , फिर, एक निश्चित x मान ( δ ) के बाद, ढलान को \ Beta_2 द्वारा संवर्धित करेंβ2 । यही पूरी अधिकतम बात है। δ बिंदु से पहले , यह बराबर 0 होगा, और β2 हो जाएगा।

तो, यहाँ यह करने के लिए मेरा कार्य है:

changePoint <- function(x, b0, slope1, slope2, delta){ 
   b0 + (x*slope1) + (max(0, x-delta) * slope2)
}

और मैं मॉडल को इस तरह फिट करने की कोशिश करता हूं

nls(y ~ changePoint(x, b0, slope1, slope2, delta), 
    data = data, 
    start = c(b0 = 50, slope1 = 0, slope2 = 2, delta = 48))

मैंने उन शुरुआती मापदंडों को चुना, क्योंकि मुझे पता है कि वे शुरुआती पैरामीटर हैं, क्योंकि मैंने डेटा तैयार किया है।

हालाँकि, मुझे यह त्रुटि मिली:

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

क्या मैंने सिर्फ दुर्भाग्यपूर्ण डेटा बनाया है? मैंने पहले वास्तविक डेटा पर इसे फिट करने की कोशिश की, और वही त्रुटि हो रही थी, और मुझे लगा कि मेरे शुरुआती शुरुआती पैरामीटर बहुत अच्छे नहीं थे।

जवाबों:


12

(पहले मैं पर सोचा था कि यह सच है कि से उत्पन्न एक समस्या हो सकती है maxvectorized नहीं है, लेकिन यह है कि सच नहीं है यह। करता है यह changePoint, जिस कारण निम्नलिखित संशोधन के साथ काम करने के लिए एक दर्द हो जाता है:

changePoint <- function(x, b0, slope1, slope2, delta) { 
   b0 + (x*slope1) + (sapply(x-delta, function (t) max(0, t)) * slope2)
}

यह R- हेल्प मेलिंग लिस्ट पोस्ट एक तरीके का वर्णन करता है जिसमें यह त्रुटि हो सकती है: सूत्र के आरएएस को ओवररेटेड किया जाता है, जैसे कि अग्रानुक्रम में दो मापदंडों को बदलना डेटा को एक ही फिट देता है। मैं नहीं देख सकता कि आपके मॉडल के बारे में क्या सच है, लेकिन शायद यह है।

किसी भी मामले में, आप अपना स्वयं का उद्देश्य फ़ंक्शन लिख सकते हैं और इसे कम कर सकते हैं। निम्न फ़ंक्शन डेटा बिंदुओं (x, y) के लिए चुकता त्रुटि देता है और मापदंडों का एक निश्चित मूल्य (फ़ंक्शन का अजीब तर्क संरचना कैसे optimकाम करता है इसके लिए खाता है ):

sqerror <- function (par, x, y) {
  sum((y - changePoint(x, par[1], par[2], par[3], par[4]))^2)
}

फिर हम कहते हैं:

optim(par = c(50, 0, 2, 48), fn = sqerror, x = x, y = data)

और देखो:

$par
[1] 54.53436800 -0.09283594  2.07356459 48.00000006

ध्यान दें कि मेरे नकली डेटा ( x <- 40:60; data <- changePoint(x, 50, 0, 2, 48) + rnorm(21, 0, 0.5)) के लिए आपके द्वारा दिए गए प्रारंभिक पैरामीटर मानों के आधार पर बहुत सारे स्थानीय मैक्सिमा हैं। मुझे लगता है कि यदि आप इसे गंभीरता से लेना चाहते हैं तो आप ऑप्टिमाइज़र को यादृच्छिक प्रारंभिक मापदंडों के साथ कई बार कॉल करेंगे और परिणामों के वितरण की जांच करेंगे।


बिल वेंबल्स की यह पोस्ट इस तरह के विश्लेषण में शामिल मुद्दों को अच्छी तरह से समझाती है।
हारून

6
इसके बजाय (बोझिल) नीच कॉल को अपने पहले कोड स्निपेट में, आप हमेशा सिर्फ pmax का उपयोग कर सकते हैं ।
कार्डिनल

0

बस यह जोड़ना चाहता था कि आप कई अन्य पैकेजों के साथ ऐसा कर सकते हैं। यदि आप परिवर्तन बिंदु (कुछ nls नहीं कर सकते) के आसपास अनिश्चितता का अनुमान प्राप्त करना चाहते हैं, तो mcpपैकेज का प्रयास करें ।

# Simulate the data
df = data.frame(x = 1:100)
df$y = c(rnorm(20, 50, 5), rnorm(80, 50 + 1.5*(df$x[21:100] - 20), 5))

# Fit the model
model = list(
  y ~ 1,  # Intercept
  ~ 0 + x  # Joined slope
)
library(mcp)
fit = mcp(model, df)

चलो इसे एक भविष्यवाणी अंतराल (ग्रीन लाइन) के साथ प्लॉट करें। नीला घनत्व परिवर्तन बिंदु स्थान के लिए पीछे का वितरण है:

# Plot it
plot(fit, q_predict = T)

आप का उपयोग करके plot_pars(fit)और अधिक विस्तार से व्यक्तिगत मापदंडों का निरीक्षण कर सकते हैं और summary(fit)

यहाँ छवि विवरण दर्ज करें

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