提取预测公式,无需将公式保存到数据表<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我正在编写一个脚本来将一组广义线性模型拟合到数据,然后提取 AIC 等来进行模型平均。 由于 JMP 在广义线性模型的设计矩阵中对分类变量进行编码的方式(JMP 使用归零编码而不是角点编码),因此很难使用报告中报告的估计系数对预测进行平均建模。适合(其中一个类别从未显示,我需要进行大量编程才能重新创建它)。 看起来最简单的方法是简单地使用平台中的预测公式,然后将模型权重应用于一个大公式中的这些预测。
但是,据我所知,我需要将预测公式保存到每个模型的数据表中,然后我可以提取公式并保存以供其他地方使用,使用类似
模型拟合<<预测公式;
模型预测公式=字符(柱子(数据, “P(PA) 公式” ) <<获取公式()) ;
其中“P(PA) Formula”是预测公式。 然后,我可以将模型预测公式(以字符形式)保存在我的摘要 AIC 表中,并最终创建一个超级公式,它是各个公式的加权和......
但是,这会大大减慢脚本速度,因为预测是针对整个数据表计算的,并且我必须为每个模型拟合添加和删除列。
那么,有没有一种方法可以从模型拟合中提取实际的预测公式,而不必先将列保存到数据表中并让 JMP 实际进行计算?
谢谢
卡尔·施瓦茨
回复:提取预测公式而无需将公式保存到数据表从 JMP Pro 13.0 开始,有一种更简单的方法“从模型拟合中提取实际的预测公式,而不必先将列保存到数据表中,然后让 JMP 实际执行计算?”。 这正是“发布预测公式”及其变体的作用;模型拟合生成的公式直接存储在名为的新 JMP 平台中配方仓库。 从那里,您可以将其应用到其他(兼容)表,生成用于部署的评分代码(采用多种编程语言),并启动 JMP 平台,例如分析器和模型比较。 最后一个有一个模型平均命令,我相信它实现了创建集成的最终目标。
不幸的是,尚未为您正在使用的广义线性模型平台添加“发布”命令。 但它可用于许多其他预测建模平台 - 神经、分区、标准最小二乘等。
回复:提取预测公式而无需将公式保存到数据表是的,要评估 dt,它只是
dt;或者如果你想变得更奇特,eval(dt);
open 函数可以接受几个不同的参数。 在很多情况下,参数的顺序并不重要,但在本例中却很重要。 inset into 添加到函数中参数列表的末尾,除非您指定它应该按特定顺序与我在这里没有使用的第三个参数一起使用。
当然,这可能看起来很奇怪,但它非常方便。
通过将 open 语句包装在表达式中,我可以在计算之前添加或删除参数。
insert into 本质上添加了“,invisible”,只不过它不是必须解析的字符串。
insert into 添加了 invis 的内容,稍微有点扭曲,如果我只是插入 invis,那么它会插入评估的 invis,我不希望这样,所以我将 invis 包装在“name expr”中。name expr(invis) 将被评估为“不可见”,并且它添加了公共作为分隔符。因此 name eval 添加表达式的文本,但它从来都不是文本。不幸的是,我越试图解释这一点,听起来就越糟糕。
在 JSL 中,您基本上可以从空函数的表达式开始,然后用您需要的所有部件填充它。
回复:提取预测公式而无需将公式保存到数据表整洁......但我真的不明白“插入”如何知道将“invis”表达式插入到“dt”表达式中的位置。 我猜 Expr “parsea” 是创建某种树的表达式,然后“插入”只是将“invis”参数添加为树中的另一片叶子?
我对如何将参数传递给 JMP 中的函数没有足够的了解。 我来自 R 背景,它要么是位置的,要么是参数=值的,并且发现 JMP 在 Open() 函数中使用 Invisible 之类的东西有点奇怪,因为它不是字符串)。 对于这种调用函数的方式有什么好的参考吗?
我还没有尝试过,但我假设您需要计算表达式“dt”以打开实际的数据表。
回复:提取预测公式而无需将公式保存到数据表略有不同,并且没有解析
运行静音= 1 ;
隐形=表达式(无形的) ; //这不是字符串或列表,并且不会对其进行求值
dt =表达式(打开( “$SAMPLE_DATA/大类.jmp” ) ) ;
如果(运行静音== 1 , 我插入到( dt ,名称表达式(隐形) ) ) ; //使用Name Expr返回表达式的符号而不对其求值。
回复:提取预测公式而无需将公式保存到数据表感谢您的建议... 我也想出了
// 下面的 runsilent 标志对于调试很有用。 将其设置为 0 以使所有内容都可见。 1 安静地运行
运行静音= 0 ;
评估(解析( "data = Open( \!"SPPI_ Data_JMP_Revised.jmp\!""||如果(运行静音, “,\!“无形的\!”” , ” ” ) || “);” )) ;
请注意,我必须在“,invisible”字符串中包含逗号,以创建一个在 runsilent=0 时有效的表达,以避免调用中出现“空”参数。
卡尔.
回复:提取预测公式而无需将公式保存到数据表Invisible 是一个关键字,所以设置为参数并不那么容易。我通常只使用 IF 语句:
我的分布=功能({ dt ,坳,做隐形} , {默认本地} ,
如果(做隐形,
dt <<分配(无形的,柱子(评估(坳) ) )
,
dt <<分配(柱子(评估(坳) ) )
)
) ;
dt =打开( “$SAMPLE_DATA/大类.jmp” ) ;
我的分布( dt , “高度” , 1 ) ;
如果您想将其设置为参数,您可以将命令构建为字符串,然后解析并执行它:
我的分布=功能({ dt ,坳,做隐形} , {默认本地} ,
如果(做隐形,
关键词= “无形的”
,
关键词= ””
) ;
评估(解析(评估插入物( “\[
dt << 分布( ^关键字^, 列( "^col^" ) )
]\" ))) ;
) ;
dt =打开( “$SAMPLE_DATA/大类.jmp” ) ;
我的分布( dt , “高度” , 1 ) ;
回复:提取预测公式而无需将公式保存到数据表拟合的报告从未出现在屏幕上,但我从未明确使报告不可见。 我看到有一个“隐形”选项可以启动适合......
当我在平台启动时指定不可见选项时,时间从 45 秒减少到 30 秒。
原始数据表是可见的(其中依次保存了预测公式),最终的汇总数据表(其中依次添加了每个模型拟合的结果)也是可见的。 我尝试使原始数据表不可见,即使添加/删除预测列,这也确实加快了速度(现在降至 15 秒)。
最终结果表是连续建立的,因此我可以看到连续添加的行。 并且将其隐形,并将时间再次缩短至8秒!
因此,瓶颈似乎在于处理屏幕操作,而不是 CPU 时间。
现在修改后的时间(在最终加速的脚本上)是
56% 模型拟合
13% 生成模型报告
12% 关闭模型报告(即使它是看不见的?)
当查看我的日志时,我的行
模型拟合<<预测公式;
触发了有关缺少布尔运算符的警告消息。 如果我把它切换到
模型拟合<<预测公式(1) ;
该脚本仍然运行良好,没有警告消息。 但是,我似乎在 JSL 语法参考或脚本指南中找不到任何关于什么是
模型拟合<<预测公式(0) ;
会做? 我将尝试编写一个小脚本,看看后者是否也不会评估预测公式。
我现在正在尝试修改脚本,以便可以动态设置“不可见”选项。 我想做类似的事情
运行沉默=1;
data << open("blah", if(安静地运行, "Invisible"));
但 JMP 总是在那一点停止...... 当需要“硬连线”代码字时,我总是遇到如何使消息动态化的问题。 回到书本上......
卡尔.
回复:提取预测公式而无需将公式保存到数据表关于时间安排,您是否尝试过使报告窗口“不可见”。 只是好奇这是否会影响您上面 23% 的数字。
回复:提取预测公式而无需将公式保存到数据表谢谢伊恩和戴夫。 我在 ShowProperties 树中的任何位置都找不到预测公式,因此我猜想在保存列操作请求之前不会计算它。
我在抑制公式求值和不抑制公式求值的情况下尝试了我的脚本。 在不压制公式的情况下,花了45秒。 压制公式花了 44 秒。 我想我错误地假设与实际模型拟合相比,公式评估花费了大量时间,从报告中提取信息并将信息保存到新的(摘要)数据表中。
我没有想到要尝试分析脚本。 我刚刚做了这个。 这是结果
11% 的时间花在拟合模型上
13% 的时间花在创建报告上
47% 的时间花在删除用于每个模型进行预测的列上,使用:数据 << 删除列("P(PA) 公式");
在我使用以下命令从中提取信息后,有 23% 的时间花在关闭报告窗口上: modelreport << 关闭窗口;
我发现这很令人惊讶!
卡尔
回复:提取预测公式而无需将公式保存到数据表FWIW,我认为戴夫可能是对的。 有“<<获取估计值”和“<<获取方差分量”消息,但它们并不总是可用(取决于拟合的性质)。 在您的具体情况下可能值得使用“ShowProperties()”来查看。
回复:提取预测公式而无需将公式保存到数据表我不确定是否有办法做你想做的事。我采取的方法是在保存预测公式之前抑制公式计算:
dt << 抑制公式 Eval(1)