Ich versuche, eine Linie + Exponentialkurve an einige Daten anzupassen. Zunächst habe ich versucht, dies mit künstlichen Daten zu tun. Die Funktion ist: Es ist effektiv eine Exponentialkurve mit einem linearen Abschnitt sowie einem zusätzlichen horizontalen Verschiebungsparameter ( m ). Wenn ich jedoch die Funktion von R verwende, erhalte ich den gefürchteten Fehler " singuläre Gradientenmatrix bei anfänglichen Parameterschätzungen ", auch wenn ich dieselben Parameter verwende, die ich ursprünglich zum Generieren der Daten verwendet habe. Ich habe die verschiedenen Algorithmen ausprobiert, verschiedene Startwerte und versucht zu verwenden
nls()
optim
die verbleibende Summe der Quadrate zu minimieren, alles ohne Erfolg. Ich habe gelesen, dass ein möglicher Grund dafür eine Überparametrisierung der Formel sein könnte, aber ich glaube nicht, dass dies der Fall ist. Hat jemand einen Vorschlag für dieses Problem? Oder ist das nur ein unangenehmes Modell?
Ein kurzes Beispiel:
#parameters used to generate the data
reala=-3
realb=5
realc=0.5
realr=0.7
realm=1
x=1:11 #x values - I have 11 timepoint data
#linear+exponential function
y=reala + realb*realr^(x-realm) + realc*x
#add a bit of noise to avoid zero-residual data
jitter_y = jitter(y,amount=0.2)
testdat=data.frame(x,jitter_y)
#try the regression with similar starting values to the the real parameters
linexp=nls(jitter_y~a+b*r^(x-m)+c*x, data=testdat, start=list(a=-3, b=5, c=0.5, r=0.7, m=1), trace=T)
Vielen Dank!
r
nonlinear-regression
nls
steiny
quelle
quelle
Antworten:
Das hat mich kürzlich gebissen. Meine Absichten waren die gleichen, mache ein künstliches Modell und teste es. Der Hauptgrund ist der von @whuber und @marco. Ein solches Modell wird nicht identifiziert. Denken Sie daran, dass NLS die Funktion minimiert, um dies zu sehen:
Angenommen, es wird durch den Parametersatz( a , b , m , r , c ) minimiert . Es ist unschwer zu erkennen , dass die die Gruppe von Parametern ( a , b r- m, 0 , r , c ) dem gleichen Wert der Funktion geben , minimiert werden. Daher wird das Modell nicht identifiziert, dh es gibt keine eindeutige Lösung.
Es ist auch nicht schwer zu erkennen, warum der Gradient singulär ist. Bezeichnen
Dann
und das bekommen wir für allex
Daher die Matrix
wird nicht von vollem Rang sein und aus diesem Grund
nls
wird die singuläre Gradienten-Nachricht geben.Ich habe über eine Woche damit verbracht, nach Fehlern in meinem Code zu suchen, bis ich bemerkte, dass der Hauptfehler im Modell war :)
quelle
Die obigen Antworten sind natürlich richtig. Was es wert ist, zusätzlich zu den gegebenen Erklärungen, wenn Sie dies an einem künstlichen Datensatz versuchen, gemäß der nls-Hilfeseite unter: http://stat.ethz.ch/R-manual/R-patched/ library / stats / html / nls.html
Rs nls werden nicht damit umgehen können. Auf der Hilfeseite heißt es speziell:
Also kein Rauschen == nicht gut für Rs nls.
quelle