スクリプトの自動化: 予測変数の取得とシグマレベルの設定こんにちは、
モデリングフローのスクリプトを作成するプロジェクトを任されました。予測変数と応答変数はすべて数値連続型で、応答変数は個別にフィッティングされます。初期データの準備が終わったら…
- 段階的K分割検証 <-- 自動化
- ステップ1のモデルをSLSで実行 <-- 自動化
- SLS予測プロファイラー:
- シミュレータの初期化 <-- 自動化
- すべての因子タイプをランダムに変更 <-- 自動化されていません
- 各列のすべてのSDを3シグマ値に変更します <-- 自動化されていません
このフローはforループを使用します。各反復処理で、単一の応答変数に対して一連の分析を実行します。3.2用のスクリプトは簡単に入手できますが、SD値を3シグマ値に変更するのは簡単ではありません。forループを使用しながら、3.2のSD値の変更を自動化するにはどうすればよいでしょうか?もっと良い方法はありますか?「設定」>「プラットフォーム」>「モデルの適合」>「最小二乗法」を確認しましたが、SD値を1 SDから3 SDに変更するオプションが見つかりません。
新しく JMP 17 にアップデートしました。役立つかもしれません。
データの探索と可視化Re: スクリプティングの自動化: 予測変数の取得とシグマ レベルの設定このようなもの?
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Tiretread.jmp");
obj = Profiler(
Y(
:Pred Formula ABRASION, :Pred Formula MODULUS, :Pred Formula ELONG,
:Pred Formula HARDNESS
)
);
val = 3;
obj << Simulator(
1,
Factors(
SILICA << Random(Normal(1.25, 0.3266)), SILANE << Random(Normal weighted(50, 6.532)),
SULFUR << Fixed(2.25)
),
Responses(
Pred Formula ABRASION << Add Random Noise(1), Pred Formula MODULUS << Add Random Noise(2),
Pred Formula ELONG << Add Random Noise(val), Pred Formula HARDNESS << Add Random Noise(val*2)
)
);
スクリプト インデックスの例から変更

