मेरे पास एक छोटा डेटा बेस (txt फ़ाइल) है।

मैं आर में एक घातीय प्रतिगमन प्राप्त करना चाहता हूं।

मैं जिन आदेशों का उपयोग कर रहा हूं वे हैं:

regression <- read.delim("C:/Users/david/OneDrive/Desktop/regression.txt")
View(regression)
source('~/.active-rstudio-document', echo=TRUE)
m <- nls(DelSqRho ~ (1-exp(-a*(d-b)**2)), data=regression, start=list(a=1, b=1))
y_est<-predict(m,regression$d)
plot(x,y)
lines(x,y_est)
summary(m)

लेकिन, जब मैं इसे चलाता हूं, तो मुझे एक त्रुटि मिलती है:

Error in nls(DelSqRho ~ (1 - exp(-a * (d - b)^2)), data = regression,  : 
  step factor 0.000488281 reduced below 'minFactor' of 0.000976562

और मुझे नहीं पता कि इसे कैसे हल किया जाए, घातीय प्रतिगमन कैसे प्राप्त किया जाए, कृपया, कोई संकेत दें?

0
Another.Chemist 2 फरवरी 2021, 02:00
1
... इस मामले में आप start_m = lm(log(1/(1-DelSqRho)) ~ poly(d, 2, raw=TRUE), regression) (यह आपका मॉडल समीकरण पुनर्व्यवस्थित है) फिट करके और a = coef(start_m)[3] और b = sqrt(coef(start_m)[1]/coef(start_m)[3]) प्राप्त करके पैरामीटर शुरू करने का विचार प्राप्त कर सकते हैं।
 – 
user20650
2 फरवरी 2021, 02:28
आपके उत्तरों के लिए धन्यवाद लेकिन मुझे वे ठीक से नहीं मिले, मैंने start_m = lm(log(1/(1-DelSqRho)) ~ poly(d, 2, raw=TRUE), regression);;;;;; y_est<-predict(start_m,regression$DelSqRho) की कोशिश की और मुझे Error in eval(predvars, data, env) : numeric 'envir' arg not of length one मिला
 – 
Another.Chemist
2 फरवरी 2021, 05:34

1 उत्तर

सबसे बढ़िया उत्तर

nls शुरुआती मापदंडों के मूल्यों के प्रति काफी संवेदनशील है और इसलिए आप उन मानों को चुनना चाहते हैं जो डेटा को उचित फिट देते हैं (minpack.lm::nlsLM थोड़ा अधिक क्षमाशील हो सकता है)।

आप वक्र को a=1 और b=1 के अपने शुरुआती मूल्यों पर प्लॉट कर सकते हैं और देख सकते हैं कि यह वक्र को कैप्चर करने का एक अच्छा काम नहीं करता है।

regression <- read.delim("regression.txt")
with(regression, plot(d, DelSqRho, ylim=c(-3, 1)))
xs <- seq(min(regression$d), max(regression$d), length=100)
a <- 1; b <- 1; ys <- 1 - exp(-a* (xs - b)**2)
lines(xs, ys)

enter image description here

प्रारंभिक मान प्राप्त करने का एक तरीका उद्देश्य फ़ंक्शन को पुनर्व्यवस्थित करना है। y = 1 - exp(-a*(x-b)**2) को log(1/(1-y)) = ab^2 - 2abx + ax^2 के रूप में पुनर्व्यवस्थित किया जा सकता है (यहां y एक से कम होना चाहिए)। तब रैखिक प्रतिगमन का उपयोग a और b का अनुमान प्राप्त करने के लिए किया जा सकता है।

start_m <- lm(log(1/(1-DelSqRho)) ~ poly(d, 2, raw=TRUE), regression)
unname(a <- coef(start_m)[3]) # as `a` is aligned with the quadratic term
# [1] -0.2345953 
unname(b <- sqrt(coef(start_m)[1]/coef(start_m)[3]))
# [1] 2.933345 

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

अब हम इन मापदंडों पर nls मॉडल का अनुमान लगाने का प्रयास कर सकते हैं:

m <- nls(DelSqRho ~ 1-exp(-a*(d-b)**2), data=regression, start=list(a=a, b=b))
coef(m)
#          a          b 
# -0.2379078  2.8868374 

और परिणाम प्लॉट करें:

# note that `newdata` must be a named list or data frame 
# in which to look for variables with which to predict.
y_est <- predict(m, newdata=data.frame(d=xs))
with(regression, plot(d, DelSqRho))
lines(xs, y_est, col="red", lwd=2)

enter image description here

फिट बहुत अच्छा नहीं है और शायद यह सुझाव है कि अधिक लचीले मॉडल की आवश्यकता है।

1
user20650 2 फरवरी 2021, 18:51
धन्यवाद, मैंने सभी की कोशिश की, लेकिन आदेशों का अंतिम ब्लॉक काम नहीं करता है, यह मुझे संकेत देता है Error in data.frame(d = xs) : object 'xs' not found
 – 
Another.Chemist
2 फरवरी 2021, 18:57
एक और।रसायनज्ञ; xs को पहले कोड ब्लॉक में परिभाषित किया गया है
 – 
user20650
2 फरवरी 2021, 19:26