Hallo zusammen,
Ich versuche, eine nichtlineare Regressionsroutine zu automatisieren. Dazu gehört auch das Erstellen eines benutzerdefinierten Modells über Spaltenformeln.
Ich möchte eine beliebige Anzahl von Parametern haben, und ich denke, ich habe das gelöst, indem ich eine entsprechend formatierte Liste in den Abschnitt Parameter ({}) ("Parm_Start") ablegte. Ein Problem, das ich habe, ist, dass ich nicht weiß, wie der Begriff in Match () willkürlich festgelegt wird. Ich habe versucht, dies mit Match_List {} zu tun, das dem Format entspricht, aber es gibt ungerade Ausgaben.
Zweitens versuche ich, eine Reihe von Exponentialen mit "o" vorexponentialen Ausdrücken und "o" unter Verwendung der Form A [o] * exp (-t / t [o]) zu summieren - siehe den nachstehenden Code. Die Einsen sind alle einstellbaren Parameter, die aus einer Spalte Mod_Parm abgerufen werden. Zeit ist eine Spalte mit beliebiger Länge und der unabhängigen Variablen. und Timeconst ist eine Spalte mit derselben Länge wie Mod_Parm (beide sind kürzer als Time).
Ich bin nicht zu dem Teil gekommen, an dem die JSL-basierte nichtlineare Modellierungsroutine aufgerufen wird, da dies zuerst behoben werden muss.
Vielen Dank!
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])
)
)
)
);
Für die Nachwelt wollte ich hinzufügen, dass ein Teil der Lösung hier zu finden ist:
https://community.jmp.com/t5/Discussions/How-to-pass-a-variable-into-a-formula/td-p/52344
Das heißt, ein Teil meines Problems bestand darin, "I_DC" nicht als Tabellenvariable zu definieren und vorausgesetzt, die Spaltenformel würde den Ausdruck verstehen. Hier ist das Update für diesen Teil:
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 ))
)
);