在技术支持中,我们经常收到有关在 JMP 的实验设计平台中使用因子约束的问题。三种选项(线性约束、不允许的组合过滤器和不允许的组合脚本)可以限制您的设计空间。但是,有时用户会联系我们,报告说最终的设计不符合他们定义的约束。
这篇博文将专门介绍不允许组合脚本的使用,我们通常会引导用户使用它,因为它比不允许组合过滤器更方便用户使用。线性约束选项相当简单,但你可以找到有关它的指导这里如果需要的话。
不允许的组合脚本选项允许您使用 JSL 脚本定义设计空间的限制。要记住的关键方面是指定哪些因子水平组合是不是设计中允许的。输入的 JSL 脚本必须作为布尔表达式进行计算。当表达式为真时,它不允许在设计中出现该组合。脚本不必是线性形式,因此还有能够指定非线性约束的额外好处。您也可以使用函数(指示函数可能特别有用,如本文后面的一个示例所示)。
不允许的组合脚本可以与连续、离散数字和分类因子结合使用,但不支持混合或阻塞因子。在混合场景中定义限制的替代方法将在后面的示例中描述。
在表达式中,连续和离散数值因子的水平通过其数值引用。分类因子的水平可以通过其关联的序数值(1、2、3 等)或命名的水平值引用。
考虑具有两个连续因子、一个四级离散数字因子和一个三级分类因子的定制设计。
使用上面描述的因素重现起始 DOE 对话框的脚本是:
DOE(
Custom Design,
{Add Response( Maximize, "Y", ., ., . ),
Add Factor( Continuous, -1, 1, "X1", 0 ),
Add Factor( Continuous, 100, 105, "X2", 0 ),
Add Factor( Discrete Numeric, {10, 20, 30, 40}, "X3", 0 ),
Add Factor( Categorical, {"A", "B", "C"}, "X4", 0 ),
Add Term( {1, 0} ), Add Term( {1, 1} ),
Add Term( {2, 1} ), Add Term( {3, 1} ), Add Potential Term( {3, 2} ),
Add Potential Term( {3, 3} ), Add Term( {4, 1} ),
Add Alias Term( {1, 1}, {2, 1} ), Add Alias Term( {1, 1}, {3, 1} ),
Add Alias Term( {1, 1}, {4, 1} ), Add Alias Term( {2, 1}, {3, 1} ),
Add Alias Term( {2, 1}, {4, 1} ), Add Alias Term( {3, 1}, {4, 1} ),
Set Sample Size( 12 ), Simulate Responses( 1 ), Save X Matrix( 0 )}
);
举例来说,假设您的设计中不能发生任何运行,其中因子 X1 取值为 1,同时因子 X4 取值为 A。这个简单的不允许组合脚本将写成:
X1 == 1 & X4 == 1
或者
X1 == 1 & X4 == "A"
第一个表达式使用关联的序数值作为 X4 = A 的值,第二个表达式仅引用字符值。两者都可以接受。此表达式可防止任何运行同时具有 X1 = 1 和 X4 = A。
运行脚本后,选择定义因子约束部分中使用不允许的组合脚本旁边的单选按钮,然后输入上述表达式之一。
要向脚本添加其他设计空间限制,请使用 OR (|) 运算符,当设计不能包含满足表达式 1 条件的运行时,该运算符是分隔表达式所必需的,或者表达式 2,或者表达式3等
假设在同一设计中,当因子 X3 的值为 3 时,因子 X1 和 X2 之和不能大于 102。此不允许的组合将写为:
((X1 + X2) > 102 & X3 == 30)
使用 | 运算符,完整的不允许组合脚本将写成:
(X1 == 1 & X4 == 1) |
((X1 + X2) > 102 & X3 == 30)
设计完成后,您会注意到 JMP 可能会像下面这样重新格式化脚本,用字符值表示分类因子水平,并通过解析删除不必要的括号。

