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 à deux étapes définies pour laquelle 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 ces valeurs de paramètres en fonction du 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 faire cela. 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>
Comme 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 le modèle à travers 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 étant la méthode des moindres carrés, JMP met automatiquement au carré la différence entre la réponse observée et la réponse prévue.
Je pense que vos estimations de paramètres seront élevées, il sera donc difficile de converger. Encore une fois, je résoudrais le problème en utilisant non linéaire de manière interactive avant d'essayer de l'automatiser avec un script.
Vous pouvez 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 utiliser alors pour spécifier la fonction de perte ?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'obtienne pas des résultats similaires ou qu'il n'atteigne 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 Non-linéaire 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 le script 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ètresTout d'abord, l'option Terminer ne signifie pas aller pour toujours. Cela revient à cliquer sur le bouton Go au lieu du bouton Step dans l'interface utilisateur. Il va jusqu'à ce qu'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 pour 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 une indication 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 de commencer malheureusement. J'utilise JMP14. Merci pour les commentaires.
J'ai modifié votre script comme vous l'avez suggéré (ci-dessous) et l'ai exécuté. Il me donne les estimations mais il n'exécute pas les itérations jusqu'à "infini" 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 sortie n'est pas excellent et les estimations des paramètres sont trop élevées ou négatives, ce qui signifie que je pourrais avoir besoin de 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ètresEn ce qui concerne la modélisation non linéaire, je ne suis habitué qu'à fixer un critère de convergence, 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 d'estimations de départ multiples, puis comparais les résultats résiduels. Je ne peux donc pas répondre à 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 "by", pour votre exemple ce serait votre colonne :Sample
- Attribue un descripteur/référence au rapport, obj. Ici, vous utiliseriez votre script pour changer Où( :Sample == "M301" ) pour 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 cliquez avec le bouton droit et sélectionnez Créer une table de données combinées, alors ce JSL fait la même chose.Xpath est une méthode générale pour trouver des boîtes d'affichage. Find est moins flexible, mais syntaxiquement plus facile à lire. L'instruction Xpath ci-dessous renvoie une poignée/référence à chaque zone de contour dans le rapport obj qui est une solution. Chaque boîte de contour de solution a 2 boîtes de table, je sais que je regarde la structure.Tout ce dont j'ai besoin est la première occurrence de ces boîtes de table pour envoyer le message pour créer une table de données combinées.
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>