こんにちは、みんな、
非線形回帰ルーチンを自動化しようとしていますが、その一部には列式を使用してカスタムモデルを作成することが含まれています。
任意の数のパラメータを持ちたいのですが、適切にフォーマットされたリストをParameter({})セクション( "Parm_Start")にダンプすることで解決したと思います。 私が抱えている問題の1つは、Match()で用語を任意に設定する方法がわからないことです。 私はMatch_List {}でこれをやろうとしました、そしてそれはフォーマットにマッチします、しかし、それは奇妙な出力を与えます。
次に、A [o] * exp(-t / t [o])の形式を使用して、"o"の前指数項と "o"を使用して一連の指数を合計しようとしています。 AはすべてModableパラメータで、Mod_Parm列から引き出されます。時間は任意の長さと独立変数の列です。TimeconstはMod_Parmと同じ長さの列です(どちらもTimeより短い)。
最初にこれを修正する必要があるので、私はJSLベースの非線形モデリング・ルーチンが呼び出される部分に到達していません。
ありがとうございます。
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])
)
)
)
);
後世のために、私はソリューションのその部分がここに見つけられることができることを加えたいと思いました:
https://community.jmp.com/t5/Discussions/How-to-pass-a-variable-into-a-formula/td-p/52344
つまり、私の問題の一部は、テーブル変数として "I_DC"を定義せず、列式で式が理解されると想定していました。 これがその部分の更新です。
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 ))
)
);