7
votes

Comment trouver de bonnes valeurs de démarrage pour la fonction NLS?

Je ne comprends pas pourquoi je ne peux pas avoir une fonction NLS pour ces données. J'ai essayé avec beaucoup de valeurs de démarrage différentes et j'ai toujours la même erreur.

Voici ce que j'ai fait: xxx

J'ai toujours cette erreur: xxx


0 commentaires

3 Réponses :


9
votes

Le montage d'un modèle non linéaire à trois paramètres à quatre points de données sera modérément difficile dans tout cas, bien que dans ce cas, les données se comporteront bien. Point n ° 1 est que votre valeur de départ pour votre paramètre C (-5) était éteinte. Dessinez une image de la courbe correspondant à vos paramètres de départ (voir ci-dessous) vous aiderait à comprendre ceci (la reconnaissance de la courbe que vous obtenez va aller de C à son minimum sur c + a à son maximum, et la plage de vos données est de 0,6 à 1 ...)

Cependant, même avec un meilleur départ que je me suis retrouvé me retrouvé avec des paramètres de contrôle (c.-à-d. Control = NLS. Contrôle (Maxiter = 200) ), suivi de plus d'avertissements - NLS n'est pas connu pour sa robustesse. J'ai donc essayé le modèle ssasympoff , qui implémente une version auto-démarrage de la courbe que vous souhaitez adapter. xxx

mon conseil en général est que Il est plus facile de comprendre ce qui se passe et de résoudre les problèmes si vous correspondez à nls extérieur de geom_smooth et construisez la courbe que vous souhaitez ajouter en utilisant Prédiction.nls ...

Plus généralement, le moyen d'obtenir de bons paramètres de départ consiste à comprendre la géométrie de la fonction que vous adaptez et quels paramètres contrôlent quels aspects de la courbe. Comme je l'ai mentionné ci-dessus, c est la valeur minimale de la courbe décalée saturée-exponentielle, A est la plage et B est un paramètre d'échelle (Vous pouvez voir que lorsque x = b , la courbe est 1-exp (-1) ou environ 2/3 du chemin du minimum au maximum). Soit un peu d'algèbre et de calcul (c'est-à-dire des limites de prise) ou de jouer avec la fonction courbe () , sont de bonnes façons de rassembler ces informations.


1 commentaires

Merci pour votre réponse. Je ne connaissais pas la fonction Ssasympoff. Mais comment puis-je trouver la valeur d'A, B et C à ma fonction? Si je fais un getinitial (VEC_Y ~ SSASYMPOFFOFF (VEC_X, 0.5, 75, 0.5), DATA = DT), ce n'est pas les valeurs de mon équation.



2
votes

J'ai du mal à trouver une interprétation à vos paramètres: A est une pente, B la vitesse de convergence et A + C la limite, Mais c en soi ne semble pas signifier beaucoup. Après avoir répété votre fonction, le problème disparaît. XXX PRE>

Cependant, la valeur de C code> est très très élevée: C'est probablement pourquoi le modèle a initialement échoué à converger. p> xxx pré>

Voici une autre paramétrisation plus raisonnable de la même fonction. P>

g <- function (x, a,b,c) a * (1-exp(-(x-c)/abs(b)))
nls(y~g(x, a, b, c), data=dt, start=list(a=1, b=75, c=-5), trace=TRUE)

Nonlinear regression model
  model:  y ~ g(x, a, b, c) 
   data:  dt 
     a      b      c 
 1.006  3.351 63.257 
 residual sum-of-squares: 7.909e-05

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


5 commentaires

OK, mais à partir d'ici, je peux trouver une valeur de départ pour ma fonction, car si je fais comme ceci: NLS (Vec_Y ~ expfct2 (VEC_X, A, B, C), Démarrer = Liste (A = 1,006, B = 3.351, c = 63.257), Contrôle = NLSCONTROL (Maxiter = 200), j'ai cette erreur: Erreur dans NLSModel (formule, MF, Démarrer, WTS): matrice de gradient singulier aux estimations de paramètres initiales


Ma suggestion était de repasser votre fonction, d'abord séparer l'effet des différents paramètres, de seconde, plus important encore, afin de garantir que les valeurs optimales que nous recherchons ont le même ordre de grandeur (si l'un est de 100 000 000 fois plus grand que les autres, Vous devriez vous attendre à des problèmes). Après cette répétaisation, l'optimisation est sensible plus longtemps aux valeurs initiales.


Comment avez-vous obtenu cet A * (1-exp (- (X-C) / ABS (B))) à partir de celui-ci (1-exp (-X / B)) + C?


(Comme j'ai changé les paramètres, j'aurais dû les renommer: c'est vraiment déroutant. Utilisons des primes pour les nouveaux paramètres.) Si vous développez ces expressions, a '* (1-exp (- (x -c ') / abs (b')))) et a * (1-exp (-x / b)) + C , sont de la forme A + B * exp (c * x) .


Merci beaucoup, c'est beaucoup m'aide beaucoup



9
votes

Ceci peut être écrit avec deux paramètres linéaires ( .LIN1 et .LLIN2 ) et un paramètre non linéaire ( B ) comme ceci: < Pré> xxx

.LIN1 = A + C et .LLIN2 = -A (donc a = - .Lin2 et c = .lin1 + .lin2 ) cela nous permet d'utiliser "plinear" qui nécessite uniquement des spécifications d'une valeur de départ pour le seul paramètre non linéaire (éliminant le problème de la façon dont Pour définir les valeurs de démarrage des autres paramètres) et qui converge malgré la valeur de départ de B = 75 étant loin de celle de la solution: xxx

Voici le résultat d'une course à partir de laquelle nous pouvons voir de la taille de .lin2 que le problème est mal échelé: xxx

éditer: Ajout de l'échantillon de course et commenter sur la mise à l'échelle.


2 commentaires

Avec cela, je reçois b .lin1 .LIN1 3.351E + 00 1.006E + 00 -1.589E + 08 et lorsque je calculez A et C, j'ai: NLS (Vec_Y ~ expfct2 (Vec_x, A, B, C), START = Liste (A = 1.589E + 08, B = 75, C = -158899999), Contrôle = nlsttrol (Maxiter = 200)) J'ai cette erreur: erreur dans NLSModel (formule, MF, démarrage, WTS): gradient singulier matrice aux estimations initiales de paramètres. Je ne comprends pas pourquoi


Normalement, lors de l'optimisation non linéaire, vous souhaitez que les paramètres soient à peu près la même plage de magnitude. Ont ajouté un échantillon exécuté montrant le problème. Transformez vos paramètres afin que cela ne se produise pas. L'avantage de l'approche plinear est que c'est relativement clair comment transformer en linéarité et que nous voyons maintenant ce qu'il donne, nous savons que nous devons transformer nos paramètres plus loin et lesquels. Vincent a déjà montré comment faire cela.