广义回归——检索调整参数脚本使用具有对数正态分布的广义回归平台收缩方法(套索、弹性网等),我需要根据各种拟合统计(负对数似然、广义 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。