实验设计 (DOE) 的规划和执行可能是一项复杂的任务,需要多位专家的参与。实验结束后,分析、解释和交流结果仍然面临诸多挑战,尤其是在利益相关者的技术水平参差不齐的情况下。为了简化这一流程并规范我们的工作流程,我们开发了一个脚本,可以自动可视化 DOE 结果。该脚本会生成两个直观的图表,有效地传达实验结果。
我们的脚本设计灵活,可根据需要添加新的计算和对图表进行标准化处理。该工具显著提高了我们的效率,与手动方法相比,每个图表大约节省了两个小时。此外,标准化的可视化格式增强了与非技术利益相关者的沟通,使美国能源部的研究结果更易于理解和获取。
在NNE,我们帮助众多客户进行实验设计(DoE),用于各种不同的目的,例如稳健性测试、流程改进和验证。我们经常面临的一大挑战是如何将结果有效地传达给利益相关者。这其中可能存在诸多挑战,因为他们中的一些人可能不像我们一样精通统计学和数学。
在某些情况下,这甚至可能是一种轻微的数学恐惧症。很多人可能不熟悉 JMP 的界面,所以这可能会让他们感到有些畏惧,或者仅仅是我们创建的模型的复杂性就可能难以分析或理解。
另一个重要原因是,我们的一些分析工作非常耗时耗力,而且会让人感到枯燥乏味。当你感到无聊时,就容易出错,这可不好。
我们想要开发一种方法,能够快速便捷地生成图表。这样我们就可以向利益相关者展示结果并进行沟通。图表应该自动生成,以减少错误,而且速度要快,避免我们花费太多时间等待结果。此外,由于我们经常使用各种模型,因此该方法还应该能够处理大量模型。
我们之前已经制作了这些图表。这仍然花费了很长时间。通常,我们会制作两个图表,一个用于可视化结果的范围,另一个用于可视化结果对我们在实验设计中使用的变量的敏感性。
我们找到了一种自动化分析的方法,即将模型导出到 Python 中进行所需的计算,解决一些全局优化问题,然后在 JMP 中可视化结果,并在 JMP 中对结果进行归一化,以便进行比较。
您可以在这里看到其中一张图。这是我们绘制的极差图。这里是灵敏度图。对于极差图,我们做了一个小例子。数据来自大豆品种,不同类型的大豆,我们对其作物产量进行了建模,然后绘制了这张图。
我可以演示一下制作这个图表的过程。其实很简单。我们这里有数据。我们已经建立了一个模型。这里显示的就是这个逗号。然后,我们只需在工具中点击一个小按钮,它就会运行。对于某些模型,特别是当某些名义变量有很多水平时,计算量可能会比较大。它需要针对每种组合求解一个全局优化问题,但即使在数据量较大的情况下,我们也能很快得到结果。
这里可以看到结果。大概花了20秒左右。接下来,我们可以绘制想要的内容。通常情况下,它会生成一个图表。您可以根据需要进行自定义。其中一些变量仅用于特定分析。在这里,我们几乎可以立即获得一个图表,从中我们可以查看想要的内容,并轻松地与利益相关者沟通。
例如,对于这个数据集,我们可能想根据季节找到最合适的作物。这里显示的点是标称值。这个值指的是,如果我们选择这种作物,并且其他所有设置都设为中间值,我们将获得的产量。这里的范围(即条形图)显示了该值可以取的范围。
对于这种作物,其值可能在 4700 到 4000 左右之间。虚线是控制限,即标称值加减自由标准偏差,以及本例中的目标限和规格限。我们可以立即看出,在第一季,我们有三到四个不错的候选品种,它们都在我们的控制限范围内,甚至有一个品种几乎完全符合目标值。
我们可以把这个放到第二季,虽然第二季的排名通常会稍微低一些,但我们仍然可以找到一些合适的例子。这只是其中一个应用场景。现在我们可以结束这些讨论了。因为还有一点,这个场景只有一个输出变量。
另一种情况是,我们可以有多个输出,而且这些输出可以具有不同的尺度。这里我们再举一个例子。这是模拟数据,但基于一个真实案例。我们想要分析一款产品。这是一款工业产品。他们测量了许多维度,我们想找出哪些维度对结果最为关键。
这里我们有两个解释变量和五个维度,它们的尺度各不相同。我可以跳过这一步。我们可以再次运行模型。绘制图表大约需要5秒钟,现在我们立即得到了结果。我们也可以很快看出不同尺度带来的问题,因为如果我们只显示维度4,就只能看到它的动态变化,因为它比其他维度大得多。我们可以尝试调整尺度,但可能会遇到同样的问题。维度1和维度2都比维度3大,所以我们一次只能看到一到两个维度。
我们采取的方法是,对图表进行某种归一化处理。例如,我们可以将其归一化到目标值。这里,我们把变量放在这里。现在我们已经进行了归一化,所以目标值始终为零,上限为一,下限为负一。现在我们可以立即看出,对于维度 3,如果我们设置了维度 2,则始终超出规格。
我们可以看到,与规格限制相比,维度 1 和维度 2 的变化幅度并不大。在设置 2 中,维度 2 的变化幅度会很大,具体变化幅度取决于我们的输入变量。如果采用这种设置,我们就必须非常精确地控制温度。
如果设定了目标规格限值,这个方法就有效。如果没有目标规格限值,可以采用其他方法。我们还有另一种方法,它只是根据截距和规格限值进行了归一化。如果没有具体的目标值,我们只需要确保数据在规格限值范围内,而这种方法就是基于此进行归一化的。我们还可以最后一种方法,根据截距的标准差进行归一化,这种方法总是有效的,但我们仍然可能会遇到尺度不同的问题。
例如,在这里我们可以看到,维度 4 与残差方差相比相当大,而维度 1 的规格限制与残差方差相比并不大。
最后,您可能不仅关心您的数值可以取哪些值,还想知道如何控制这些结果变量。这里我们还有另一组数据,其中包含卡路里消耗量与年龄、身高、体重、性别等因素的函数关系。我们想知道我作为一个特定因素可以消耗多少卡路里。
我们有了数据集,也导入了模型。我们按下按钮,几秒钟后,就得到了一张图表。这里,我们绘制的是灵敏度曲线。什么是灵敏度曲线呢?它表示结果变量会根据你的名义变量设置以及每个连续变量的变化幅度。
例如,我们可以看到,如果换作是我,如果我进行一些锻炼,并且多锻炼一分钟,我预计会多消耗大约5.5卡路里。如果我增加运动强度,使心率提高1次/分钟,那么我燃烧的卡路里就会增加大约2.5卡路里。
模型中的其他变量在实际应用中可能影响不大。我的年龄可能并不那么重要……我的体重可能也不那么重要。当然,这与变量的尺度无关。如果我能让心率的变化幅度大于持续时间的变化幅度,那么它仍然可能产生显著影响。
我们还有另一种归一化方法,那就是取梯度,取灵敏度,然后乘以范围的大小……我的心率可以变化多大,持续时间可以变化多大。
我们可以看到,之前心率的影响并不大。现在我们可以看到,心率对卡路里消耗的影响可能与运动时长一样大,因为我可以比调整运动时长更灵活地改变心率。
我们还可以看到,仅仅在运动过程中,我就能燃烧更多卡路里。通过更剧烈的运动,我预计可以多燃烧大约 60 卡路里。实际上,我们可以看到,当我的体重或年龄发生变化时,运动效果会有多大差异。我的体重和年龄都可能发生变化。这仍然会产生实际影响,而我们之前只关注个体,估计其永久性影响时,无法看到这种影响。
现在我们就把这些都结束吧。回到开头。我们之前尝试做的是开发一种自动化的实验分析方法。现在我们已经有了一个可行的方法。它速度相对较快,而且你可以根据自己想要的图表样式进行自定义。差不多就是这样。