如何使用多个参数拟合自定义非线性模型我有一个非线性模型,我为其创建了一个包含以下公式的新列。 该模型被描述为类似于具有两个定义阶段的 S 形曲线,我有三个参数来表征每个阶段。 初始阶段由 K1、Y1 和 P1 参数描述,第二阶段由 K2、Y2 和 P2 参数描述。 此外,对于每个参数,我都创建了一个新列,并赋予初始值 0.1 以方便拟合(不在下面的脚本中)。 但是,从 0 到 1 的样本之间的值可能会有很大差异。
我有一个样本列表,我需要为其拟合相同的模型并根据最佳拟合检索这些参数值。 我想根据最小 RMSE 或最大 R2 测量最合适的值。 但是,我不知道该怎么做。 我为损失函数创建了一个列,我将其计算为实验数据 (:Production) 和模型 (:Model) 之间的 SSQ,希望这对拟合模型有所帮助。
col7 = New Column("Model");
col7<< set formula (Parameter({Y1_Y1_0 = 0.001, K1_K1_0 = 0.001, P1_P1_0 = 0.001, Y2_Y2_0 = 0.001, K2_K2_0 = 0.001, P2_P2_0 = 0.001},
Y1_Y1_0 * Exp(-Exp(((K1_K1_0 * Exp()) / Y1_Y1_0) * (P1_P1_0 - :Days))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp()) / Y2_Y2_0) * (P2_P2_0 - :Days)))));
col8=newcolumn("Error");
col8<< set Formula(SSQ(:Production - :Model));
col8<<EVALFORMULA></EVALFORMULA>
作为将模型拟合到一个样本时生成的脚本的示例
Nonlinear(
Y( :Methane Yield ),
X( :Model ),
Loss( :Err ),
Iteration Limit( 1000 ),
Numeric Derivatives Only( 1 ),
Unthreaded( 1 ),
Loss is Neg LogLikelihood( 1 ),
Newton,
Finish,
Where( :Sample == "M301" )
);
我正在尝试使这些分析自动化,因为我现在一直在使用 Excel Solver。
有人可以提供一些关于如何通过数据表中的所有样本自动运行模型拟合并检索 RSME 最小(如果我在损失函数最小时正确)或 R2 最大时的参数的反馈吗?
每列中的参数值会自动更新吗?
谢谢
伊沃
回复:如何使用多个参数拟合定制的非线性模型谢谢。回复:如何使用多个参数拟合定制的非线性模型默认损失函数是最小二乘法,因此 JMP 会自动对观察到的响应和预测响应之间的差异进行平方。
我认为你的参数估计会很高,所以很难收敛。 同样,在尝试使用脚本自动化之前,我会使用 Nonlinear 交互式解决问题。
您可能需要就此问题联系 JMP 技术支持。 (support@jmp.com)
回复:如何使用多个参数拟合定制的非线性模型是的,这就是我正在使用的模型。那么我应该使用什么函数来指定损失函数?回复:如何使用多个参数拟合定制的非线性模型这是您要拟合的模型吗:

损失函数不应使用 SSQ() 函数。 非线性平台会自动合并每一行的损失。
回复:如何使用多个参数拟合定制的非线性模型起始值是根据在 Excel Solver 上针对相同数据获得的结果使用的。
JMP 没有取得类似的结果或没有取得良好的收敛性,这有点令人惊讶。 此外,JMP 难以使用损失函数运行迭代并最终崩溃。 在没有损失函数的情况下运行它时,它不会实现任何收敛。
回复:如何使用多个参数拟合定制的非线性模型另一条评论:我建议以交互方式使用非线性,直到您确定最佳设置。 与尝试让脚本同时工作相比,这种方式可能会更快更容易。 然后您可以保存脚本以继续开发。
回复:如何使用多个参数拟合定制的非线性模型首先,Finish 选项并不意味着永远走下去。 这与在用户界面中单击“开始”按钮而不是“步骤”按钮相同。 直到达到其中一个停止规则(标准)为止。 迭代次数的默认限制为 60。 您可以再次运行,使 Nonlinear 更加努力地工作以获得良好的解决方案。 如有必要,您还可以更改(放宽或加强)其他标准。
其次,收敛缓慢可能表明初始值选择不当。 您如何确定数据的这些值?
回复:如何使用多个参数拟合定制的非线性模型我在 JSL 上的经验很少。 不幸的是我才刚刚开始。 我正在使用 JMP14。 感谢您的反馈。
我已经按照您的建议(如下)修改了您的脚本并运行了它。 它确实给了我估计值,但它直到“无限”才运行迭代,因为我认为命令 :Finish 会请求。 那是对的吗? 它只会持续到 60 岁。 因此,输出拟合不是很好,参数估计偏高或为负,这意味着我可能需要设置参数约束
obj = Nonlinear(Y( :Methane Yield ), X( :Model ), Loss( :Err ), Finish(), By( :Sample ));
obj << go;
obj << get estimates;
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
fit_dt = (_xx[1]<<FIND></FIND>回复:如何使用多个参数拟合定制的非线性模型关于非线性建模,我只熟悉设置一个收敛准则,一个目标。许多年前,当计算能力与今天相比还很弱时,我通常使用 SAS 创建一个包含多个起始估计的循环,然后比较残差结果。 所以我不能帮助你的“最佳模型”请求。
您没有提到您使用的是哪个版本的 JMP,也没有提到您的脚本编写知识。 要理解此脚本,您需要了解一些基本语法。 以下是 JMP 脚本索引>对象>非线性>CopyByGroupScript 中脚本的修改。
它 :
- 创建一个“by”列,对于您的示例,这将是您的 :Sample 列
- 为报告 obj 分配句柄/引用。在这里你会使用你的脚本改变其中(:样品==“M301”)到通过(:示例)
- 演示如何使用“get”语句创建结果列表。 看JMP 脚本索引>对象>可用消息的非线性。
- 或者,您可以制作结果表。JMP 报告 (obj) 是显示框的嵌套列表。 例如,在 GUI 中,如果您有一个特定的表格框,可以逐个分组,然后右键单击并选择“制作组合数据表”,那么这个 JSL 也会做同样的事情。Xpath 是一种通用的查找显示框的方法。 Find 不太灵活,但在句法上更易于阅读。 下面的 Xpath 语句返回作为解决方案的 obj 报告中每个轮廓框的句柄/引用。 每个解决方案大纲框都有 2 个表格框,我知道看结构。我所需要的只是这些表格框的第一次出现 ecah 发送消息以制作组合数据表格。
这应该给你一个起点。首先运行下面的脚本以确保它在您的 JMP 版本上运行,然后进行修改。 这是此示例脚本的估算表的图片。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Nonlinear Examples/US Population.jmp" );
dt << New Column( "_bycol",
Character,
Nominal,
set values( Repeat( {"A", "B"}, N Rows( dt ) )[1 :: N Rows( dt )] )
);
obj = Nonlinear( Y( :pop ), X( :Name( "X-formula" ) ), Finish(), By( _bycol )) ;
obj << go;
//returns a list of vectors where each vector, contains the parameters estimates
obj << get estimates;
//also see Get SSE, Get Parameter Names, Get CI
//Alternately, make a table
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
//only 2 groups so only 2 are found; each contains two sub tables
fit_dt = (_xx[1]<<FIND></FIND>