廣義回歸——檢索調整參數腳本使用具有對數正態分佈的廣義回歸平台收縮方法(套索、彈性網等),我需要根據各種擬合統計(負對數似然、廣義 R2)創建調整參數的散點圖。 我希望通過預先設置調整參數的值並將網格點數預先設置為 1(JMP 用於調整參數的網格上的點數)來實現這一點。
下面的腳本無法識別調整參數 (^PEN^) 的不同值,並且會為模型估計循環的每次迭代報告相同的值。 我最好的猜測是它沒有識別腳本中這兩行所需的值:
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];
);
回复:廣義回歸——檢索調整參數腳本出色的! 謝謝你,克萊...
回复:廣義回歸——檢索調整參數腳本是這樣的嗎? 罰分在第一行,預測在後幾行。
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>
回复:廣義回歸——檢索調整參數腳本啊,我明白你要去哪裡了。 但我需要數據表中 lambda 的數值,以便我可以在後續圖表中使用它。 是否可以創建一個新的輸出表,其中第一行是 lambda 表達式,後續行是預測?
回复:廣義回歸——檢索調整參數腳本將 lambda 值放在預測公式的名稱中是否有效?
如果是這樣,您可以執行以下操作。 該腳本將我們從 <
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>
回复:廣義回歸——檢索調整參數腳本感謝您的快速回复,克萊。 非常感激。
我現在遇到的問題是我不知道如何控制每次迭代的懲罰參數。 在之前的腳本中,你有這個:
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 表。
僅出於雙重檢查的目的,是否可以將來自該特定迭代的懲罰參數的值添加為輸出表中的第一行?
回复:廣義回歸——檢索調整參數腳本嘿,
這是您可以做到這一點的一種方法。 我在下面使用示例數據文件夾中的糖尿病數據集編寫了一個小示例。 關鍵是發送Set Solution ID消息給fit。 由於您的參數網格中有 150 個點,您將發送 0,1,2,...,149 來為路徑中的每個解決方案設置參數向量。 我很遺憾將第一個解決方案索引為 0 而不是 1,但我認為我們現在仍然堅持使用該語法。
讓我知道這是否沒有意義,或者它沒有做您需要做的事情。
謝謝,
黏土
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.
);
回复:廣義回歸——檢索調整參數腳本很抱歉重新討論這個問題,Clay。 有一陣子了... 您好心地為我提供了一個腳本,允許我改變套索模型的懲罰/調整參數值,並為每個懲罰值檢索有關模型的各種信息。 我現在需要做更多的事情:對於每個懲罰值,將預測值保存到一個表中,然後將這些列連接到所有懲罰值中。 我這樣做沒有成功。 對於這種特殊情況,懲罰將變化 150 次,因此將估計 150 個套索模型。
任何幫助將不勝感激。
回复:廣義回歸——檢索調整參數腳本在文檔中它說如果我們使用 K-fold CV,我們將無法獲得調整參數。我能夠通過 R glmnet 和 Matlab 的套索獲得它。我正在用邏輯回歸做套索。有什麼方法可以檢索它,因為顯然 JMP 必須使用某種方法來選擇 lambda。
回复:廣義回歸——檢索調整參數腳本沒問題!
1 和 2 - 請參閱下面的示例以獲取 AICc 和 BIC 值。
3. 解路徑中的參數估計是您從居中和縮放的預測變量中獲得的參數估計。 您可以使用 <
4. Scaled -LogLikelihood 值只是負對數似然除以頻率之和。 因此,如果您的驗證集中有 100 個觀察值,例如,您將使用 << 獲取驗證負對數似然來獲取似然向量,然後將該向量除以 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 ) ) )
);
回复:廣義回歸——檢索調整參數腳本謝謝,克萊。 這非常有幫助。
很高興知道當我找不到懲罰網格和其他語法時我沒有失去理智。 我可能也知道這些項目的語法嗎?
感謝和讚賞...
1. 銀行卡
2. AICc
3. “Parameter Estimates”測量——Solution Path 輸出中兩個圖最左邊軸上的垂直軸。
4. “Scaled -Loglikehood”度量——Solution Path 輸出中最右側圖形上的垂直軸。
5.“縮放參數估計值的大小”——兩個解決方案路徑圖上的水平軸。
回复:廣義回歸——檢索調整參數腳本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);
回复:廣義回歸——檢索調整參數腳本謝謝,克萊。 這非常有幫助。 一些後續問題,如果我可以......
1. 如何檢索包含懲罰網格值和 Rsq 值的向量? 我嘗試了您提供的腳本的多種變體,但一無所獲。
2. 我怎樣才能在你的腳本中發現諸如“penalty grid”之類的東西的語法? 我問是因為我還想檢索 neg log-likehoods ...
非常感激。
回复:廣義回歸——檢索調整參數腳本該平台目前未設置為允許您自己指定懲罰值。 相反,JMP 正在嘗試懲罰值網格,然後顯示最適合您的懲罰值。 您可以使用模型啟動中的高級控制面板來控製網格的定義方式。

擬合後,可以使用一些 JSL 函數從平台獲取懲罰值和 r 方的網格。 你可以像下面的例子那樣做
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
回复:廣義回歸——檢索調整參數腳本附上第二個數據表 Penalties1.jmp。