使用配置列选择性地将规则应用于控制图你好,
我在使用 JSL 将适当的趋势规则或“测试”应用于控制图时遇到了问题。我的数据包括去年对某种产品的所有测量批次的多重分析结果。我处理的数据是堆叠格式,表格中有包含控制和规格限值的列,以及所有 8 个测试的 8 列。在测试列中,每行将有 1 或 0 来指示规则是否适用。我已在下面设置了一个类似格式的示例表以供参考。
| 批次编号 | 分析 | 结果 | 拼箱 | 伦敦大学学院 | 规则1 | 规则3 | 规则5 |
| A | X | 12 | 10 | 18 | 1 | 0 | 0 |
| A | Y | 204 | 200 | 215 | 1 | 0 | 1 |
| A | Z | 0.8 | 0.5 | 1 | 1 | 1 | 1 |
| B | X | 十三 | 10 | 18 | 1 | 0 | 0 |
| B | Y | 209 | 200 | 215 | 1 | 0 | 1 |
| B | Z | 0.7 | 0.5 | 1 | 1 | 1 | 1 |
| C | X | 15 | 10 | 18 | 1 | 0 | 0 |
| C | Y | 205 | 200 | 215 | 1 | 0 | 1 |
| C | Z | 0.8 | 0.5 | 1 | 1 | 1 | 1 |
在此示例中,对 3 个不同批次进行了 3 次不同分析。结果列对于每个批次的每次分析都是唯一的,但控制限值和趋势规则对于匹配分析是匹配的,因此对于分析 X,仅应适用规则 1,但对于分析 Z,应适用所有 3 条规则。我使用以下代码绘制了控制图,为了便于示例,对列名称进行了微小修改:
dt << Control Chart(
Sample Label( :Lot ),
Group Size( 1 ),
KSigma( 3 ),
By( :Analysis ),
Chart Col( :Result, Levey Jennings( Show Zones( 1 ), Shade Zones( 1 ), Test 1( :Rule1[1] ), Test 3( :Rule3[1] ), Test 5( :Rule5[1] ) ) ),
SendToReport(
Dispatch(
{},
"Levey Jennings of Result",
OutlineBox,
{Set Title("Parameter: "||char(:Analysis))}
),其余代码是 Dispatch 命令,用于添加参考线、调整框架大小等。这些代码部分没有问题,因此我省略了它们以简化说明。如上所示,在向 Levey Jennings 命令添加“测试 1”、“测试 3”和“测试 5”行时,我尝试引用来自相应配置列的第一行的值。这样,当脚本按分析绘制图表时,第一行将包含当前正在绘制的分析的趋势规则配置。但是,当我运行脚本时,它只会应用所有 3 条规则,无论它们是否应该应用于该特定参数。有人能帮我解释一下如何让 JMP 解析来自相应配置列的值并确定是否应该按分析将某条规则应用于每个图表吗?
我之前曾在拆分表中完成过这项工作,但我使用 for 循环创建一个字符串,并将值连接到该字符串中,然后使用 Parse 和 Eval 命令执行。如果可以避免,我真的不想在这里使用 for 循环,因为这就是我首先以堆叠格式提取数据的原因。
自动化和脚本数据探索与可视化回复:使用配置列选择性地将规则应用于控制图我运行了你的 JSL,做了 2 处修改
- 您指定了一个名为 Lot 的列,实际名称是 Lot ID
- 我删除了“发送报告”部分
Names Default To Here( 1 );
dt = Current Data Table();
dt << Control Chart(
Sample Label( :Lot ID ),
Group Size( 1 ),
KSigma( 3 ),
By( :Analysis ),
Chart Col(
:Result,
Levey Jennings(
Show Zones( 1 ),
Shade Zones( 1 ),
Test 1( :Rule1[1] ),
Test 3( :Rule3[1] ),
Test 5( :Rule5[1] )
)
);
代码运行并产生以下输出

为了验证指定的测试是否得到正确处理,我保存了控制图输出中的脚本
Control Chart(
SendToByGroup( {:Analysis == "X"} ),
Sample Label( :Lot ID ),
KSigma( 3 ),
SendToByGroup(
{:Analysis == "X"},
Chart Col(
:Result,
Levey Jennings( Show Zones( 1 ), Shade Zones( 1 ), Test 1( 1 ) )
)
),
SendToByGroup(
{:Analysis == "Y"},
Chart Col(
:Result,
Levey Jennings(
Show Zones( 1 ),
Shade Zones( 1 ),
Test 1( 1 ),
Test 5( 1 )
)
)
),
SendToByGroup(
{:Analysis == "Z"},
Chart Col(
:Result,
Levey Jennings(
Show Zones( 1 ),
Shade Zones( 1 ),
Test 1( 1 ),
Test 3( 1 ),
Test 5( 1 )
)
)
),
By( :Analysis )
);
从生成的脚本中可以看出,控制图收到了关于每个分析要运行哪些测试的信息
我在 Windows 11 上使用 JMP 18.1.0 运行了代码
我觉得没什么问题
回复:使用配置列选择性地将规则应用于控制图好的,我尝试完全按照您描述的方式进行复制。这是我运行的脚本。
Names Default to Here( 1 );
dt = Current Data Table();
dt << Control Chart(
Sample Label( :Lot ID ),
Group Size( 1 ),
KSigma( 3 ),
By( :Analysis ),
Chart Col(
:Result,
Levey Jennings(
Show Zones( 1 ),
Shade Zones( 1 ),
Test 1( :Rule1[1] ),
Test 3( :Rule3[1] ),
Test 5( :Rule5[1] )
)
)
);
但我的输出默认对每个分析都启用所有三条规则。这是 X 分析的脚本,根据配置列,它应该只应用测试 1。
Control Chart(
Sample Label( :Lot ID ),
KSigma( 3 ),
Chart Col(
:Result,
Levey Jennings(
Show Zones( 1 ),
Shade Zones( 1 ),
Test 1( 1 ),
Test 3( 1 ),
Test 5( 1 )
)
),
Where( :Analysis == "X" )
);
我在 Windows 11 上运行的是 JMP 17.0.0,所以也许这是我们版本之间的某个更新中解决的问题。在进行任何其他故障排除之前,我会通过我的 IT 部门了解更新情况。感谢您测试代码,我很高兴看到代码在原则上应该可以工作!
回复:使用配置列选择性地将规则应用于控制图我在 JMP 17 中复制了您的发现。下面是通过一次运行每个分析级别来获得所需结果的一种方法
Names Default To Here( 1 );
dt = Current Data Table();
Summarize( dt, byGroup = By( :Analysis ) );
For Each( {level}, byGroup,
dt << select where( :Analysis == level );
dtTemp = dt << Subset( selected columns( 0 ), selected rows( 1 ) );
Eval(
Eval Expr(
dtTemp << Control Chart(
Sample Label( :Lot ID ),
Group Size( 1 ),
KSigma( 3 ),
//By( :Analysis ),
Chart Col(
:Result,
Levey Jennings(
Show Zones( 1 ),
Shade Zones( 1 ),
Test 1( Expr( dtTemp:Rule1[1] ) ),
Test 3( Expr( dtTemp:Rule3[1] ) ),
Test 5( Expr( dtTemp:Rule5[1] ) )
)
)
)
)
);
);回复:使用配置列选择性地将规则应用于控制图这与我处理拆分表时实现这一点的方法类似,按列号循环并创建一个表达式,该表达式最终被解析为 JSL 并进行求值。我只是希望在使用堆叠表时避免使用 For 语句,并利用 By 和 Where 函数按分析进行分离。最终,这个 JMP17 代码仍然比我为拆分表开发的代码简单得多。再次感谢您的意见!我会尝试将其合并到我当前的脚本中,直到我能够升级到 JMP18。