Re: スクリプティングの自動化: 予測変数の取得とシグマ レベルの設定こんにちは@jthi 、
そうではありません。 以下は私が持っているコードのスニペットです。もう少し詳しく説明します。
// Iterating through responses - JMP 17
mymodel_sw = Fit Model( Y( response[i] ),
Effects( Factorial to degree( eval( predict ) ), Response Surface( eval( predict ) ) ),
Personality("Stepwise"),
Run( "K-Fold Crossvalidation"n(5) )
);
// Runs modeling
mymodel_sw << Go;
// Finishes predictor selection before proceeding
mymodel_sw << Finish;
// Makes model
mymodel_sls = mymodel_sw << Make Model;
// Runs SLS model
mymodel_sls << Run;
// Finishes modeling before proceeding
mymodel_sls << Finish;
// Gets list of predictors
param_SLS = mymodel_sls << Get Parameter Names;I << Get Parameter Names を実行すると、削除されたオブジェクト参照で param_SLS エラーが発生します。ただし、<< Simulate to table で引数を構築するには、このパラメーターのリストが必要です。これは、それを処理するカスタム関数を作成することによって行います。
このコード スニペットは、一度に 1 つずつ応答のリストを反復処理する for ループ内にあります。これは理にかなっていますか?
Re: スクリプティングの自動化: 予測変数の取得とシグマ レベルの設定または、プロファイラー ツールからパラメーター名を取得する方法はありますか? 使用できるパラメーター名の一意のリストが必要です。 適合するパラメータの数は、モデルごとに異なると想定する必要があります。
Re: スクリプティングの自動化: 予測変数の取得とシグマ レベルの設定より詳細なサンプル スクリプトを次に示します。これは機能しないことに注意してください。
Names default to here(1);
dt = open( "$SAMPLE_DATA/Body Fat.jmp" );
/////////////////////////// Custom function - Help!
mysim = function( {list, iteration, stddev, step},
// New list placeholder
unique_factors = {};
// Adds only unique factors to new list, uses "*" as identifier
for( i = 1, i <= N items( list ), i++,
if( list[i] << !contains( "*" ) , insert into( unique_factors, list[i] )
)
);
num_sim_factors = N Items( unique_factors );
// Modifies each factor in the simulator to normal distribution with 3 standard deviations
simfactor = {};
for( i = 1, i <= num_sim_factors, i++,
temp_1 = char( unique_factors[i] ) || " << Random( Normal( " || char( col mean( unique_factors[i] ) ) ||
", " || char( stddev * col std dev( unique_factors[i] ) ) || ") ),"
insert into( sim_factor, temp_1 )
);
// Inputs simfactor into simulator
mymodel_sls << Simulator( 1, eval( simfactor ) );
// Creates the arguments for Simulate to table
simtable_pt1 = "N Runs( " || char( iteration ) || "),"
simtable_pt2 = {};
// Creates an argument for each factor
for( i = 1, i <= num_sim_factors, i++,
temp_2 = char( unique_factor[i] ) || " << Sequence Location( " || char ( Col Minimum( unique_factor[i] ) ) || ", "
chart ( Col Maximum( unique_factor[i] ) ) || ", " || char( step ) || " ),";
insert into( simtable_pt2, temp_2 )
);
// Combines strings into a single argument for use for Simulate to Table
simarg = simtable_pt1 || simtable_pt2;
// Simuates data to table for further analysis
mymodel_sls << Get simulator;
mymodel_sls << Simulate to table( simarg );
);
/////////////////////////// Cols to use - user adjustable
predict = {:"Neck circumference (cm)"n, :"Chest circumference (cm)"n,
:"Abdomen circumference (cm)"n, :"Hip circumference (cm)"n,
:"Thigh circumference (cm)"n, :"Knee circumference (cm)"n,
:"Ankle circumference (cm)"n, :"Biceps (extended) circumference (cm)"n,
:"Forearm circumference (cm)"n, :"Wrist circumference (cm)"n};
response = {:"Age (years)"n, :"Weight (lbs)"n, :"Height (inches)"n};
/////////////////////////// User input
num_response = N Items( response );
num_predict = N Items( predict );
// How many simulations to run?
sim_no = 1000;
// How many standard deviations for each predictor in the simulation?
stddev = 3;
// Steps in simulation
steps = 4;
/////////////////////////// Changing col attribute
// In a later step, Simulate, the mean should be 0 due to this
for( i = 1, i <= num_response, i++,
response[i] << Set Property( "Coding", { col minimum( response[i] ), col maximum( response[i] ) } );
);
/////////////////////////// Modeling
/* Fit Model - Stepwise, w/ K-fold validation --> SLS --> Simulate */
for( i = 1, i <= num_response, i++,
// Names models for calling later
mymodel_sw = "FM_SW_" || char( i );
// Iterating through responses - JMP 17
mymodel_sw = Fit Model( Y( response[i] ),
Effects( Factorial to degree( eval( predict ) ), Response Surface( eval( predict ) ) ),
Personality("Stepwise"),
Run( "K-Fold Crossvalidation"n(5) )
);
// Runs modeling
mymodel_sw << Go;
// Finishes predictor selection before proceeding
mymodel_sw << Finish;
// Makes model
mymodel_sls = mymodel_sw << Make Model;
// Runs SLS model
mymodel_sls << Run;
// Finishes modeling before proceeding
mymodel_sls << Finish;
////////////////// NOT WORKING BELOW
// Gets list of predictors <--- This is first step
param_sls1 = mymodel_sls << Get Effect Names;
param_sls2 = mymodel_sls << Get Parameter Names;
show(param_sls1, param_sls2);
// Calls on custom function <--- This is second step
mysim( param_sls1, sim_no, stddev, steps );
// Names Simulate to table dataset by response variable in for loop
Current data table() << Set name( char( response[i] ) || "_report" );
);ヘルプ! これには複数の部分が機能していません!これが機能しているものです-カスタム関数とその下(スクリプトの下部近く)をコメントアウトします。 SLS モデリングの生成は完了できますが、シミュレート パラメーターの変更とシミュレートの実行に関しては、どちらもカスタマイズされています (カスタム関数を参照)。
Re: スクリプティングの自動化: 予測変数の取得とシグマ レベルの設定その関数には多くのタイプミスがあり、問題を引き起こす可能性があります。 いくつかのことを修正しただけですが、本来の動作をするかどうかはわかりません
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Body Fat.jmp");
mysim = function({input_list, iteration, stddev, step},
unique_factors = Filter Each({item}, input_list, !Contains(item, "*"));
num_sim_factors = N Items(unique_factors);
simfactor = {};
simfactor = Transform Each({uniq_factor}, unique_factors,
Eval Insert("^uniq_factor^ << Random(Normal(^col mean(column(dt, uniq_factor))^, ^stddev * col std dev(column(dt, uniq_factor))^");
);
// Inputs simfactor into simulator
mymodel_sls << Simulator( 1, eval(simfactor));
// Creates the arguments for Simulate to table
simtable_pt1 = "N Runs( " || char(iteration) || "),";
simtable_pt2 = {};
// Creates an argument for each factor
simtable_pt2 = Transform Each({uniq_factor}, unique_factors,
Eval Insert("^uniq_factor^ << Sequence Location(^Col Minimum(column(dt, uniq_factor))^, ^Col Maximum(column(dt, uniq_factor))^, ^step^)");
);
// Combines strings into a single argument for use for Simulate to Table
simarg = simtable_pt1 || Concat Items(simtable_pt2, ",");
// Simuates data to table for further analysis
mymodel_sls << Get simulator;
mymodel_sls << Simulate to table(simarg);
);
predict = {:"Neck circumference (cm)"n, :"Chest circumference (cm)"n,
:"Abdomen circumference (cm)"n, :"Hip circumference (cm)"n,
:"Thigh circumference (cm)"n, :"Knee circumference (cm)"n,
:"Ankle circumference (cm)"n, :"Biceps (extended) circumference (cm)"n,
:"Forearm circumference (cm)"n, :"Wrist circumference (cm)"n};
response = {:"Age (years)"n, :"Weight (lbs)"n, :"Height (inches)"n};
num_response = N Items(response);
num_predict = N Items(predict);
sim_no = 1000;
stddev = 3;
steps = 4;
For(i = 1, i <= num_response, i++,
response[i] << Set Property("Coding", {Col Minimum(response[i]), Col Maximum(response[i])})
);
For(i = 1, i <= num_response, i++,
mymodel_sw = "FM_SW_" || Char(i);
mymodel_sw = Fit Model(
Y(response[i]),
Effects(Factorial to degree(Eval(predict)), Response Surface(Eval(predict))),
Personality("Stepwise"),
Run("K-Fold Crossvalidation"n(5))
);
mymodel_sw << Go;
mymodel_sw << Finish;
mymodel_sls = mymodel_sw << Make Model;
mymodel_sls = mymodel_sls << Run;
mymodel_sls << Finish;
param_sls1 = mymodel_sls << Get Effect Names;
param_sls2 = mymodel_sls << Get Parameter Names;
Show(param_sls1, param_sls2);
mysim(param_sls1, sim_no, stddev, steps);
dt << Set name(Char(response[i]) || "_report");
);Re: スクリプティングの自動化: 予測変数の取得とシグマ レベルの設定@jthi - 私はあなたの推薦を少し掘り下げる必要があります.Filter Each、Transform Each、および Eval Insert を見たことがありますが、それらの経験はなく、どのように機能するかはまだわかりません。
あなたへの別の質問です。Eval Insert には、見たことのないニンジン ^ マークがあります。それらの機能について詳しく知ることができるドキュメントはありますか?どのように使用しているかは明らかだと思いますが、私は興味をそそられ、あなたの使用法を正しく解釈していることを確認したいと思います.
simfactor = Transform Each({uniq_factor}, unique_factors,
Eval Insert("^uniq_factor^ << Random(Normal(^col mean(column(dt, uniq_factor))^, ^stddev * col std dev(column(dt, uniq_factor))^");
);Re: スクリプティングの自動化: 予測変数の取得とシグマ レベルの設定@jthi 、
あなたは正しい軌道に乗っていました! それぞれの関数に挿入する引数を作成するには、他の式操作が必要でした。mysim カスタム関数では、シミュレーション用の分布を変更するための引数の挿入と、Simulate to Table に挿入する引数の生成について詳しく説明されています。これは非常にエキサイティングな学習の機会であり、これらのタイプの高度な表現に目を向けました。
式の操作について詳しく知りたい場合は、ドキュメントへのリンクを次に示します。 https://www.jmp.com/support/help/en/17.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#
助けてくれた人に感謝します!
Names default to here(1);
dt = open( "$SAMPLE_DATA/Body Fat.jmp" );
mysim = function( {list, iteration, stddev, step},
// filter list of effects down to main effects. These are the effects whose name matches a column name
// take advantage of the speed of associative arrays to get the intersection set.
list << Intersect(Associative Array(dt<<GET column="" names=""> SLS --> Simulate */
for( k = 1, k <= num_response, k++,
// Names models for calling later
mymodel_sw = "FM_SW_" || char( k );
// Iterating through responses - JMP 17
mymodel_sw = Fit Model( Y( response[k] ),
Effects( Factorial to degree( eval( predict ) ), Response Surface( eval( predict ) ) ),
Personality("Stepwise"),
Run( "K-Fold Crossvalidation"n(5) )
);
// Runs modeling
mymodel_sw << Go;
// Finishes predictor selection before proceeding
mymodel_sw << Finish;
// Makes model
mymodel_sls = mymodel_sw << Make Model;
// Runs SLS model
mymodel_sls = mymodel_sls << Run; // this creates another object. assign your variable to that object
mymodel_sls << Profiler(1); // make sure profiler is on.
// Gets associative array of effect names.
// use this in the function to easily filter down to the main effect names
param_sls1 = Associative Array(mymodel_sls << Get Effect Names);
// Calls on custom function <--- This is second step
resultDT = mysim( param_sls1, sim_no, stddev, steps ); // assign variable to reference returned table
// Names Simulate to table dataset by response variable in for loop
resultDT << Set name( char( response[k] ) || "_report" );
);</GET>
ss