生成动态公式列所需的JSL代码,该公式汇总列表中的列大家好,
这个问题与职位有关这里很好地生成了一个非动态列,用于汇总其他列的列表。
我遇到的问题是,当您有N个其他列的列表并将其设为动态公式时,如何总结这些列(使用JSL)。
我在数据表中有一个列列表,例如ColList,我想用公式将新的列生成,该公式仅将ColList中的N个项目相加。 我在想的是这样的:
Names Default to Here (1);
dt = Current Data Table();
dt << New Column("Sum", Formula(Sum(ColList)));这显然不起作用,因为ColList是列列表:ColList = {“ col1”,“ col2”,...,“ colN”}。 我试图制作一个字符串,并使用Eval(Parse())和Eval Insert()像这样:
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));
Eval(Parse(str));但是仍然没有运气。 JSL代码将使用公式生成列,但行值为空,因为它仍在公式中显示Eval(ColList)而不是实际的公式,该公式应类似于:Sum(:col1,:col2,: col3,...,:colN)。
从列列表{“”}到对冒号:的列的引用,我无法弄清楚我在做什么。
任何帮助深表感谢。
谢谢!,
DS
分析工具数据表脚本编写回复:生成动态公式列所需的JSL代码,该公式汇总列表中的列有几种方法可以做到这一点。 我更喜欢使用EvalExpr()为所需的表达式创建一个变量,然后使用NameExpr()将(未求值的)表达式转换为Formula()参数。
Names Default To Here( 1 );
dt = Open( "$Sample_Data/2D Gaussian Process Example.jmp" );
ColList = dt << Get Column Names;
F = Eval Expr( Sum( Expr( ColList ) ) );
dt << New Column( "Sum", Formula( Name Expr( F ) ) );
回复:生成动态公式列所需的JSL代码,该公式汇总列表中的列你好@小姐,
那是一个完美的解决方案,谢谢! 我喜欢它是如此简单和优雅。
我确实需要稍微更改代码,因为当列表的结构像{{A“,” B“,” C“,...}时,按照您的方式进行操作仍然会遇到问题。 但是,如果列表的结构类似{A,B,C,...},那么它对表达式的求值就很好。 这两个列表的生成略有不同,引号实际上使Eval()无效。
谢谢!,
DS
回复:生成动态公式列所需的JSL代码,该公式汇总列表中的列你好@小姐,
我有一个相关的问题(因此没有其他文章),我希望您的脚本方法可以为您提供帮助。 它与职位有关这里。 我现在想要做的基本上是将信息“馈送”到配置文件中的Simulator时,将原始文章中从4x4相关矩阵到任意NxN矩阵的内容概括化。
在其他原始帖子中,有可以生成NxN相关矩阵的脚本,并且可以从您的输入中生成“预测”列(其他N列的总和)。 我遇到困难的地方如下:调用Simulator()函数时,您可以通过以下方法进行传递:
Simulator(状态= 0 | 1,<因子(列<< Random()|固定的|(常数)| Expression()| Multivariate())>,<响应(列)<<无噪声|添加随机噪声|添加随机加权噪声|添加多元噪声),X相关(状态= 0 | 1,{factor1,factor2,...,factorN},[NxN相关])>)
因此,从另一篇原始文章中,可以找到传递正确的因子列表(“ tpListY”)和相关矩阵(“ corr.mat”)的解决方案,该JSL代码需要将Eval Insert()包裹在要发送的调用周围将Simulator()添加到Profiler报告中,然后围绕它运行一个Eval(Parse())。
现在的挑战是如何正确地对此进行概括,以便在调用Simulator()并定义因子时,可以在该ColList上进行此操作。
ColList可能类似于:ColList = {A,B,C,D,...},并且每一列A,B,C,...都有相关的均值和标准差。
调用Simulator的正确语法是什么,以便它为每个因子插入正确的均值和Std Dev? 例子:
sim_design = Profiler(Y(:Pred), Invisible);
new = Eval Insert(
"sim_design << Simulator(
1,
Factors(
:A << mutlivariate(Mmean[1], MSD[1])),
:B << mutlivariate(Mmean[2], MSD[2])),
:C << mutlivariate(Mmean[3], MSD[3])), //etc. for the N columns in the made up table.
),
X Correlations(
1,
Eval(ColList),
Eval(corr_mat)
),
NRuns(1e6)
);");
Eval(Parse(new));根据原始数据表,使用用于生成相关矩阵(corr_mat)的列数(N)进行第二次模拟。 该模拟表是对各列求和以构成:Pred列的表,该列用作要发送到Profiler的伪函数。 变量Mmean和MSD是包含N列A的平均值和标准偏差的向量。
无需显式地编写每列及其对应的均值,我想使它更加自动化,以便它可以处理任意数量的列。
什么是解决这个问题的好方法?
Eval(corr_mat)在X Correlations条目中实际输入相关矩阵的值时,我也遇到了麻烦。
随附的数据表和脚本应有助于了解我的尝试。
谢谢!,
DS
更新,抱歉添加了错误的文件,现在具有正确的数据表。
回复:生成动态公式列所需的JSL代码,该公式汇总列表中的列这是一种方法。 首先迭代地构建Factors(),然后在第二步中制作完整的Simulator()表达式,其中包括X Correlations()的评估参数。
// Iteratively build the Factors expression
fs = Expr( Factors() );
For( i = 1, i <= N Items( ColList ), i++,
Insert Into(
fs,
Eval Expr( Expr( collist[i] ) << multivariate( Expr( MMean[i] ), Expr( MSD[i] ) ) )
)
);
// Make the complete Simulator expression
sim = Eval Expr(
sim_design << Simulator(
1,
Expr( Name Expr( fs ) ),
X Correlations( 1, Expr( ColList ), Expr( corr_mat ) ),
N Runs( 1e4 )
)
);
// Name Expr( sim ) // Run this line to show the expression in the log
// Launch Profiler and run the Simulator expression
sim_design = Profiler( Y( :Pred ) );
sim;
但是,X相关矩阵似乎(在大多数情况下)被忽略了。 报告中只有零。
同样,当在探查器中手动输入相关性并保存并运行脚本时,相关性也会丢失。 即使它们保存在已保存的脚本中。 不知道为什么。
回复:生成动态公式列所需的JSL代码,该公式汇总列表中的列你好@小姐,
非常感谢您的解决方案。 对于正在使用的数据表来说,它工作得很好。 我确实需要做一些修改,以考虑到我使用的许多数据表都具有其他数据类型这一事实,因此我只需要考虑数字连续数据。 无论如何,它可以正常工作,并且可以正确填写多元方法,std devs和X Correlations。 如果这很重要,我正在使用JMP 16 EA。
谢谢你的帮助! 我还在原始请求的另一个线程中发布了有关相关矩阵的信息,以便人们希望可以从代码中受益,并将其扩展到N个维度。
谢谢!,
DS