按类别扩展参数的非线性回归<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好
我有一个需要使用非线性模型拟合的数据集,其中包含四个拟合参数 A、B、C 和 D。 数据集(Y,列)需要使用作为列的“类别”进行分隔。 因此,每个唯一“类别”的 Y 是一组唯一的数据。
我需要拟合所有数据并找到参数 A、B、C、D,条件是我需要所有“类别”中的所有数据集的唯一 C 和 D,而 A、B 可能因“类别”而异。
为此,我为模型创建列并创建参数 C、D 并为 A 和 BI 创建参数并选中“扩展至类别,选择列”,然后为该列选择“类别”并进行非线性回归拟合. 我得到了所有类别的最佳 C 和 D 以及不同类别的不同 A 和 B。
我的问题是:它如何在所有类别中找到唯一的 C 和 D? 它是否适合每个数据集对应的数据集,并为每个数据集找到 C1、D1、C2、D2 等,然后取中位数/平均值或其他?
或者它是否找到 C 和 D 值的范围并在 C 和 D 内创建精细点并再次拟合所有数据集并越来越精细直到误差在限制范围内?
我需要知道方法,因为我想确定我正在做我需要做的事情。
谢谢
比诺伊
回复:按类别扩展参数的非线性回归抱歉耽搁了。 我以为我们完了!
我以前的帖子显示了一个常见的公式乙和测试版和条件参数类别水平。 你还需要什么? 我第一个回复中的脚本会自动构建这样一个公式。 从模型的角度来看,我无法理解您可能还需要什么。
你问的是如何非线性平台解决了这样的问题(估计参数)? 它使用一个数值优化程序和一个损失函数监视。 它使用给定的起始值然后改变它们以改善损失函数的结果(最小化)。 默认损失函数是误差平方和, 或者最小二乘.它监控多种变化措施,以确定何时收敛达到并停止。
回复:按类别扩展参数的非线性回归你好,
我问过的这个问题有什么更新吗?
谢谢
比诺伊
回复:按类别扩展参数的非线性回归你好,
我确实知道这种手动操作的方法。 我知道手动操作很容易。 但是,我需要将我的脚本自动化为更大系统的一部分,因此是必要的。
感谢您的时间和精力。
比诺伊
回复:按类别扩展参数的非线性回归出色的!!! 像魅力一样工作。 这就是我之前帖子的答案(与原始帖子略有不同。)
感谢您的时间和脚本。
现在是奖金问题(实际上是我最初的问题
在这个非线性回归拟合中,我们有 2 个参数 B 和 beta,它们对于所有类别都保持不变,而 P 和 R0 在它们之间变化。 现在我们没有通过任何方程来指定 B 和 beta 如何在类别之间变化,那么 JMP 如何找到适用于所有类别的最佳 B 和 beta? 使用的算法是什么?
谢谢
比诺伊
回复:按类别扩展参数的非线性回归在 Jeff Perkinson 指出一个与您想要做的类似的示例之后,我想添加到我之前的回复中。 我们不清楚您是否真的需要一个脚本来制作您需要的模型公式。 选择帮助>示例数据库, 打开非线性示例文件夹,最后打开藻类 Mitscherlich数据表。 打开公式编辑器与米切尔利希柱子。 它应该如下所示:

在这种情况下,就像你的情况一样,2个参数α和测试版有条件的治疗.
我打开我创建的数据模型并选择科尔斯>新列... 我会叫它模型并添加一个公式列属性。 我将在使用它们制作模型公式之前创建参数。 我点击表格列在左上角并选择参数. 我点击新参数。 ..并输入乙为名称并给它一个起始值2 ,然后单击好的. 我创造测试版= 0以同样的方式。 这乙和测试版参数是无条件的,它们的值对所有类别都是通用的。
其他两个参数不同。 我点击新参数, 进入R0为了名字, 2为起始值,然后选择展开分类,选择列. 我点击好的然后选择类别柱子。 现在我有一个独特的参数R0对于每个类别。 我做同样的事情磷范围。
我现在构建公式,在参数列表和表列列表之间切换以制作此公式:

当我单击参数列表中的分组参数时,编辑器会自动插入 Match(...) 表达式。 所以现在每个类别都有一个 B,一个 beta,以及一个 R0 和 P。
使用这种方法与第一个示例藻类导致这个公式:

该模型使用非线性生成与原始参数化完全相同的估计。
请理解,我们可能误解了您的问题。 脚本很强大,但并不总是必要的。
回复:按类别扩展参数的非线性回归我使用了三个原则来解决这个问题。 现在看起来很容易,但在我做对之前有一些混乱的错误开始。 我对模型公式进行了逆向工程,将问题分解为更小的问题,并从内到外构建了解决方案。 它假定存在三个具有给定名称的数据列。 如果列名在运行之间发生变化,您将不得不添加一个自定义对话框。但它确实可以容纳任意数量的类别。 我不知道当您拥有大量类别时,Nonlinear 是否能够解决模型。此外,您可能需要准备一个起始值列表并使用我的示例来使用唯一值。
我没有您的数据表,但我认为您拥有的模型(类别、rRelax、tStress 列)有效。
/* 假设这些列存在或制作自定义对话框以将它们分配给脚本变量:
类别
放松
压力
*/
// 查找所有类别
类别# = :类别<<获取值;
// 用表达式从内到外构建公式
匹配表达式 p# =匹配 expr r0# =表达式(匹配( :类别) ) ;
参数列表# =列表(乙= 2 ,测试版= 0 ) ;
// 遍历所有类别
为了( C = 1 , C <= N 项(类别# ) , C ++,
// 制作特定类别的 R0 参数
评估(
解析(
代替(
“插入(参数列表#,Expr(名称(\!“R0_ccc\!” ) = 2))" ,
“cc” ,
类别# [ C ]
)
)
) ;
插入(匹配 expr r0# ,类别# [ C ] ) ;
评估(
解析(
代替(
“插入(匹配 expr r0#,Expr(名称(\!“R0_ccc\!” )))” ,
“cc” ,
类别# [ C ]
)
)
) ;
// 制作特定类别的 P 参数
评估(
解析(
代替(
“插入(参数列表#,Expr(名称(\!“P_ccc\!” ) = 2))" ,
“cc” ,
类别# [ C ]
)
)
) ;
插入(匹配表达式 p# ,类别# [ C ] ) ;
评估(
解析(
代替(
“插入到(匹配 expr p#,Expr(名称(\!”P_ccc\!” )))” ,
“cc” ,
类别# [ C ]
)
)
) ;
) ;
//代入通用模型公式
公式表达式# =代替(
表达式(范围( lll , rrr / ( 1 +乙* ( :放松/ :压力) ^测试版+公私合营) ) ) ,
表达式( lll ) ,
参数列表# ,
表达式( rrr ) ,
名称表达式(匹配 expr r0# ) ,
表达式(公私合营) ,
名称表达式(匹配表达式 p# )
) ;
// 设置模型列公式
评估(
代替(
表达式(当前数据表() <<新列( “模型” ,公式( fff ) ) ) ,
表达式( fff ) ,
名称表达式(公式表达式# )
)
) ;
回复:按类别扩展参数的非线性回归你好,
谢谢回复。 我确实通过了手册。 仍然无法得到我想要的东西。
我现在正在尝试编写这种非线性拟合并面临一些问题。 需要一些帮助。 我在这里重申这个问题:
我有需要由具有 4 个拟合参数的模型拟合的数据。 每个类别的拟合不是彼此独立的。 上面帖子中显示的拟合参数中的 2 个 B 和 beta 需要是唯一的,即回归拟合为所有类别提取唯一的 B 和 beta。 而其他两个参数 P 和 R0 可能因类别而异。
JMP 界面如下所示:

现在,我需要在 JSL 中编写代码。
我知道我们可以执行以下操作来获取所有四个唯一参数:
dt << New Column("Model", Numeric, Continuous, Formula( Parameter( {B = 5, beta = 0.25, P = 10, R0 = 10}, R0 / (1 + B * (:Name("tRelax( s)" ) / :Name("tStress(s)" )) ^ beta) + P )));
然而,这不是我想要的。 而且我不想使用“分组”功能,因为它只有在提取是独立的情况下才有帮助。
我复制公式时生成的代码如下所示:
范围(
{B = 2, 贝塔 = 0,
名称(“R0_Category_D03_01_-1.8_100”)= 2,
名称(“R0_Category_D03_01_-1.8_1000”)= 3,
名称(“R0_Category_D03_01_-1.8_10000”)= 3,
名称(“R0_Category_D03_01_-1.8_158”)= 3,
名称(“R0_Category_D03_01_-1.8_1580”)= 3,
名称(“P_Category_D03_01_-1.8_100”)= 0,
名称(“P_Category_D03_01_-1.8_1000”)= 1,
名称(“P_Category_D03_01_-1.8_10000”)= 1,
名称(“P_Category_D03_01_-1.8_158”)= 0,
名称(“P_Category_D03_01_-1.8_251”)= 0},
Exp( -B * (:Name( "tR" ) / :Name( "tS" )) ^ beta ) *
匹配(:类别,
“D03_01_-1.8_100”,名称(“R0_Category_D03_01_-1.8_100”),
“D03_01_-1.8_1000”,名称(“R0_Category_D03_01_-1.8_1000”),
“D03_01_-1.8_10000”,名称(“R0_Category_D03_01_-1.8_10000”),
“D03_01_-1.8_158”,名称(“R0_Category_D03_01_-1.8_158”),
“D10_05_-2.6_6310”,名称(“R0_Category_D10_05_-2.6_6310”)
) + 匹配( :类别,
“D03_01_-1.8_100”,名称(“P_Category_D03_01_-1.8_100”),
“D03_01_-1.8_1000”,名称(“P_Category_D03_01_-1.8_1000”),
“D03_01_-1.8_10000”,名称(“P_Category_D03_01_-1.8_10000”),
“D03_01_-1.8_158”,名称(“P_Category_D03_01_-1.8_158”),
“D10_05_-2.6_6310”,名称(“P_Category_D10_05_-2.6_6310”)
)
)
我需要自动化这个,所以不能按原样使用它。
我可以从“类别”列中为 P_XXX 和 R0_XXX 创建数组。
我正在考虑为每个 P 和 R0 创建关联数组并在公式中使用它们,但没有成功。
当然,在创建此公式后,我需要对列和数据运行非线性回归拟合。
有人可以帮我编码吗?
谢谢
比诺伊
回复:按类别扩展参数的非线性回归比诺伊,
了解模型拟合的好地方以及拟合背后的统计数据位于 Books > Specialized Models 下的 Help 部分。非线性拟合从第 105 页开始。Michael Anderson 对拟合分组的建议还将显示各个类别的拟合程度,您还将看到组合拟合的图表。帮助中的一个示例如下所示。您也可以使用自己的参数集,这在第 7 章中进行了说明。统计部分从第 7 章的第 152 页开始。

回复:按类别扩展参数的非线性回归你好,
谢谢回复。
要更清楚。 我知道一种方法来做我想做的事。 我想知道它是如何完成的。
在下面显示的示例中,B 和 beta 对应于问题中提出的 C 和 D,而 P 是像 A 或 B 一样的参数,可以在不同类别中变化。
下面是正在完成的拟合的屏幕截图,其中 B 和 beta 作为所有类别的参数保持不变,而 P 是一个可以在不同类别中变化的参数。
问题是它如何在所有类别中获得最好的 B 和 beta? 它最初是否为每个类别找到不同的 B 和 beta 并进行一些统计以获得对所有类别都足够好的最佳 B 和 beta? 如果是这样,使用的统计数据是什么。
谢谢
比诺伊

回复:按类别扩展参数的非线性回归听起来您想在非线性平台中使用分组变量。将您的 X 和 Y 变量放入平台的相应字段中,然后将“类别”列放入“组”字段中。之后,当您拟合模型时,它将计算每个组的结果。因此,如果您有 4 个类别,您将获得 4 个具有 4 组 fo 系数的模型。
[缺少图像]