Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresJ'ai un modèle non linéaire pour lequel j'ai créé une nouvelle colonne avec la formule ci-dessous. Le modèle est décrit comme étant similaire à une courbe sigmoïdale avec deux étapes définies pour lesquelles j'ai trois paramètres caractérisant chaque étape. Une première étape décrite par les paramètres K1, Y1 et P1 et une deuxième étape décrite par les paramètres K2, Y2 et P2. De plus, pour chaque paramètre, j'ai créé une nouvelle colonne et attribué une valeur initiale de 0,1 pour faciliter l'ajustement (pas dans le script ci-dessous). Cependant, les valeurs peuvent varier considérablement entre les échantillons, de 0 à 1.
J'ai une liste d'échantillons pour lesquels je dois ajuster le même modèle et récupérer les valeurs de ces paramètres selon le meilleur ajustement. Le meilleur ajustement que je voudrais mesurer en fonction du RMSE minimum ou du R2 maximum. Cependant, je n'ai aucune idée de comment procéder. J'ai créé une colonne pour la fonction de perte que je calcule comme SSQ entre les données expérimentales (:Production) et le modèle (:Model) en espérant que cela aiderait lors de l'ajustement du modèle.
col7 = New Column("Model");
col7<< set formula (Parameter({Y1_Y1_0 = 0.001, K1_K1_0 = 0.001, P1_P1_0 = 0.001, Y2_Y2_0 = 0.001, K2_K2_0 = 0.001, P2_P2_0 = 0.001},
Y1_Y1_0 * Exp(-Exp(((K1_K1_0 * Exp()) / Y1_Y1_0) * (P1_P1_0 - :Days))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp()) / Y2_Y2_0) * (P2_P2_0 - :Days)))));
col8=newcolumn("Error");
col8<< set Formula(SSQ(:Production - :Model));
col8<<EVALFORMULA></EVALFORMULA>
À titre d'exemple du script résultant lors de l'ajustement du modèle à un échantillon
Nonlinear(
Y( :Methane Yield ),
X( :Model ),
Loss( :Err ),
Iteration Limit( 1000 ),
Numeric Derivatives Only( 1 ),
Unthreaded( 1 ),
Loss is Neg LogLikelihood( 1 ),
Newton,
Finish,
Where( :Sample == "M301" )
);
J'essaie d'automatiser ces analyses car pour l'instant j'utilise Excel Solver.
Quelqu'un pourrait-il fournir des commentaires sur la façon d'exécuter automatiquement l'ajustement du modèle sur tous les échantillons de la table de données et de récupérer les paramètres lorsque RSME est minimum (si j'ai raison lorsque la fonction de perte est minimale) ou lorsque R2 est maximum ?
Les valeurs des paramètres dans chaque colonne seraient-elles mises à jour automatiquement ?
Merci
Ivo
Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresMerci.Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresLa fonction de perte par défaut est celle des moindres carrés, de sorte que JMP calcule automatiquement la différence entre la réponse observée et la réponse prédite.
Je pense que vos estimations de paramètres seront élevées et qu'il sera donc difficile de converger. Encore une fois, je résoudrais le problème en utilisant Nonlinear de manière interactive avant d'essayer de l'automatiser avec un script.
Vous souhaiterez peut-être contacter le support technique JMP à propos de ce problème. (support@jmp.com)
Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresoui, c'est le modèle que j'utilise. quelle fonction dois-je alors utiliser pour spécifier la fonction Loss ?Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresEst-ce le modèle que vous essayez d'adapter :

