生成对列表中的列求和的动态公式列所需的 JSL 代码大家好,
这个问题与一个帖子有关这里这很好地生成了一个非动态列来汇总其他列的列表。
我遇到的问题是,当您有一个包含 N 个其他列的列表并将其设为动态公式时,如何汇总这些列(使用 JSL)。
我的数据表中有一个列列表,比如 ColList,我想生成一个新列,其中包含一个简单地对 ColList 中的 N 项求和的公式。 我在想的是这样的:
Names Default to Here (1);
dt = Open("$Sample_Data/2D Gaussian Process Example.jmp");<BR />ColList = dt << Get Column Names;
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 代码你好@多发性硬化症,
非常感谢您的解决方案。 它适用于我正在使用的数据表。 我确实需要稍微修改一下,以说明我使用的许多数据表都有其他数据类型,所以我只需要考虑数值连续数据。 不管怎样,它都能正常工作并正确填写多元均值、标准偏差和 X 相关性。 如果重要的话,我正在使用 JMP 16 EA。
感谢您的帮助! 我还在原始请求的另一个线程中发布了有关相关矩阵的信息,这样人们就有希望从代码中受益以扩展到 N 维。
谢谢!,
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 代码你好@多发性硬化症,
我有一个相关的问题(因此不是另一篇文章),我希望您的脚本方法可以帮助解决。 跟帖子有关系这里. 我现在要做的基本上是将原始帖子中的内容从 4x4 相关矩阵概括为任意 NxN 矩阵,当“馈送”信息到配置文件中的模拟器时。
从另一个原始帖子中,有一个脚本可以生成 NxN 相关矩阵,并且可以根据您的输入生成一个“预测”列(其他 N 列的总和)。 我遇到困难的地方如下:调用 Simulator() 函数时,您需要传递以下内容:
模拟器(state=0|1, , )
因此,从另一篇原始文章中,传递正确的因子列表(“tpListY”)和相关矩阵(“corr.mat”)的解决方案,JSL 代码需要将 Eval Insert() 包裹在发送调用周围Simulator() 到 Profiler 报告,然后围绕它运行 Eval(Parse())。
现在的挑战是如何正确概括这一点,以便在调用 Simulator() 和定义因子时,您可以在该 ColList 上执行此操作。
ColList 可能是这样的:ColList = {A, B, C, D, ...} 并且每列 A, B, C, ... 都有相关的均值和标准差。
调用模拟器的正确语法是什么,以便它为每个因子插入正确的均值和标准偏差? 例子:
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 到 whatever 的平均值和标准偏差的向量。
无需明确写入每一列及其相应的平均值,我希望它更加自动化,以便它可以处理任意数量的列。
解决这个问题的好方法是什么?
我也遇到了 Eval(corr_mat) 实际上在 X Correlations 条目中输入相关矩阵值的问题。
附加的数据表和脚本应该有助于理解我正在尝试的内容。
谢谢!,
DS
更新,抱歉添加了错误的文件,现在有正确的数据表。
回复:生成对列表中的列求和的动态公式列所需的 JSL 代码你好@多发性硬化症,
这是一个完美的解决方案,谢谢! 我喜欢它的简单和优雅。
我确实不得不稍微更改我的代码,因为当列表的结构如下时,按照您的方式进行操作仍然存在问题:{“A”、“B”、“C”、...}。 但是,如果列表的结构类似于 {A, B, C, ...} 那么它就可以很好地评估表达式。 这两个列表的生成方式略有不同,引号确实使 Eval() 失效。
谢谢!,
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 ) ) );