如何使用多个参数拟合定制的非线性模型我有一个非线性模型,我为其创建了一个带有以下公式的新列。 该模型被描述为类似于具有两个定义阶段的 S 形曲线,其中我有三个参数来表征每个阶段。 初始阶段由 K1、Y1 和 P1 参数描述,第二阶段由 K2、Y2 和 P2 参数描述。 另外,对于每个参数,我创建了一个新列,并将初始值指定为 0.1 以方便拟合(不在下面的脚本中)。 然而,样本之间的值可能有很大差异,从 0 到 1。
我有一个样本列表,我需要为其拟合相同的模型并根据最佳拟合检索这些参数值。 我想根据最小 RMSE 或最大 R2 来测量最佳拟合。 但是,我不知道该怎么做。 我为损失函数创建了一个列,我将其计算为实验数据(:生产)和模型(:模型)之间的 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 自动对观测响应与预测响应之间的差值进行平方。
我认为你的参数估计会很高,因此很难收敛。 同样,在尝试使用脚本自动化之前,我会使用非线性交互方式解决该问题。
您可能需要联系 JMP 技术支持来解决此问题。 (support@jmp.com)
回复:如何使用多个参数拟合定制的非线性模型是的,这就是我正在使用的模型。那么我应该使用什么函数来指定损失函数?回复:如何使用多个参数拟合定制的非线性模型这是您想要拟合的模型吗:

损失函数不应使用 SSQ() 函数。 非线性平台会自动合并每行的损失。
回复:如何使用多个参数拟合定制的非线性模型起始值是根据 Excel Solver 对相同数据获得的结果使用的。
令人有点惊讶的是,JMP 没有获得类似的结果,或者没有实现良好的收敛。 此外,JMP 很难使用损失函数运行迭代,并最终崩溃。 当没有损失函数运行时,它不会实现任何收敛。
回复:如何使用多个参数拟合定制的非线性模型还有一条评论:我建议以交互方式使用非线性,直到确定最佳设置为止。 与尝试让脚本同时工作相比,这种方式可能会更快、更容易。 然后您可以保存脚本以继续开发。
回复:如何使用多个参数拟合定制的非线性模型首先,“完成”选项并不意味着永远进行。 这与单击用户界面中的“执行”按钮而不是“步骤”按钮相同。 一直持续到达到其中一项停止规则(标准)为止。 迭代次数的默认限制为 60。 您可以再次运行以使非线性更加努力以获得良好的解决方案。 如有必要,您还可以更改(放宽或加强)其他标准。
其次,收敛缓慢可能表明初始值选择不当。 您如何确定数据的这些值?
回复:如何使用多个参数拟合定制的非线性模型我对 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>