一般化回帰 -- 調整パラメータ スクリプトを取得します対数正規分布で一般化回帰プラットフォームの収縮手法 (ラッソ、エラスティック ネットなど) を使用し、さまざまな近似統計 (負の対数尤度、一般化 R2) に対する調整パラメーターの散布図を作成する必要があります。 調整パラメータの値を事前設定し、グリッド点の数を 1 (JMP が調整パラメータに使用するグリッドに沿った点の数) を事前設定することで、これを実現したいと考えました。
以下のスクリプトは、調整パラメーター (^PEN^) の異なる値を認識せず、モデル推定ループの各反復で同じ値を報告します。 私の推測では、スクリプト内の次の 2 行に必要な値が認識されていないのではないかと考えられます。
Lambda Penalty( ^PEN^ ),
Number of Grid Points( 1 ),
あらゆる知恵をいただければ幸いです。
//Script to retrieve parametrics negative logl and R2GEN
//Both data tables below must be open for script to run
dt = Data Table("JMP Test Data.jmp");
dt_pens = Data Table("Penalties1.jmp");
//Get copy of penalty table to store results
dt_results = dt_pens << Subset( All rows, Selected columns only( 0 ) );
dt_results << New Column("RsqGEN Training");
dt_results << New Column("RsqGEN Validation");
dt_results << New Column("RsqGEN Test");
dt_results << New Column("neglogl Training");
dt_results << New Column("neglogl Validation");
dt_results << New Column("neglogl Test");
dt_results << New Column("N Training");
dt_results << New Column("N Validation");
dt_results << New Column("N Test");
dt_results << New Column("Tuning Param");
for(i = 1, i<= N Row(dt_pens), i++,
PEN = dt_pens:Penalty[i];
str = Eval Insert("\[report = (dt << Fit Model(
Y( :Y1 ),
X( :X1, :X2, :X3, :X4),
Validation( :Name( "Train/Valid/Test" ) ),
Lambda Penalty( ^PEN^ ),
Number of Grid Points( 1 ),
Personality( "Generalized Regression" ),
Generalized Distribution( "LogNormal" ),
Run(
Fit(
Estimation Method( Lasso( Adaptive ) ),
Validation Method( Validation Column )
)
),
Go,
invisible
)) << Report;]\");
//Fit the model
Eval(Parse(str));
//Get the fit stats and insert them into the results table
Train = report["Model Summary"][NumberColBox(1)] << Get;
Valid = report["Model Summary"][NumberColBox(2)] << Get;
Test = report["Model Summary"][NumberColBox(3)] << Get;
report << Close Window;
dt_results:RsqGEN Training[i] = Train[7];
dt_results:RsqGEN Validation[i] = Valid[7];
dt_results:RsqGEN Test[i] = Test[7];
dt_results:neglogl Training[i] = Train[3];
dt_results:neglogl Validation[i] = Valid[3];
dt_results:neglogl Test[i] = Test[3];
dt_results:N Training[i] = Train[1];
dt_results:N Validation[i] = Valid[1];
dt_results:N Test[i] = Test[1];
// dt_results:Tuning Param[i] = Train[8];
);
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得素晴らしい! ありがとう、クレイ…
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得このようなもの? ペナルティは最初の行にあり、予測は次の行にあります。
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
fm = Fit Model(
Y( :Y ),
Effects( :BMI, :BP, :Total Cholesterol, :LDL, :HDL ),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Run( Fit( Estimation Method( Lasso ), Validation Method( AICc ) ) )
);
lambdas = fm << (Fit[1] << get penalty grid);
lambdas = lambdas`;
nGridPoints = ncol(lambdas);
// loop through each solution and save the predictions
for(i=0, i<NGRIDPOINTS></NGRIDPOINTS>
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得ああ、これで何をしようとしているのかわかりました。 ただし、後続のグラフで使用できるように、データ テーブル内のラムダの数値が必要です。 最初の行にラムダ、後続の行に予測を含む新しい出力テーブルを作成することは可能でしょうか?
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得予測式の名前にラムダ値を入れるとうまくいきますか?
その場合は、以下のようなことを行うことができます。 スクリプトは、<
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
fm = Fit Model(
Y( :Y ),
Effects( :BMI, :BP, :Total Cholesterol, :LDL, :HDL ),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Run( Fit( Estimation Method( Lasso ), Validation Method( AICc ) ) )
);
lambdas = fm << (Fit[1] << get penalty grid);
// loop through each solution and save the predictions
for(i=0, i<150, i++, // the first solution is solution 0
fm << (Fit[1] << set solution ID(i));
fm << (Fit[1] << save prediction formula);
newc =column(dt, ncol(dt));
newc << set name( newc<<GET name=""></GET>
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得素早い対応をありがとう、クレイ。 とても有難い。
私が現在抱えている問題は、各反復のペナルティパラメータを制御する方法がわからないことです。 以前のスクリプトでは次のようになっていました。
penaltyVector <SPAN class="token operator">=</SPAN> fm <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN> <SPAN class="token punctuation">(</SPAN>fit<SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> get penalty grid</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
また、結果を含む新しい JMP テーブルも取得できません。
二重チェックの目的で、その特定の反復からのペナルティ パラメーターの値を出力テーブルの最初の行として追加することは可能でしょうか?
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得おい、
ここではそれを行うための 1 つの方法を紹介します。 サンプル データ フォルダーの糖尿病データ セットを使用して、以下に小さな例を作成しました。 重要なのは、Set Solution ID メッセージを適合者に送信することです。 パラメーター グリッドには 150 個のポイントがあるため、0、1、2、...、149 を送信して、パス内の各ソリューションのパラメーター ベクトルを設定します。 最初のソリューションのインデックスを 1 ではなく 0 にしたことを後悔していますが、今のところはその構文で行き詰まっていると思います。
これが意味をなさない場合、または必要な機能が実行されない場合はお知らせください。
ありがとう、
粘土
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
fm = Fit Model(
Y( :Y ),
Effects( :BMI, :BP, :Total Cholesterol, :LDL, :HDL ),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Run( Fit( Estimation Method( Lasso ), Validation Method( AICc ) ) )
);
// loop through each solution and save the predictions
for(i=0, i<150, i++, // the first solution is solution 0
fm << (Fit[1] << set solution ID(i));
fm << (Fit[1] << save prediction formula);
// if you want to give the column a different name, send a message here.
);
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得もう一度言ってごめんなさい、クレイ。 しばらく経ちました... 投げ縄モデルのペナルティ/調整パラメータの値を変更し、ペナルティの値ごとにモデルに関するさまざまな情報を取得できるスクリプトをご提供いただきました。 ここで、さらに何かをする必要があります。ペナルティの値ごとに、予測値をテーブルに保存し、ペナルティのすべての値にわたってそれらの列を連結します。 私はそうすることに失敗してきました。 この特定の状況では、ペナルティは 150 回異なるため、150 個のなげなわモデルが推定されます。
ご協力をいただければ幸いです。
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得ドキュメントには、K 倍 CV を使用すると調整パラメーターを取得できないと記載されています。R glmnet と Matlab のなげなわを使用してそれを取得できます。ロジスティック回帰で投げ縄を行っています。明らかに JMP はラムダを選択するために何らかのメソッドを使用する必要があるため、それを取得する方法はありますか。
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得問題ない!
1 および 2 - AICc 値と BIC 値を取得するには、以下の例を参照してください。
3. ソリューション パスのパラメーター推定値は、中心およびスケーリングされた予測子から得られるパラメーター推定値です。 これらは、<
4. Scaled -LogLikelihood 値は、負の対数尤度を度数の合計で割ったものです。 たとえば、検証セットに 100 個の観測値がある場合、<< Get Validation Negative LogLikelihood を使用して尤度のベクトルを取得し、そのベクトルを 100 で除算します。 トレーニング セットと検証セットを同じスケールでプロットできるように、サンプル サイズに基づいてそれらをスケールするだけです。
5. 横軸は、中心化されスケーリングされたパラメータ推定値の L1 ノルムです (切片を除く)。 したがって、<
以下は、探していた構文をまとめた例です。
dt = Open("$SAMPLE_DATA/Diabetes.jmp");
fm = Fit Model(
Y( :Y ),
Effects( :Age, :Gender, :BMI ),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Run( Fit( Estimation Method( Lasso ), Validation Method( AICc ) ) )
);
penaltyVector = fm << (fit[1] << get penalty grid);
bics = fm << (fit[1] << get BIC path);
aiccs = fm << (fit[1] << get aicc path);
solutionPath = fm << (fit[1] << get solution path);
solutionPath = solutionPath`; // transpose for convenience
summaryTable = as table( penaltyVector || aiccs || bics || solutionPath);
column(1) << set name("Lambda");
column(2) << set name("aicc");
column(3) << set name("bic");
column(4) << set name("Intercept");
column(5) << set name("Age parm");
column(6) << set name("Gender parm");
column(7) << set name("BMI parm");
column(8) << set name("sigma parm");
summaryTable << new column("L1 norm", Formula(abs(:Age Parm) + abs(:Gender Parm) + abs(:BMI parm)));
// run this to recreate the solution path
Graph Builder(
Show Control Panel( 0 ),
Variables(
X( :L1 norm ),
Y( :Age parm ),
Y( :Gender parm, Position( 1 ) ),
Y( :BMI parm, Position( 1 ) )
),
Elements( Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ) )
);
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得ありがとう、クレイ。 これはとても役に立ちます。
ペナルティ グリッドやその他の構文が見つからなくても、正気を失わなかったことがわかってうれしかったです。 これらの項目の構文もわかるでしょうか?
感謝と感謝を込めて…
1.ビック
2.AICc
3. 「パラメータ推定」の測定値 - ソリューション パス出力の 2 つのグラフの左端の縦軸。
4. 「スケールされた対数尤度」測定 - ソリューション パス出力の右端のグラフの縦軸。
5. 「スケールされたパラメータ推定の大きさ」 - 両方のソリューション パス グラフの横軸。
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得1. トラブルシューティングに役立つようにスクリプトの一部を投稿していただけますか? そうでない場合は、以下の例にコメントを追加しました。
2. 通常、この種の構文を見つけるのに最適な場所は、オブジェクト スクリプト インデックス ([ヘルプ] > [スクリプト インデックス]) です。 ただし、この場合、関数は主にプラットフォームを内部でテストするために追加されたものであるため、インデックスには表示されません。 ただし、次のバージョンでは見つけやすくなるように表示される予定です。
R^2 値の代わりに尤度を使用するように前の例を更新しました。
// dt is a reference to the data table
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
// fm is a reference to this instance of Fit Model
fm = dt << Fit Model(
Y( :Y ),
Effects(
:Age,
:Gender,
:BMI,
:BP
),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Validation( :Validation ),
Run(
Fit(
Estimation Method( Lasso( Adaptive ) ),
Validation Method( Validation Column )
)
)
);
// take the first model in the platform and store the penalty values in a vector
penaltyVector = fm << (fit[1] << get penalty grid);
// so on for training and validation likelihoods
trainingnll = fm <<(fit[1] << Get Training Negative LogLikelihood);
validationnll = fm << (fit[1] << Get Validation Negative LogLikelihood);
as table(penaltyVector || trainingnll || validationnll);
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得ありがとう、クレイ。 これはとても役に立ちました。 よろしければ、いくつか追加の質問をさせていただきます...
1. ペナルティ グリッド値と Rsq 値を含むベクトルを取得するにはどうすればよいですか? 提供していただいたスクリプトをさまざまに試してみましたが、結果は何も得られませんでした。
2. スクリプト内の「ペナルティ グリッド」などの構文を見つけるにはどうすればよいですか? 負の対数尤度も取得したいので質問しました...
とても有難い。
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得現在、プラットフォームはペナルティ値を自分で指定できるように設定されていません。 代わりに、JMP はペナルティ値のグリッドを試し、最適なペナルティ値を提示します。 モデルの起動時に [詳細コントロール] パネルを使用して、グリッドの定義方法をある程度制御できます。

適合が得られたら、ペナルティ値と r 二乗のグリッドをプラットフォームから取得するための JSL 関数がいくつかあります。 以下の例のようなことができます
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
fm = dt << Fit Model(
Y( :Y ),
Effects(
:Age,
:Gender,
:BMI,
:BP
),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Validation( :Validation ),
Run(
Fit(
Estimation Method( Lasso( Adaptive ) ),
Validation Method( Validation Column )
)
)
);
penaltyVector = fm << (fit[1] << get penalty grid);
trainingR2 = fm <<(fit[1] << get training rsquare path);
validationR2 = fm << (fit[1] << get validation rsquare path);
//testR2 = fm << (fit[1] << get test rsquare path); // this example doesn't have a test set
Re: 一般化回帰 -- 調整パラメータ スクリプトの取得2 番目のデータ テーブル、Penalties1.jmp が添付されています。