2015-10-20 11 views
9

मैं आर में कुछ डेटा के लिए नकारात्मक घातीय फिट करने की कोशिश कर रहा हूं, लेकिन फिट लाइन डेटा की तुलना में बहुत अधिक दिखती है, जबकि एक्सेल के अंतर्निर्मित पावर फिट दिखने के लिए उपयुक्त फिट अधिक विश्वासयोग्य क्या कोई मुझे बताएगा क्यों? मैंने nls() फ़ंक्शन और optim() का उपयोग करने का प्रयास किया है और उन दोनों तरीकों से समान पैरामीटर प्राप्त किए हैं, लेकिन दोनों के लिए फिट बैठता है।नकारात्मक घातीय फिट: वक्र बहुत अधिक दिखता है

x <- c(5.96, 12.86, 8.40, 2.03, 12.84, 21.44, 21.45, 19.97, 8.92, 25.00, 19.90, 20.00, 20.70, 16.68, 14.90, 26.00, 22.00, 22.00, 10.00, 5.70, 5.40, 3.20, 7.60, 0.59, 0.14, 0.85, 9.20, 0.79, 1.40, 2.68, 1.91) 
    y <- c(5.35, 2.38, 1.77, 1.87, 1.47, 3.27, 2.01, 0.52, 2.72, 0.85, 1.60, 1.37, 1.48, 0.39, 2.39, 1.83, 0.71, 1.24, 3.14, 2.16, 2.22, 11.50, 8.32, 38.98, 16.78, 32.66, 3.89, 1.89, 8.71, 9.74, 23.14) 

    xy.frame <- data.frame(x,y) 

    nl.fit <- nls(formula=(y ~ a * x^b), data=xy.frame, start = c(a=10, b=-0.7)) 

    a.est <- coef(nl.fit)[1] 
    b.est <- coef(nl.fit)[2] 

    plot(x=xy.frame$x,y=xy.frame$y) 

    # curve looks too high 
    curve(a.est * x^b.est , add=T) 
    # these parameters from Excel seem to fit better 
    curve(10.495 * x^-0.655, add=T) 

enter image description here

# alternatively use optim() 
    theta.init <- c(1000,-0.5, 50) 

    exp.nll <- function(theta, data){ 
     a <- theta[1] 
     b <- theta[2] 
     sigma <- theta[3] 
     obs.y <- data$y 
     x <- data$x 
     pred.y <- a*x^b 
     nll <- -sum(dnorm(x=obs.y, mean=pred.y , sd=sigma, log=T)) 
     nll 
    } 

    fit.optim <- optim(par=theta.init,fn=exp.nll,method="BFGS",data=xy.frame) 

    plot(x=xy.frame$x,y=xy.frame$y) 

    # still looks too high 
    curve(a.est * x^b.est, add=T) 

enter image description here

उत्तर

10

कारण आप अनपेक्षित व्यवहार देख रहे हैं कि घटता है कि देखने के लिए "बहुत अधिक" वास्तव में घटता से चुकता त्रुटियों की बहुत कम रकम है एक्सेल से:

# Fit from nls 
sum((y - a.est*x^b.est)^2) 
# [1] 1588.313 

# Fit from excel 
sum((y - 10.495*x^ -0.655)^2) 
# [1] 1981.561 

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

mod <- lm(log(y)~log(x)) 
(a.est2 <- exp(coef(mod)["(Intercept)"])) 
# (Intercept) 
# 10.45614 
(b.est2 <- coef(mod)["log(x)"]) 
#  log(x) 
# -0.6529741 

ये हैं काफी एक्सेल से गुणांकों के करीब है, और (योग के- पर खराब प्रदर्शन के बावजूद एक अधिक आकर्षक फिट उपज चुकता-त्रुटियों मैट्रिक):

enter image description here

बस curiousity से बाहर
+0

, अगर एक्सेल SSE को कम से कम करने की कोशिश कर नहीं है, क्या कसौटी यह उपयोग कर रहा है? – eipi10

+0

@ eipi10 हालांकि मैं सकारात्मक नहीं हूं, [ऐसा लगता है] (http://www.real-statistics.com/regression/power-regression/) यह लॉग-लॉग रूपांतरण का भी उपयोग कर रहा है। इसलिए, यह 'y' की भविष्यवाणी करते समय एसएसई को कम करने के बजाय 'लॉग (वाई)' की भविष्यवाणी करते समय एसएसई को कम कर रहा है। – josliber

संबंधित मुद्दे