Seite 1 von 1

Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Mo Feb 24, 2020 7:08 pm
von foena1988
Hallo liebes Forum,

Ich wollte eine relativ simple Aufgabe erledigen und komme leider einfach nicht weiter. Ich würde gerne eine Regression für einen Datensatz rechnen und zwar als negative Exponentialfunktion. Nachstehend mein bisheriger Code:

Code: Alles auswählen


rm(list = ls(all.names = TRUE))
data <- data.frame(cbind(c(2005.858,2006.323,2006.681,2006.855,2007.246,2007.852,2008.296,2008.658,2009.309,2009.598,2009.844,2010.329,2010.633,2010.880,2011.307),
              c(-0.1587725,-0.1872080,-0.0097310,-0.1334250,-0.1415130,-0.3153405,-0.4836975,-0.6108542,-0.3429872,-0.4400377,-0.3948924,-0.4516956,-0.5317573,-0.5295940,-0.6489158)))
              
              [img]
              
              [attachment=0]Rplot01.png[/attachment][/img]

names(data) = c("Datum","Messwert")

model = nls(Messwert ~ a * exp((b*Datum-c)), data = data, start=list(a=-0.5,b=0.005, c=11))
Bei jedem Durchlauf erhalte ich den Fehler:

Code: Alles auswählen

Error in nlsModel(formula, mf, start, wts) : 
  singuläre Gradientenmatrix bei der ersten Parameterschätzung
  
Mir ist schon klar, dass dieser Fehler mit er Wahl meiner Startwerte zusammenhängt. Allerdings finde ich keine Kombination an Startwerten, sodass mein Modell gerechnet werden würde.

Kann mir diesbezüglich vielleicht jemand helfen?

Vielen Dank,LG

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Mo Feb 24, 2020 7:34 pm
von jogo
Hallo foena,

willkommen im Forum!
e^(b*x+c) = e^b*x * e^c
... wenn Du jetzt noch einen zu schätzenden Koeffizienten a davorschreibst, dann muss die Systemmatrix singulär werden.
Du lässt ihr keine andere Wahl.

Gruß, Jörg

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Di Feb 25, 2020 7:22 am
von foena1988
Hallo und danke für deine rasche Antwort.

Hast natürlich vollkommen recht! Manchmal sieht man den Wald vor lauter Bäumen nicht mehr!

Habe den Code jetzt wie folgt angepasst:

Code: Alles auswählen

model = nls(BCI ~ a * exp((b*Messdatum)), data = BCI_temp, start=list(a=-0.5,b=0.009),trace=T)
Nun erhalte ich allerdings folgende Fehlermeldung:

Code: Alles auswählen

  Error in nls(BCI ~ a * exp((b * Messdatum)), data = BCI_temp, start = list(a = -0.5,  : 
  singulärer Gradient
Habe mir mit trace = T die Einzelschritte ausgeben lassen, werde allerdings leider nicht schlau daraus:

Code: Alles auswählen

1.889811e+16 :  -0.500  0.009
234656.3 :  1.756788e-06 9.000002e-03
27644.4 :  2.510391e-06 8.287171e-03
137.4769 :  1.053997e-05 6.192767e-03
2.460294 :   0.000713775 -0.027588682
Hätte vielleicht noch jemand einen Tipp für mich?

DANKE, LG

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Di Feb 25, 2020 8:16 am
von EDi
Wie kommst du denn auf die Startwerte?

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Di Feb 25, 2020 8:18 am
von foena1988
Genau daran scheitere ich! Ich habe mal versucht, di eWerte des ersten Punkten zu nehmen, funktioniert allerdings eben so wenig wie alle anderen Versuche bis jetzt!

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Di Feb 25, 2020 8:18 am
von EDi
Vielleicht hilfst auch das Datum anders zu kodieren, z. B. Tage/Minuten seit des ersten Messpunkts....

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Di Feb 25, 2020 8:20 am
von EDi
Dad kann man doch auch als lm (log) in erster Runde schätzen und die (rücktransformierten) Koeffizienten daraus dann als Startwert nehmen?

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Di Feb 25, 2020 8:36 am
von bigben
Hi!

Ich glaube ja, dass nls durch die hohen Datumswerte in den 2000ern gestört wird. Jedenfalls verhält es sich bei mir viel friedlicher, wenn ich das Datum vorher zentriere. Das hier gibt einen ganz guten Fit

Code: Alles auswählen

data <- data.frame(cbind(c(2005.858,2006.323,2006.681,2006.855,2007.246,2007.852,2008.296,2008.658,2009.309,2009.598,2009.844,2010.329,2010.633,2010.880,2011.307),
                         c(-0.1587725,-0.1872080,-0.0097310,-0.1334250,-0.1415130,-0.3153405,-0.4836975,-0.6108542,-0.3429872,-0.4400377,-0.3948924,-0.4516956,-0.5317573,-0.5295940,-0.6489158)))
names(data) = c("Datum","Messwert")
data$Datum.z <- data$Datum - mean(data$Datum)

model = nls(Messwert ~ a + exp(b*Datum.z), data = data, start=list(a=-0.5,b=0.009))
summary(model)


plot(Messwert ~ Datum.z, data = data)
curve(-1.37117+ exp(-0.09131*x), add = TRUE)
Und auch die oben gewünschte Regression

Code: Alles auswählen

model = nls(Messwert ~ a * exp((b*Datum.z)), data = data, start=list(a=-0.5,b=0.009))
läuft jetzt ohne Fehlermeldung durch.

LG,
Bernhard

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Di Feb 25, 2020 8:39 am
von Athomas
Ich würde gerne eine Regression für einen Datensatz rechnen und zwar als negative Exponentialfunktion.
Was ist das?

Re: Nichtlineare Regression durch negative Exponentialfunktion

Verfasst: Di Feb 25, 2020 9:13 am
von foena1988
Hallo Bernhard,

Vielen Dank für deinen Hinweis. Das war exakt das Problem.

Ich habe nun anstatt des Mittelwertes immer 2000 abgezogen, somit funktioniert es auch ziemlich gut.

Danke nochmals für alle Hilfestellungen!

LG