用户向我们提出的一些常见场景是:
1)由于混合因子不支持不允许的组合,我该如何在混合设计中指定设计空间的限制?
使用离散数字和/或连续因子代替混合因子,有几种不同的方法来处理这个问题。首先,我们可以在不允许的组合脚本中施加一个等式约束(并添加任何其他必要的约束)。JMP 可能无法使用严格的等式约束(例如使用 != 运算符,或在一个条件下使用 < 和 > 严格不等式)找到可行的设计。因此,我们必须使用一个表达式来指定因子值的总和附近1.
假设我们有三个混合因子,混合和为 1。我们知道其中一个因子 (X1) 只能采用离散水平 0、0.25、0.5、0.75 和 1。其他两个因子 (X2 和 X3) 可以采用 0 到 1 之间的任何值(含 0 和 1)。因此,将第一个因子定义为五级离散数值因子,将其他两个因子定义为连续因子是最有意义的。为了使三个因素之和近似为一,我们可以将伪等式约束指定为:
X1 + X2 + X3 > 1.001 | X1 + X2 + X3 < 0.999
这将总和限制在千分之一以内。考虑到这个问题的驱动力是在混合设计的背景下能够指定因子约束,假设我们还想防止 X3 的值大于设计中的 X2 的值。在这种情况下,在禁止组合脚本字段中输入的完整表达式将是:
X1 + X2 + X3 > 1.001 | X1 + X2 + X3 < 0.999 | X3 > X2
运行下面的 JSL 脚本来创建此设计的示例。
DOE(
Custom Design,
{Add Response( Maximize, "Y", ., ., . ),
Add Factor( Discrete Numeric, {0, 0.25, 0.5, 0.75, 1}, "X1", 0 ),
Add Factor( Continuous, 0, 1, "X2", 0 ), Add Factor( Continuous, 0, 1, "X3", 0 ),
Set Random Seed( 12345 ), Number of Starts( 1000 ), Add Term( {1, 1} ),
Add Term( {1, 2} ), Add Term( {1, 3} ), Add Term( {1, 4} ), Add Term( {2, 1} ),
Add Term( {3, 1} ), Add Alias Term( {1, 1}, {2, 1} ), Add Alias Term( {1, 1}, {3, 1} ),
Add Alias Term( {2, 1}, {3, 1} ), Set Sample Size( 20 ),
Disallowed Combinations( X1 + X2 + X3 > 1.001 | X1 + X2 + X3 < 0.999 | X3 > X2 ),
Make Design}
);
由于三个因子的值之和不会正好等于一,因此您必须在生成的设计表中稍微调整其中一个连续因子的值。
解决原始问题的第二种更简洁的方法是,在初始自定义设计对话框中仅输入因子 X1(五级离散数字因子)和 X2(范围从 0 到 1 的连续因子)。可以使用公式 1 - X1 - X2 在设计表中轻松生成 X3 的值。在仅包含因子 X1 和 X2 的初始设计设置中,我们将使用不允许的组合脚本来确保 X1 和 X2 的总和不小于零也不大于 1。此外,我们再次添加 X3 不能大于 X2 的限制。由于 X3 = 1 - X1 - X2,我们可以将 X3 > X2 限制重写为 2*X2 + X1 < 1,并将其包含在带有 OR 运算符的表达式中。
在这种情况下,完整的不允许组合脚本将是:
X1 + X2 > 1 | X1 + X2 < 0 | 2 * X2 + X1 < 1
创建此示例设计的完整脚本是:
DOE(
Custom Design,
{Add Response( Maximize, "Y", ., ., . ), Add Factor(
Discrete Numeric,
{0, 0.25, 0.5, 0.75, 1},
"X1",
0
), Add Factor( Continuous, 0, 1, "X2", 0 ),
Number of Starts( 1000 ), Add Term( {1, 0} ), Add Term( {1, 1} ), Add Potential Term( {1, 2} ),
Add Potential Term( {1, 3} ), Add Potential Term( {1, 4} ), Add Term( {2, 1} ),
Add Alias Term( {1, 1}, {2, 1} ), Set Sample Size( 20 ),
Disallowed Combinations( X1 + X2 > 1 | X1 + X2 < 0 | 2 * X2 + X1 < 1 ),
Simulate Responses( 1 ), Save X Matrix( 0 ), Make Design}
);
在上述两种方法中,设计表中因子的列属性需要在最后进行修改,以反映设计的真实混合特性。您可以根据指导手动添加属性在我们的文档中。但是,更快捷的方法是使用实际混合因子创建另一个自定义设计(不需要不允许的组合),并制作表格(作为模板)。然后,将您的设计复制到该“模板”表中。这样做可确保存在混合因子的适当列属性。
2) 如何指定单个实验中可以“活跃”的最大因子数?假设有六个因子,但其中最多三个可以在任何实验运行中取大于零的值。我们选择定义六个离散数值因子(X1 - X6),其级别数各不相同。
要记住的一个重要工具是,不允许组合脚本接受函数。指示函数是此场景中的关键。例如,如果 X1 大于零,则指示函数 (X1 > 0) 解析为 1,如果不大于零,则解析为 0。因此,将所有六个因子的指示函数相加,然后排除总和大于 3 的情况将限制设计空间,以便在单次运行中不会有超过三个因子处于活动状态。不允许组合脚本写为:
(X1 > 0) + (X2 > 0) + (X3 > 0) + (X4 > 0) + (X5 > 0) + (X6 > 0) > 3
并且,可以使用以下 JSL 脚本创建此示例设计:
DOE(
Custom Design,
{Add Response( Maximize, "Y", ., ., . ), Add Factor( Discrete Numeric, {0, 1, 2, 3}, "X1", 0 ),
Add Factor( Discrete Numeric, {0, 1, 2, 3}, "X2", 0 ), Add Factor( Discrete Numeric, {0, 1}, "X3", 0 ),
Add Factor( Discrete Numeric, {0, 1, 2, 3}, "X4", 0 ), Add Factor( Discrete Numeric, {0, 1, 5}, "X5", 0 ),
Add Factor( Discrete Numeric, {0, 1, 2, 3}, "X6", 0 ), Add Term( {1, 0} ), Add Term( {1, 1} ), Add Potential Term( {1, 2} ),
Add Potential Term( {1, 3} ), Add Term( {2, 1} ), Add Potential Term( {2, 2} ), Add Potential Term( {2, 3} ),
Add Term( {3, 1} ), Add Term( {4, 1} ), Add Potential Term( {4, 2} ), Add Potential Term( {4, 3} ), Add Term( {5, 1} ),
Add Potential Term( {5, 2} ), Add Term( {6, 1} ), Add Potential Term( {6, 2} ), Add Potential Term( {6, 3} ),
Add Alias Term( {1, 1}, {2, 1} ), Add Alias Term( {1, 1}, {3, 1} ), Add Alias Term( {1, 1}, {4, 1} ),
Add Alias Term( {1, 1}, {5, 1} ), Add Alias Term( {1, 1}, {6, 1} ), Add Alias Term( {2, 1}, {3, 1} ),
Add Alias Term( {2, 1}, {4, 1} ), Add Alias Term( {2, 1}, {5, 1} ), Add Alias Term( {2, 1}, {6, 1} ),
Add Alias Term( {3, 1}, {4, 1} ), Add Alias Term( {3, 1}, {5, 1} ), Add Alias Term( {3, 1}, {6, 1} ),
Add Alias Term( {4, 1}, {5, 1} ), Add Alias Term( {4, 1}, {6, 1} ), Add Alias Term( {5, 1}, {6, 1} ), Set Sample Size( 16 ),
Disallowed Combinations( (X1 > 0) + (X2 > 0) + (X3 > 0) + (X4 > 0) + (X5 > 0) + (X6 > 0) > 3 ),
Save X Matrix( 0 ), Make Design}
);
运行脚本后,请注意设计中每次运行至少有三个因素取零值。
在上述任何一种情况下,如果出现 JMP 警报“最佳设计器未能收敛”,则您的约束可能过于严格。如果可能,请放宽约束以提供坐标交换算法找到设计的机会更大。此外,你可以尝试增加启动次数和/或将假设模型中的项的可估计性更改为如果可能的话而不是必要的看看是否能够实现收敛。
与往常一样,如果您对使用 JMP 中的设计空间限制选项有任何疑问,或者您的设计产生的运行不符合您预期的限制,请随时联系技术支持。