J'essaie de créer un script qui capture les résultats de l'ajustement d'un modèle non linéaire et les affiche dans un graphique. L'ensemble de données a été capturé en continu dans le temps auquel j'ai adapté un modèle non linéaire (voir photo ci-jointe). J'ai 12 échantillons différents pour lesquels j'ai le même graphique si vous voulez faire défiler vers le bas.
Cependant, je voudrais rapporter le graphique de manière à pouvoir voir les données capturées uniquement pour les lignes correspondant aux jours 0, 1, 2, 3, 4, 5, et ainsi de suite jusqu'à 21 jours sans interférer avec la courbe de le modèle par échantillon. Dans ce cas, je souhaite avoir les données expérimentales sous forme de données de nuage de points et le modèle sous forme de données de courbe continue ou de courbe lisse.
Comment puis-je faire cela?
Le générateur de graphiques ne semble pas tracer à la fois les données expérimentales et le modèle lors du premier défi.
Mon raisonnement était que je pourrais potentiellement utiliser une sorte de filtre de données que je pourrais appliquer chaque fois que j'appelle le script sans interférer avec la colonne modèle. Dois-je créer un nouveau tableau de données spécifique aux modèles avec les nouvelles estimations de paramètres pour chacun des 12 échantillons, puis appeler le générateur de graphiques ?
J'ai également essayé d'utiliser le tracé Graph/Legacy/overlay dans l'onglet du menu JMP. Cela semble tracer à la fois les courbes de données et de modèle, mais dans ce cas, j'ai réalisé que JMP n'avait pas appliqué les estimations de paramètres individuellement à chaque échantillon sur la colonne du modèle après avoir accepté et enregistré les estimations de paramètres pour chaque échantillon. Dans ce cas, la formule du modèle utilise uniquement les paramètres estimés pour l'échantillon qui apparaît en premier dans le tableau de données et les utilise pour les échantillons suivants.
Dois-je ensuite créer un nouveau tableau de données qui génère 12 colonnes avec la formule du modèle en utilisant les estimations des paramètres déterminés pour chaque échantillon afin de pouvoir tracer ensemble les données du modèle et les données expérimentales pour chaque échantillon ?
J'espère que c'est clair. Je peux télécharger une capture d'écran du tableau de données, etc.
J'essaie d'écrire un script qui ouvrirait une nouvelle colonne pour les nouvelles estimations de paramètres.
Après avoir exécuté l'ajustement non linéaire, j'obtiens les estimations et les erreurs. Je conserve ensuite uniquement les tableaux de données qui m'intéressent et j'essaie d'utiliser d'une manière ou d'une autre les valeurs qui m'intéressent dans une nouvelle colonne avec la même formule de modèle. L'idée serait de préciser les paramètres du modèle en fonction des estimations.
J'ai besoin d'aide car je ne sais pas si c'est la bonne façon de procéder ou si j'ai besoin d'utiliser d'autres fonctions. Le script ci-dessous est peut-être un peu compliqué à suivre mais c'est probablement parce que je n'ai quasiment aucune expérience en programmation. Le script fonctionne évidemment
@Mark_Bailey a écrit:
J'enseigne maintenant, donc je ne suis pas libre de vérifier, mais Nonlinear pourrait enregistrer la formule avec les différents ensembles de paramètres pour vous. La fonction Match() est utile ici. Vous faites correspondre un groupe et répliquez le modèle pour chaque résultat, mais appliquez les estimations de paramètres uniques pour chaque groupe. Cela devient une sorte de ramification. Comme une instruction CASE dans certaines langues.
jusqu'à la partie en GRAS :
col9 = Nouvelle Colonne("Modèle");
col9<< définir la formule (Paramètre ({Y1_Y1_0 = 0,2, K1_K1_0 = 0,01, P1_P1_0 = 0,004, Y2_Y2_0 = 0,15, K2_K2_0 = 0,06, P2_P2_0 = 0,3}, If(:Days>0, (Y1_Y1_0 * Exp(-Exp(( (K1_K1_0 * Exp()) / Y1_Y1_0) * (P1_P1_0 - :Jours))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp()) / Y2_Y2_0) * (P2_P2_0 - :Jours)))),0 )));
col10=nouvellecolonne("Err");
col10<< set Formula((:Moyenne - :Modèle) ^ 2);
col10< col10<
obj = Non linéaire (Y ( : Moyenne ), X ( : Modèle ), Perte ( :Err ), Limite d'itération ( 5 000 ), Par ( : Échantillon ));
obj << aller ;
// renvoie une liste de vecteurs où chaque vecteur contient les estimations des paramètres
obj << obtenir des estimations ;
//voir aussi Obtenir SSE, Obtenir les noms des paramètres, Obtenir CI
// Alternativement, créez un tableau
_xx = obj << Xpath("//OutlineBox[@helpKey='Solution non linéaire']");
//seulement 2 groupes donc seulement 2 sont trouvés ; chacun contient deux sous-tableaux
fit_dt = (_xx[1]< est_dt = (_xx[1]< fit_dt << set Name("Erreurs d'ajustement NonLin");
est_dt << set Name("Estimations d'ajustement NonLin");
Noms par défaut ici ( 1 );
DontClose = {"dt4", "Erreurs d'ajustement NonLin", "Estimations d'ajustement NonLin"} ; // Exemples de noms de tables que vous souhaitez quitter
// Boucle en arrière dans la liste pour que les numéros de table ne changent pas
Pour (i = N Table(), i >= 0, i--,
Si (Contient (DontClose, Data Table (i) << obtenir le nom),
Continuer(),
Fermer (Table de données (i), "Pas de sauvegarde")
)
);
dt = Tableau de données ("Estimations d'ajustement NonLin");
dt2<
myList=:Estimates<
dt0 = Tableau de données ("dt4");
dt0<< Nouvelle colonne ("Modèle ajusté par échantillon");
col11="Modèle ajusté par échantillon";
col11 << définir la formule (Paramètre ({Y1_Y1_0, K1_K1_0, P1_P1_0, Y2_Y2_0, K2_K2_0, P2_P2_0}, If(:Days>0, (Y1_Y1_0 * Exp(-Exp(((K1_K1_0 * Exp()) / Y1_Y1_0) * ( P1_P1_0 - :Jours))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp()) / Y2_Y2_0) * (P2_P2_0 - :Jours)))),0), Définir la propriété("Prédiction", {:Moyenne , Créateur("Non linéaire")}), Par (:Sample)));
Pour chaque ligne (col11= set formula (Match("Parameter", "Estimates")));
col11<
col11<
Aucune suggestion?
J'enseigne maintenant, donc je ne suis pas libre de vérifier, mais Nonlinear pourrait enregistrer la formule avec les différents ensembles de paramètres pour vous. La fonction Match() est utile ici. Vous faites correspondre un groupe et répliquez le modèle pour chaque résultat, mais appliquez les estimations de paramètres uniques pour chaque groupe. Cela devient une sorte de ramification. Comme une instruction CASE dans certaines langues.
Non, au lieu d'utiliser un format large (réponses enregistrées dans une douzaine de colonnes de données), utilisez le format haut (réponses enregistrées dans une colonne et utilisez une deuxième colonne pour identifier l'échantillon). Utilisez maintenant l'ID d'échantillon dans le rôle Par de la plupart des plateformes ou le rôle Groupe dans la plateforme Non linéaire ou Courbe de tracé.
Une solution potentielle :
- Enregistrez le modèle dans une colonne de formule. Cela devrait être évalué pour vous donner une copie de la valeur du modèle à n'importe quel jour de votre exécution.
- Générateur de graphiques ouvert.
- Déposez les résultats expérimentaux et la prédiction du modèle sur l'axe Y, les jours sur l'axe X.
- À l’aide du panneau de commande, déposez les points de données et la ligne connectée.
- À l'aide du menu déroulant « Variables », configurez les points de données pour qu'ils fonctionnent uniquement à partir des résultats expérimentaux et la ligne connectée pour qu'elle fonctionne uniquement à partir de la prédiction du modèle.
J'espère que cela pourra aider!