2014-02-16 4 views
5

Ich möge y=a^(b^x) verwenden, um die unten angegebenen Daten zu passen,eine Kurve Ändern singuläre Gradientenmatrix bei Anfangsparameter zu verhindern schätzt

y <- c(1.0385, 1.0195, 1.0176, 1.0100, 1.0090, 1.0079, 1.0068, 1.0099, 1.0038) 
x <- c(3,4,5,6,7,8,9,10,11) 
data <- data.frame(x,y) 

Wenn ich das nicht-lineare Kleinste-Quadrate-Verfahren verwenden,

f <- function(x,a,b) {a^(b^x)} 
(m <- nls(y ~ f(x,a,b), data = data, start = c(a=1, b=0.5))) 

es erzeugt einen Fehler: singuläre Gradientenmatrix bei ersten Parameterschätzungen. Das Ergebnis ist grob a = 1,1466, b = 0,6415, also sollte es kein Problem mit Anfangsparameterschätzungen geben, da ich sie als a = 1, b = 0,5 definiert habe.

Ich habe in anderen Themen gelesen, dass es bequem ist, die Kurve zu ändern. Ich dachte über etwas wie log y=log a *(b^x) nach, aber ich weiß nicht, wie man mit der Funktionsspezifikation umgeht. Irgendeine Idee?

+0

Wenn ich: '(m <- nls (y ~ f (x, a, b), Daten = Daten, Start = c (a = 0.9, b = 0.6))) 'Ich erhalte keinen Fehler. Ich bekomme die gleiche Antwort, wenn ich folgendes benutze: '(m <- nls (y ~ f (x, a, b), Daten = Daten, Start = c (a = 1,2, b = 0,4)))' Ich weiß es nicht wenn das hilft. –

+0

Das ist interessant. Irgendein automatischer Weg, um herauszufinden, was Startwerte für a und b sein sollen? ___ Ich denke, ich kann das gute ol '' a^b^3 = 1.0385 'verwenden, dh' a^b = 1.0385^(1/3) = 1.01267', was gilt für "a = 1.01267" und "b = 1". Das funktioniert mit '(m <- nls (y ~ f (x, a, b), Daten = Daten, Start = c (a = 1.01267, b = 1.0))). Trotzdem würde ich es lieber automatisch haben ... – Vochmelka

Antwort

4

Ich werde meinen Kommentar in eine Antwort erweitern.

Wenn ich folgendes:

y <- c(1.0385, 1.0195, 1.0176, 1.0100, 1.0090, 1.0079, 1.0068, 1.0099, 1.0038) 
x <- c(3,4,5,6,7,8,9,10,11) 
data <- data.frame(x,y) 

f <- function(x,a,b) {a^b^x} 

(m <- nls(y ~ f(x,a,b), data = data, start = c(a=0.9, b=0.6))) 

oder

(m <- nls(y ~ f(x,a,b), data = data, start = c(a=1.2, b=0.4))) 

I erhalten:

Nonlinear regression model 
    model: y ~ f(x, a, b) 
    data: data 
    a  b 
1.0934 0.7242 
residual sum-of-squares: 0.0001006 

Number of iterations to convergence: 10 
Achieved convergence tolerance: 3.301e-06 

ich immer einen Fehler erhalten, wenn ich 1 als Ausgangswert verwenden für a , vielleicht, weil 1 auf etwas erhöht ist 1.

Wie zum automatischen Erzeugen von Startwerten, ich bin nicht vertraut mit einem Verfahren, das zu tun. Eine Methode, die ich gelesen habe, besteht darin, Kurven zu simulieren und Startwerte zu verwenden, die eine Kurve erzeugen, die sich Ihren Daten annähert.

Hier ist das Diagramm, das mit den obigen Parameterschätzungen unter Verwendung des folgenden Codes erstellt wurde. Ich gebe zu, dass vielleicht der untere rechte Teil der Linie passen könnte ein wenig besser:

setwd('c:/users/mmiller21/simple R programs/') 

jpeg(filename = "nlr.plot.jpeg") 

plot(x,y) 
curve(1.0934^(0.7242^x), from=0, to=11, add=TRUE) 

dev.off() 

enter image description here

Verwandte Themen