参数按类别扩展的非线性回归<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 呢? 使用什么算法?
谢谢
比诺伊
回复:参数按类别扩展的非线性回归在杰夫·珀金森指出了一个与你想要做的类似的例子之后,我想对我之前的回复进行补充。 我们不清楚您是否真的需要一个脚本来制作您需要的模型公式。 选择帮助>样本数据库, 打开非线性示例文件夹,最后打开米切尔利希藻类数据表。 打开公式编辑器与米切尔利希柱子。 它应该看起来像这样:

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

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

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

现在,我需要在 JSL 中对此进行编码。
我知道我们可以执行以下操作来获取所有四个唯一参数:
dt << 新列("模型", 数值, 连续, 公式( 参数( {B = 5, beta = 0.25, P = 10, R0 = 10}, R0 / (1 + B * (:Name( "tRelax( s)" ) / :Name( "tStress(s)" )) ^ beta) + P )));
然而这不是我想要的。 我不想使用“分组”功能,因为它只有在提取是独立的情况下才有帮助。
我复制公式时生成的代码如下所示:
范围(
{B = 2,贝塔 = 0,
名称(“R0_类别_D03_01_-1.8_100”)= 2,
名称(“R0_类别_D03_01_-1.8_1000”)= 3,
名称(“R0_类别_D03_01_-1.8_10000”)= 3,
名称(“R0_类别_D03_01_-1.8_158”)= 3,
名称(“R0_类别_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 * (:名称( "tR" ) / :名称( "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 创建关联数组并在公式中使用它们,但没有成功。
当然,在创建此公式后,我需要对列和数据运行非线性回归拟合。
有人可以帮我编码吗?
谢谢
比诺伊
回复:参数按类别扩展的非线性回归比诺伊,
要了解模型的拟合情况以及拟合背后的统计数据,最好的地方是“书籍”>“专业模型”下的“帮助”部分。非线性拟合从第 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 组系数的模型。
[图片缺失]