我正在尝试创建一个脚本来捕获非线性模型拟合的结果并将其输出到图表中。 该数据集是随着时间的推移连续捕获的,我在其中安装了非线性模型(见附图)。 我有 12 个不同的样本,如果你想向下滚动的话,我有相同的图表。
但是,我想以一种方式报告图表,以便我可以看到仅与第 0、1、2、3、4、5 等天对应的行捕获的数据,直到 21 天,而不干扰曲线通过样本建立模型。 在这种情况下,我希望将实验数据作为散点图数据,将模型作为连续曲线数据或平滑曲线
我该怎么做呢?
图表生成器似乎没有与第一个挑战同时绘制实验数据和模型。
我的理由是,我可能会使用某种数据过滤器,每当我调用脚本时都可以应用该过滤器,而不会干扰模型列。 我是否需要使用 12 个样本中每个样本的新参数估计值创建一个特定于模型的新数据表,然后调用图形生成器?
我还尝试使用 JMP 菜单选项卡上的图形/旧版/叠加图。 这似乎同时绘制了数据和模型曲线,但在这种情况下,我意识到在我接受并保存每个样本的参数估计值后,JMP 并未将参数估计值单独应用于模型列上的每个样本。 在这种情况下,模型公式仅使用为数据表中首先出现的样本估计的参数,并将这些参数用于后续样本。
然后,我是否需要创建一个新的数据表,该数据表使用模型公式使用确定的参数估计值生成 12 列,以便能够将每个样本的模型和实验数据绘制在一起?
我希望这一点很清楚。 我可以上传数据表等的屏幕截图
我正在尝试编写一个脚本,为新参数估计打开一个新列。
运行非线性拟合后,我得到了估计值和误差。 然后,我只保留感兴趣的数据表,并尝试以某种方式获取感兴趣的值,以便在具有相同模型公式的新列中使用。 这个想法是根据估计指定模型参数。
我需要一些帮助,因为我不知道这是否是正确的方法,或者我是否需要使用其他功能。 下面的脚本可能有点复杂,但这可能是因为我几乎没有编程经验。 脚本显然有效
@马克贝利写道:
我现在正在教学,所以我不能自由地检查,但非线性可能会为您保存具有不同参数集的公式。 Match() 函数在这里很有用。 您对组进行匹配并为每个结果复制模型,但为每个组应用唯一的参数估计值。 它变成了某种分支。 就像某些语言中的 CASE 语句一样。
直到粗体部分:
col9 = 新列(“模型”);
col9<< 设置公式 (参数({Y1_Y1_0 = 0.2, K1_K1_0 = 0.01, P1_P1_0 = 0.004, Y2_Y2_0 = 0.15, K2_K2_0 = 0.06, P2_P2_0 = 0.3}, If(:天数>0, (Y1_Y1_0 * Exp(-Exp(( (K1_K1_0 * Exp()) / Y1_Y1_0) * (P1_P1_0 - :天))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp())) / Y2_Y2_0) * (P2_P2_0 - :天)))),0 )));
col10=newcolumn("错误");
col10<< 设置公式((:平均值 - :模型) ^ 2);
col10<<评估公式;
col10<<获取公式;
obj = 非线性(Y(:平均), X(:模型), 损失(:Err), 迭代限制(5000), By(:样本));
obj << 去;
//返回向量列表,其中每个向量包含参数估计
obj << 获取估计值;
//另请参阅获取 SSE、获取参数名称、获取 CI
//或者,制作一个表
_xx = obj << Xpath("//OutlineBox[@helpKey='非线性解']");
//只有2个组,所以只找到2个;每个包含两个子表
fit_dt = (_xx[1]< est_dt = (_xx[1]< fit_dt << set Name("非林拟合错误");
est_dt << set Name("非林拟合估计");
名称默认为此处( 1 );
DontClose = {"dt4", "非林拟合误差", "非林拟合估计"}; // 要离开的表的示例名称
// 向后循环列表,因此表号不会改变
For( i = N 表(), i >= 0, i--,
If( 包含( DontClose, 数据表( i ) << 获取名称 ),
继续(),
关闭(数据表(i),“不保存”)
)
);
dt = 数据表(“非林拟合估计”);
dt2<
myList=:估计<<获取值
dt0 = 数据表(“dt4”);
dt0<< New Column("按样本拟合模型");
col11="按样本拟合模型";
col11 << 设置公式 (参数({Y1_Y1_0, K1_K1_0, P1_P1_0, Y2_Y2_0, K2_K2_0, P2_P2_0}, If(:Days>0, (Y1_Y1_0 * Exp(-Exp(((K1_K1_0 * Exp())) / Y1_Y1_0) * ( P1_P1_0 - :天))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp()) / Y2_Y2_0) * (P2_P2_0 - :天)))),0), 设置属性("预测", {:平均, Creator("非线性")}), By (:Sample)));
对于每一行(col11=设置公式(Match(“参数”,“估计”)));
col11<<评估公式;
col11<<获取公式;
有什么建议么?
我现在正在教学,所以我不能自由地检查,但非线性可能会为您保存具有不同参数集的公式。 Match() 函数在这里很有用。 您对组进行匹配并为每个结果复制模型,但为每个组应用唯一的参数估计值。 它变成了某种分支。 就像某些语言中的 CASE 语句一样。
不,不要使用宽格式(响应保存在十几个数据列中),而是使用高格式(响应保存在一列中并使用第二列来识别样本)。 现在,在大多数平台的“按”角色或“非线性”或“绘制曲线”平台中的“组”角色中使用样本 ID。