非线性曲线拟合的参数界限我正在尝试对 1000 多个样本的数据点进行拟合。我发现双指数 5P函数的拟合效果最佳。但是,如果相同的样本中有一两个数据点略微偏离趋势线,拟合效果就会非常奇怪。对于典型的样本群体,衰减率参数约为 0.2,而对于这些样本,拟合结果在 10 左右。非线性拟合中的“参数界限”和增加的迭代次数限制选项可以解决这个问题。但是,通过 GUI 手动执行此操作是不可能的。
有没有办法“全局”设置参数边界和迭代次数(针对所有样本)?
我也尝试了脚本选项,但我不熟悉 JSL 脚本,并且无法使用下面的脚本显示合适的结果。
Names Default To Here( 1 );
dt = Current Data Table();
obj = Nonlinear( Y( :data ), X( :data Predictor ), By( :ID ) );
obj << Go;
obj << Parameter Bounds(
asympt( 14, 22 ),
scale1( 0, 100 ),
decayrate1( -0.2, 0.1 ),
scale2( -100, 0 ),
decayrate2( -0.2, 0.1 )
);
obj << Iteration Limit( 10000 );
obj << Finish;
G = obj << Get Estimates;
Show( G );
obj << Report View( "Summary" );
obj << get estimates;
注意:原始 JSL 由 txnelson 移至 JSL 显示框
基础数据分析与建模回复:非线性曲线拟合的参数界限你好@eugur ,
我将向您展示如何在不使用 JSL 的情况下实现这一点,以便您理解整个过程的工作原理(除了起始部分)。因此,您应该首先生成一个公式列,该列将提供空白参数值,然后您可以更改这些参数值,以便在非线性平台中找到最适合您数据的拟合值。首先,您需要创建公式列(我在这里添加了一个简短的脚本,但您也可以手动创建):
dt=current data table();
dt<
<NEW column=""></NEW>
<P>准备就绪后,打开非线性平台,将公式列放入“X,预测器公式”角色中,将您感兴趣的 Y 值放入 Y 部分,然后点击“运行”。平台启动后,点击红色按钮,选择“参数边界”,并输入您想要使用的边界值。</P> <P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><span class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_0-1749874842390.png" style="width: 278px;"><img src="https://us.v-cdn.net/6038925/uploads/images/76921iB16E7281FC0917D7/Ben_BarrIngh_0-1749874842390.png" role="button" title="Ben_BarrIngh_0-1749874842390.png" alt="Ben_BarrIngh_0-1749874842390.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P> <P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="Ben_BarrIngh_1-1749874859915.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/76922i0E0E2181BA64F9AD/Ben_BarrIngh_1-1749874859915.png" role="button" title="Ben_BarrIngh_1-1749874859915.png" alt="Ben_BarrIngh_1-1749874859915.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P> <BR /> <P>然后,您可以使用“Go”运行非线性平台来获取使用这些边界估计的参数。</P> <BR /> <P>希望有帮助!</P> <P>谢谢,</P> <P>本</P> <BR /> <BR />
回复:非线性曲线拟合的参数界限嗨,本,
感谢您的回复,但我已经可以这样做了,这不是我想要的。正如我在帖子中提到的,我尝试拟合 1000 多个样本的数据点,这意味着要拟合 1000 多条曲线。因此,在非线性平台中,我还需要在“依据”部分使用“ID”列。(“分组”选项在“拟合曲线”中有效,但不知何故在这里不起作用)。
如果您有多个样本,则需要为每个样本手动执行您解释的操作(点击红色按钮,选择“参数界限”,并输入您希望使用的界限)。如果您只有几个样本,这可能没问题,但对于 1000 多个样本则不行。我要求的是能够一次性为所有 1000 多个样本设置参数界限和迭代次数。
回复:非线性曲线拟合的参数界限你好@eugur ,
如果您不使用分组术语,则设置的参数边界将针对所有 1000 多个样本进行全局设置(分组在非线性模型中不起作用的原因在于,分组本身必须集成到您提供给非线性模型的预测公式中)。您现有的脚本应该可以运行,但您无需在第二行运行“Go”,这就是为什么参数边界未添加的原因,因为平台在运行过程中无法进行任何更改。这里有一个示例,它使用“合并数据表”工具获取单个报告,以便轻松查看每个样本中的值是如何变化的。
dt=current data table();
id_no=N Items(Associative Array(dt:Batch)<
<GET keys=""></GET>
<BR /> <BR />
回复:非线性曲线拟合的参数界限对于具有许多曲线 ID 的情况,“拟合曲线”效果最佳,但如果您的拟合函数未包含在“拟合曲线”的预编程函数库中,则需要“拟合非线性”。
正如您所注意到的,“分组”在“非线性拟合”中的作用有所不同,在本例中您并不想使用它。我建议使用“按”对曲线进行分组。
I prefer using the following syntax for this. Could you try this and let us know if it works:</CODE></P>
<PRE><CODE class=" language-jsl">Nonlinear(
Y( :data ),
X( :data predictor),
By( :ID ),
Parameter Bounds(
asympt( 14, 22 ),
scale1( 0, 100 ),
decayrate1( -0.2, 0.1 ),
scale2( -100, 0 ),
decayrate2( -0.2, 0.1 ) ),
Iteration Limit( 10000 )
);
回复:非线性曲线拟合的参数界限谢谢本,
功能上可行。但我认为非线性平台使用了不同的求解器。几乎 50% 的拟合结果不可接受。
回复:非线性曲线拟合的参数界限你好,克里斯蒂安,
非常感谢您的回复。您说得对,“拟合曲线”似乎效果更好。我使用的拟合函数( 双指数 5P )包含在“拟合曲线”的预编程函数库中。但是,正如我之前提到的,对于相同的样本(5%),拟合结果非常奇怪,这就是我想尝试“拟合非线性”选项的原因。但即使设置了边界,“拟合非线性”也只能准确拟合大约50%的样本。
所以我的问题是:
- 是否可以添加拟合曲线的参数边界?
- 如果不是,是否可以使用与拟合曲线相同的求解器和设置来拟合非线性?
回复:非线性曲线拟合的参数界限你好@eugur ,你可以尝试扩大你的迭代限制,甚至考虑使用 SSE 网格来查看是否有可能为你的样本获得合适的参数值 - 你可能还想考虑从默认使用的“Netwon”选项运行不同的迭代。
50% 的结果单独失败的原因是,当使用所有样本时,对整体 SSE 模型拟合的影响会降低,因此单点导致失败的可能性会降低,而当仅分析一个单点时,失败的可能性更大。
回复:非线性曲线拟合的参数界限你好,eugur,
1) 据我所知,Fit Curve 不支持参数边界。2) Fit Curve 使用与非线性不同的算法,因此不能使用相同的求解器。
拟合曲线和拟合非线性表面上看起来很相似,但实际上它们在本质上却截然不同。非线性是一种传统的非线性最小二乘回归求解器。它具有最大的灵活性,但也需要最多的手动输入。与线性回归不同,非线性回归拟合具有不确定性,因此即使对于“相似”的数据集,也无法保证给定的一组初始猜测总是会收敛。这并非 JMP 独有;根据我的经验,大多数非线性求解器都需要偶尔进行手动“调整”,这使得批量处理数百个数据集成为一项有趣的挑战(但并非不可能!)。这正是 JMP 拟合曲线平台的用武之地。
拟合曲线 (Fit Curve) 是一个特例,它拥有一个小型的优化预设函数库。它没有使用完全通用的非线性回归求解器,而是为每个函数使用了专门为该函数编写的特殊算法。这使得它速度极快,并且更容易针对各种数据收敛。(我既不是软件开发人员,也不是数学家,所以请原谅我的非技术性解释,这只是我的基本理解!)。据我所知,拟合曲线不支持参数边界,可能是因为通常不需要它们。如果您发现您的情况需要参数边界,那么我们就可以重新使用非线性平台。Ben 提出了一些好主意,如果拟合曲线不起作用,还可以尝试使用非线性+脚本等其他方法——但我的建议始终是先尝试拟合曲线,如果仍然无效,则仅将拟合非线性作为备用选项。
以下是一些您可能感兴趣的链接:
设置参数限制的示例
拟合曲线模型的统计详细信息
非线性与拟合曲线会产生不同的结果吗? - JMP 用户社区
-基督教