Salut à tous,
J'essaie d'automatiser une routine de régression non linéaire, ce qui implique notamment la création d'un modèle personnalisé via des formules de colonne.
Je veux avoir un nombre arbitraire de paramètres, et je pense avoir résolu ce problème en vidant une liste correctement formatée dans la section Parameter ({}) ("Parm_Start"). Un problème que je rencontre est que je ne sais pas comment définir le terme arbitrairement dans Match (). J'ai essayé de faire cela avec Match_List {}, qui correspond au format, mais il donne des résultats impairs.
Deuxièmement, j'essaie de résumer une série d'exponentielles avec des termes pré-exponentiels «o» et «o» sous la forme A [o] * exp (-t / t [o]) - voir le code ci-dessous. Les A sont tous des paramètres adaptables, extraits d'une colonne Mod_Parm; Time est une colonne de longueur arbitraire et la variable indépendante. et Timeconst est une colonne de la même longueur que Mod_Parm (les deux étant plus courtes que Time).
Je ne suis pas arrivé à la partie où la routine de modélisation non linéaire basée sur JSL est appelée parce qu'il faut résoudre ce problème en premier.
Merci!
Mod_Parm_list={};
Parm_start={};
Parm_list={};
Match_list={};
b=1;
for(m=1,m<=num_exp,m++,
Mod_Parm_list[m]="A"||char(m);
Parm_start[m]=parse("Parm_"||Mod_Parm_list[m]||" = -0.1");
Parm_list[m]="Parm_"||Mod_Parm_list[m];
Match_list[b]=Mod_Parm_list[m];
Match_list[b+1]=parse(Parm_list[m]);
b=b+2;
);
dt << NewColumn("I_model",Format ("Scientific"),Set Property( "Expand Formula", 1 ),
Formula
(Parameter(
{Parm_start},
I_DC - Summation(o=1,num_exp,
Match(:Mod_Parm,
"A1", Parm_A1,
"A2", Parm_A2,
"A3", Parm_A3,
"A4", Parm_A4,
"A5", Parm_A5,
"A6", Parm_A6
)*Exp(-:Time/:TimeConst[o])
)
)
)
);
Pour la postérité, je voulais ajouter qu'une partie de la solution peut être trouvée ici:
https://community.jmp.com/t5/Discussions/How-to-pass-a-variable-into-a-formula/td-p/52344
C'est-à-dire qu'une partie de mon problème ne définissait pas "I_DC" comme une variable de table et supposait que la formule de colonne comprendrait l'expression. Voici la mise à jour pour cette partie:
I_DC = 3; //Using only this value in the column formula is wrong
dt = Current Data Table();
dt << set Table Variable( "I_DC_form", I_DC ); //Allows the parameter to be used later in the col formula expression
Mod_Parm_list={};
Parm_start={};
Parm_list={};
Match_list={};
b=1;
for(m=1,m<=num_exp,m++,
Mod_Parm_list[m]="A"||char(m);
Parm_start[m]=parse("Parm_"||Mod_Parm_list[m]||" = -0.1");
Parm_list[m]="Parm_"||Mod_Parm_list[m];
Match_list[b]=Mod_Parm_list[m];
Match_list[b+1]=parse(Parm_list[m]);
b=b+2;
);
dt << NewColumn("I_model",Format ("Scientific"),Formula(
Parameter(
{T1 = 1, T2 = 1, T3 = 1, T4 = 1, T5 = 1, T6=1},
:I_DC_form + T1 * Exp( -:Time / 0.004 ) + T2 * Exp( -:Time / 0.01 ) + T3 * Exp( -:Time / 0.1 )
+ T4 * Exp( -:Time / 1 ) + T5 * Exp( -:Time / 10 ) + T6 * Exp( -:Time / 100 ))
)
);