2016-07-05 24 views
0

vorherige Antworten auf ähnliche Fragen haben mir nicht geholfen, mein Problem zu lösen.Fehler beim Anpassen eines Modells in nls

Ich versuche, ein Modell y=a1*(1-exp(-a21*Age_WH40))^a3 zu passen, wo a21=ln(1/a3)/a2 und Age_WH40 geht von 1 bis 40. Ich habe die Daten und eine Linie eine Vorstellung von der Start zu bekommen Werte

plot(MOE_WH40 ~ Age_WH40) 
lines(ts(8*(1-exp(log(1/3)/5*(1:40)))^3),col="red", lwd=2) 

enter image description here

fit.nlm_MOE4A.WH <- nls(MOE_WH40 ~ a*(1-exp(log(1/c)/b*Age_WH40))^b, start=list(a=10, b=6, c=2)) 

aber auch wenn ich die Daten beschränken Dispersion zu vermeiden, erhalte ich nur

Fehler in numericDeriv (Form [[3L]], Namen (ind), env): Fehlender Wert oder erzeugen unendlich, wenn das Modell

ich es ein Problem mit den Startwerten nicht denke Auswertung , und ich habe das Modell von 1 bis 40 in Excel ohne Problem ausgeführt. Irgendeine Idee was passiert? Hier gibt es eine Teilmenge der Daten:

structure(list(ID = c(245L, 246L, 247L, 248L, 249L, 250L, 251L, 
252L, 253L, 254L, 255L, 256L, 257L, 258L, 259L, 260L, 261L, 262L, 
263L, 264L, 265L, 266L, 267L, 268L, 269L, 270L, 508L, 509L, 510L, 
511L), MOE_WH40 = c(7.9, 7.12, 4.369, 5.44, 8.97, 9.58, 8.07, 
7.9, 6.93, 5.63, 6, 6.17, 8.51, 8.79, 7.21, 6.64, 6.7, 7.88, 
7.97, 6.93, 5.64, 6.86, 9.36, 9.44, 10.04, 9.58, 4.337, 5.12, 
6.7, 7.86), Age_WH40 = c(23L, 29L, 4L, 8L, 13L, 20L, 24L, 29L, 
33L, 2L, 7L, 9L, 15L, 20L, 23L, 27L, 12L, 13L, 20L, 23L, 3L, 
9L, 16L, 22L, 26L, 30L, 2L, 8L, 11L, 15L)), .Names = c("ID", 
"MOE_WH40", "Age_WH40"), class = "data.frame", row.names = c(NA, 
-30L)) 

Dank

+1

Bitte geben Sie ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) an, damit wir Ihnen leichter helfen können. –

+0

Danke @Zheyuan Li, ich hatte Mühe, die Daten auf eine nette Art und Weise zu setzen – David

Antwort

0

Sie könnten versuchen, das minpack.lm Paket mit dem dem Levenberg-Marquardt-Algorithmus verwendet. Ich habe deine Daten kurz als "Demo" bezeichnet.

nlsLM(data = demo, formula = MOE_WH40 ~ a*(1-exp(log(1/c)/b*Age_WH40))^b, start=list(a=10, b=6, c=2)) 
Nonlinear regression model 
model: MOE_WH40 ~ a * (1 - exp(log(1/c)/b * Age_WH40))^b 
data: demo 
a  b  c 
8.5573 0.3774 1.0347 
residual sum-of-squares: 32.89 

Number of iterations to convergence: 24 
Achieved convergence tolerance: 1.49e-08 
Warning messages: 
1: In log(1/c) : NaNs produced 
2: In log(1/c) : NaNs produced 
3: In log(1/c) : NaNs produced 

In nls sind es immer die Startwerte.

+0

Danke @biomiha. Es hat dieses Problem gelöst. Wenn ich jedoch versuche, das Modell unter Verwendung der berechneten Koeffizienten anzupassen, um den Log-Ausdruck wie "Modell <- nls (MOE_WH40 ~ a * (1-exp (-b * Alter_WH40))^c zu vermeiden, start = list (a = 8, b = 0.03, c = 0.3)) "Ich bekomme immer noch den gleichen Fehler ... irgendwelche Gedanken? – David

+0

In der Regel liegt dies an einem oder mehreren Koeffizienten, die nicht konvergieren. Wenn Sie Ihre Daten betrachten, gibt es eine beträchtliche Variabilität in Ihren Datenpunkten, d. H. Sie könnten mehrere verschiedene Kurven an die Daten anpassen. Können Sie ein einfacheres Modell ausprobieren? – biomiha

+0

Ja @biomiha. Ich habe verschiedene Kurven angepasst. Das gezeigte war nur noch eins. Es macht Sinn, es einfach zu halten, danke. – David