Ciao a tutti,
Sto tentando di automatizzare una routine di regressione non lineare e parte di ciò comporta la creazione di un modello personalizzato tramite le formule di colonna.
Voglio avere un numero arbitrario di parametri, e penso di averlo risolto scaricando un elenco formattato in modo appropriato nella sezione Parametro ({}) ("Parm_Start"). Un problema che sto avendo è che non so come impostare arbitrariamente il termine in Match (). Ho provato a farlo con Match_List {}, che corrisponde al formato, ma fornisce risultati strani.
In secondo luogo, sto cercando di sommare una serie di esponenziali con "o" termini pre-esponenziali e "o" usando il modulo A [o] * exp (-t / t [o]) - vedi il codice qui sotto. Gli A sono tutti parametri impostabili, estratti da una colonna Mod_Parm; Il tempo è una colonna di lunghezza arbitraria e la variabile indipendente; e Timeconst è una colonna della stessa lunghezza di Mod_Parm (entrambi sono più brevi di Time).
Non ho ottenuto la parte in cui viene chiamata la routine di modellazione non lineare basata su JSL, poiché è necessario risolvere questo problema prima.
Grazie!
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])
)
)
)
);
Per i posteri, volevo aggiungere che parte della soluzione può essere trovata qui:
https://community.jmp.com/t5/Discussions/How-to-pass-a-variable-into-a-formula/td-p/52344
Cioè, parte del mio problema non era la definizione di "I_DC" come variabile di tabella e presupponendo che la formula della colonna avrebbe compreso l'espressione. Ecco l'aggiornamento per quella parte:
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 ))
)
);