안녕 모두,
비선형 회귀 루틴을 자동화하려고하고 있는데 그 중 일부는 열 수식을 통해 사용자 지정 모델을 만드는 작업과 관련이 있습니다.
임의의 수의 매개 변수를 갖고 싶습니다. 매개 변수 ({}) 섹션 ( "Parm_Start")에 적절히 형식화 된 목록을 덤핑하여 해결했다고 생각합니다. 한 가지 문제는 Match ()에서 임의로 용어를 설정하는 법을 모르겠다는 것입니다. 형식과 일치하는 Match_List {}를 사용하여이 작업을 시도했지만 이상한 출력을 제공합니다.
둘째로, 나는 "o"pre-exponential terms과 "o"* exp (-t / t [o]) 형식을 사용하여 일련의 지수를 합산하려고합니다. 아래 코드를보십시오. A는 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 ))
)
);