La fonction de perte ne doit pas utiliser la fonction SSQ(). La plate-forme non linéaire combinera automatiquement la perte dans chaque ligne.
Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresLes valeurs de départ ont été utilisées sur la base des résultats obtenus sur Excel Solver pour les mêmes données.
Il est un peu surprenant que JMP n'arrive pas à des résultats similaires ou qu'il n'obtienne pas une bonne convergence. De plus, JMP a du mal à exécuter les itérations à l'aide de la fonction Loss et finit par planter. Lorsqu'il est exécuté sans fonction de perte, il n'obtient aucune convergence.
Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresUn autre commentaire : je recommande de travailler avec Nonlinear de manière interactive jusqu'à ce que vous déterminiez la meilleure configuration. Cela ira probablement plus vite et plus facilement de cette façon que d'essayer de faire fonctionner les scripts en même temps. Vous pouvez ensuite enregistrer le script pour poursuivre le développement.
Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresPremièrement, l’option Terminer ne signifie pas aller éternellement. Cela revient à cliquer sur le bouton Aller au lieu du bouton Étape dans l'interface utilisateur. Cela se poursuit jusqu'à ce que l'une des règles d'arrêt (critère) soit atteinte. La limite par défaut du nombre d'itérations est de 60. Vous pouvez exécuter à nouveau pour que Nonlinear travaille plus dur afin d'obtenir une bonne solution. Vous pouvez également modifier (assouplir ou renforcer) les autres critères si nécessaire.
Deuxièmement, la lente convergence pourrait être le signe de mauvais choix pour les valeurs de départ. Comment avez-vous déterminé ces valeurs pour vos données ?
Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresMon expérience sur JSL est minime. Je viens juste de commencer malheureusement. J'utilise JMP14. Merci pour les commentaires.
J'ai modifié votre script comme vous l'avez suggéré (ci-dessous) et je l'ai exécuté. Il me donne les estimations mais il n'exécute pas les itérations jusqu'à "infinies" comme je pense que la commande :Finish le demanderait. Est-ce exact? Cela ne dure que jusqu'à 60 ans. Par conséquent, l'ajustement de la sortie n'est pas excellent et les estimations des paramètres sont trop élevées ou négatives, ce qui signifie que je devrai peut-être définir des contraintes de paramètres.
obj = Nonlinear(Y( :Methane Yield ), X( :Model ), Loss( :Err ), Finish(), By( :Sample ));
obj << go;
obj << get estimates;
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
fit_dt = (_xx[1]<<FIND></FIND>Re : Comment ajuster un modèle non linéaire personnalisé à l'aide de plusieurs paramètresConcernant la modélisation non linéaire, je ne connais que la définition d'un critère de convergence, d'un objectif.Il y a de nombreuses années, lorsque la puissance de calcul était faible par rapport à aujourd'hui, j'utilisais généralement SAS pour créer une boucle de plusieurs estimations de départ, puis je comparais les résultats résiduels. Je ne peux donc pas vous aider avec votre demande de « meilleur modèle ».
Vous n'avez pas mentionné la version de JMP que vous utilisez, ni vos connaissances en matière de scripts. Pour comprendre ce script, vous devez connaître une syntaxe de base. Vous trouverez ci-dessous une modification du script à partir de JMP Scripting Index>Objects>Nonlinear>CopyByGroupScript.
Il :
- crée une colonne "par", pour votre exemple, ce serait votre colonne :Sample
- Attribue un handle/référence au rapport, obj. Ici, vous utiliseriez votre script pour changer Où( :Exemple == "M301" ) à Par(:Échantillon)
- montre comment créer une liste de résultats avec des instructions « get ». Voir JMP Scripting Index>Objets>Non linéaire pour les messages disponibles.
- Alternativement, vous pouvez créer des tableaux de résultats.Les rapports JMP (obj) sont une liste imbriquée de zones d'affichage. Par exemple, à partir de l'interface graphique, si vous avez une certaine zone de table pour un par groupe et que vous cliquez avec le bouton droit et sélectionnez Créer une table de données combinées, alors ce JSL fait de même.XPath est une méthode générale pour rechercher des boîtes d'affichage. Find est moins flexible, mais syntaxiquement plus facile à lire. L'instruction XPath ci-dessous renvoie un handle/référence à chaque zone de plan du rapport obj qui est une solution. Chaque zone de plan de solution comporte 2 zones de tableau, je sais que je regarde la structure.Tout ce dont j'ai besoin, c'est de la première occurrence de ces zones de tableau pour envoyer le message permettant de créer un tableau de données combiné.
Cela devrait vous donner un point de départ.Exécutez d'abord le script ci-dessous pour vous assurer qu'il s'exécute sur votre version de JMP, puis modifiez-le. Voici une image d'un tableau d'estimations pour cet exemple de script.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Nonlinear Examples/US Population.jmp" );
dt << New Column( "_bycol",
Character,
Nominal,
set values( Repeat( {"A", "B"}, N Rows( dt ) )[1 :: N Rows( dt )] )
);
obj = Nonlinear( Y( :pop ), X( :Name( "X-formula" ) ), Finish(), By( _bycol )) ;
obj << go;
//returns a list of vectors where each vector, contains the parameters estimates
obj << get estimates;
//also see Get SSE, Get Parameter Names, Get CI
//Alternately, make a table
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
//only 2 groups so only 2 are found; each contains two sub tables
fit_dt = (_xx[1]<<FIND></FIND>