Ich habe einige grundlegende Daten zur Emissionsreduzierung und zu den Kosten pro Auto:
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 = "")
Ich weiß, dass dies eine Exponentialfunktion ist, daher erwarte ich, ein Modell finden zu können, das zu Folgendem passt:
model <- nls(cost.per.car ~ a * exp(b * reductions) + c,
data = q24,
start = list(a=1, b=1, c=0))
aber ich erhalte eine Fehlermeldung:
Error in nlsModel(formula, mf, start, wts) :
singular gradient matrix at initial parameter estimates
Ich habe eine Menge Fragen zu dem Fehler durchgelesen, den ich sehe, und ich stelle fest , dass das Problem wahrscheinlich darin besteht, dass ich bessere / andere start
Werte brauche (das initial parameter estimates
macht ein bisschen mehr Sinn), aber ich bin mir angesichts der Tatsache nicht sicher, ob das so ist Daten, die ich habe, wie ich vorgehen würde, um bessere Parameter abzuschätzen.
r
self-study
exponential
starting-values
Amanda
quelle
quelle
exp(50)
undexp(95)
mit den y-Werten bei x = 50 und x = 95. Wenn Siec=0
y setzen und protokollieren (eine lineare Beziehung erstellen ), können Sie mithilfe der Regression anfängliche Schätzungen für log ( ) und b abrufen, die für Ihre Daten ausreichen (oder wenn Sie eine Linie durch den Ursprung ziehen, können Sie diese verlassen a bei 1 und verwende einfach die Schätzung für b ; das reicht auch für deine Daten). Wenn b außerhalb eines relativ engen Intervalls um diese beiden Werte liegt, treten einige Probleme auf. [Alternativ versuchen Sie es mit einem anderen Algorithmus]Antworten:
Gute Startwerte für ein nichtlineares Modell automatisch zu finden, ist eine Kunst. (Für einmalige Datasets ist es relativ einfach, wenn Sie die Daten einfach grafisch darstellen und einige gute Schätzungen vornehmen können.) Ein Ansatz besteht darin, das Modell zu linearisieren und Schätzungen der kleinsten Quadrate zu verwenden.
In diesem Fall hat das Modell die Form
für unbekannte Parameter . Das Vorhandensein des Exponentials ermutigt uns, Logarithmen zu verwenden - aber das Hinzufügen von c macht es schwierig, dies zu tun. Beachten Sie jedoch, dass wenn a positiv ist, c kleiner als der kleinste erwartete Wert von Y ist und daher möglicherweise etwas kleiner als der kleinste beobachtete Wert von Y ist . (Wenn a negativ sein könnte, müssen Sie auch einen Wert von c berücksichtigen, der etwas größer als der größte beobachtete Wert von Y ist .)a , b , c c ein c Y. Y. ein c Y.
Kümmern wir uns also um indem wir als Anfangsschätzung c 0 etwa die Hälfte des Minimums der Beobachtungen y i verwenden . Das Modell kann jetzt ohne diesen heiklen Zusatzbegriff als umgeschrieben werdenc c0 yich
Dass wir das Protokoll nehmen können von:
Hier ist der überarbeitete Code:
Seine Ausgabe (für die Beispieldaten) ist
Die Konvergenz sieht gut aus. Lass es uns plotten:
Es hat gut funktioniert!
Eine andere Methode zur Schätzung von Anfangswerten beruht auf dem Verständnis ihrer Bedeutung, die auf Erfahrung, physikalischer Theorie usw. beruhen kann . Ein erweitertes Beispiel für eine (mäßig schwierige) nichtlineare Anpassung, deren Anfangswerte auf diese Weise bestimmt werden können, ist in meiner Antwort beschrieben unter /stats//a/15769 .
Die visuelle Analyse eines Streudiagramms (zur Bestimmung der anfänglichen Parameterschätzungen) wird unter /stats//a/32832 beschrieben und veranschaulicht .
Unter bestimmten Umständen wird eine Folge nichtlinearer Anpassungen erstellt, bei denen Sie erwarten können, dass sich die Lösungen langsam ändern. In diesem Fall ist es oft bequem (und schnell), die vorherigen Lösungen als erste Schätzungen für die nächsten zu verwenden . Ich erinnere mich, diese Technik (ohne Kommentar) unter /stats//a/63169 verwendet zu haben .
quelle
Diese Bibliothek konnte mein Problem mit nls lösen
singular gradient
: http://www.r-bloggers.com/a-better-nls/ Ein Beispiel:quelle
nls.lm
.Also ... ich glaube, ich habe dies als Exponentialfunktion falsch gelesen. Ich brauchte nur
poly()
Oder mit
lattice
:quelle