好的,我们来谈谈如何设计和分析只有通过/失败两种结果的实验。我会在本次课程中一直讲解通过/失败的结果。不过,实际上,这适用于任何只有两个选项(即二元结果)的情况,也就是说,你只能属于这两个选项中的一个。这两个选项互斥且完备。通过/失败、通过/不通过、是/否,只要结果有两个互斥且完备的选项即可。我们将课程分为四个部分。首先,我们来看一个例子。希望这个例子对你来说并不陌生。
希望这能让你想起之前处理失败实验的经验。我们会探讨一些可能出错的地方。之后,我们会讨论模型,因为一切都取决于我对模型的基本假设,而这些假设会决定我选择的分析方法和实验规模。看完PPT后,我们会实际演示如何分析实验数据,也就是我将要展示的示例数据。
我们将讨论 JMP 和 JMP Pro 中可用的一些选项。最后,我们将总结一下如何确定实验规模。事实证明,对于合格/不合格实验,重要的不是实验运行次数,而是实验运行的次数,也就是每个实验条件下的试验次数。我们将讨论如何在 JMP Pro 中进行设置,以及如何设置模拟来确定合适的试验次数。让我们来看一个例子:我们正在制作小部件。我们目前的流程对失败率不太满意。
我们确定了四个不同的因素,我们认为它们有助于降低这些部件的故障率。这四个因素分别是添加剂、压缩步骤(其中有三个因素需要改变)、温度、压力和保压时间。问题是,部件是否存在缺陷?我们对部件进行处理。如果存在缺陷,我们就判定为故障。目前的缺陷率为 15%,我们将以此为基础来确定实验规模。
我们的目标是将故障率降低到 5%。但是,如果我们能发现 3% 到 5% 的差异,我们就很满意了。如果我们能检测到缺陷率下降到比如说 10%,那就更好了。我们希望能够检测到这一点。另外,我只想知道每次运行大约需要 10 分钟。运行次数并非无限,我每小时大约可以运行 6 次。
好的,假设我们把这个因素输入到 JMP 中。我们打开一个自定义设计器。我们决定做一个响应面设计。我们要添加三个中心点,这就是我们得到的设计。到目前为止一切顺利。我们把设计发送给负责运行实验的操作员,他们返回了结果。我们有 24 次运行,大约需要 4 个小时来完成这个实验。我们被告知,这些 0 和 1 分别代表有缺陷的观测值和无缺陷的观测值。现在,我要分析数据,我把它输入到 JMP 中。
现在,我知道这些 0 和 1 不是连续数据,而是分类数据,也就是二元数据。我会按分类数据来处理。我可能对逻辑回归略知一二。因为我是在 JMP 中设计这个实验的,所以响应曲面模型会出现在模型构建对话框中。我尝试拟合分析,但一开始就应该担心。对于这些参数估计值,我收到一条消息,提示这些参数估计值不稳定。
假设我和一位对这类实验比较了解的人讨论过这个问题,他们告诉我,问题在于你只针对一组处理条件做了一次试验。你需要做不止一次试验才能得到准确的估计。假设我回去和操作员讨论这个问题,因为他们不太赞成将我的实验规模从一次试验增加到五次。这样一来,我的实验将耗时约20小时。但我说服了他们,我们确实需要这样做,于是决定重新运行实验,现在每组实验条件都进行五次试验。
我收到了实验数据。实验结果中新增了两列数据。第一列是 Y5,代表失败次数。第二列是 N,代表一组实验条件下的试验次数。这次,我打算不再直接处理计数数据,而是将失败次数除以总试验次数,并将结果视为连续数据。这样,我就得到了给定实验条件下的失败比例。
我将把这些数据视为连续数据。这样处理让我感觉更自在,因为我更熟悉这种数据建模方式。和上次我们看到的模型一样,不过这次我不使用逻辑回归,而是使用标准的租赁平方。好的,目前为止一切顺利。我使用了我最喜欢的建模技术,也许还会用到我最喜欢的模型降维技术,然后得到了最终模型。同样,目前为止一切顺利。接下来我想做的就是优化。
我想知道哪些条件能使误差率尽可能降低。我使用了性能分析器中的优化器,它告诉我将总时间设置为 45 秒,温度设置为 45 摄氏度,这样就能预测误差率低于零。我可能会忽略这个预测,因为它非常接近于零,我心想,也许它只是非常接近于零,而不是低于零。但我知道从技术上讲,这是不可能的。误差率不可能低于零。即使我可能接受这个预测,我也会问自己,这个估计到底有多准确?
我的模型结果到底有多接近零?我是不是构建了一个糟糕的模型?一切都取决于我构建的模型……我所做的假设,当我将数据视为连续数据时,以及当我处理合格/不合格数据时,我应该做出的假设。这是我们典型的模型。等式左边是响应值,也就是我们的观测值。在我们的例子中,它是不合格的概率。抱歉,等式左边是不合格的概率。
在右侧,我们看到的是线性模型,也就是我们试图建立的输入和输出之间的关系。这通常是我们考虑的重点。在这种情况下,典型的假设是这种关系是线性的,响应范围是无限的,并且残差服从正态分布。残差是指,当我用模型拟合数据后,剩下的部分就是残差。我假设它们服从正态分布,这意味着它们关于零对称,并且具有所有这些优良的性质。这正是问题的一部分。
如果我们处理的是概率,那么响应曲线实际上看起来更像是S形,而不是线性关系。这种线性关系并不成立。无界响应范围也不成立,因为我知道既然处理的是概率,就不可能小于零,也不可能大于一。甚至最后一点,正态误差的假设也不成立。仔细想想,当预测值越来越接近零时,残差的可用空间就会越来越小。拟合值和零之间的范围会逐渐缩小。
我不能接受接近于零的对称误差。同样,也不能接受随着误差值越来越接近于一而出现的对称误差。这种情况必须有所取舍。我希望这个问题能有一个简单的解决方法。或许只需一个简单的变换。但愿如此,或许还可以使用不同的分布。我们能在 JMP 中实现吗?答案是,我们有三种不同的选择。第一种选择,我们在示例中已经见过,那就是逻辑回归。也就是对数据进行 Logit 变换。
在这种情况下,我们并非将概率本身视为响应,而是关注两种不同响应水平的比值。即失败概率除以成功概率,然后取其对数。取对数是为了使这种关系呈现线性。另一种理解方式是,由于只有两种不同的水平,因此也可以用失败概率除以(1减去失败概率)来表示。如果您之前使用过这类模型,并且听说过赔率和对数赔率,那么这就是它们的定义。
等式的第一部分定义了赔率。赔率是指一个水平与另一个水平之比。这就是我的赔率,然后我取它的对数。这是一种方法。另一种方法是使用所谓的逆正态分布分析。使用逆正态分布分析,我只是使用了不同的变换。在这个例子中,我使用了逆正态分布。或者,如果我曾经在公式编辑器或使用 JSL 构建过这个公式,那么它实际上就是正态分位数函数。
现在,JMP 中还有第三种选择。这需要一些额外的工作,我们不会详细讲解它的用法,但我还是想介绍一下,因为在文献中经常会看到它,那就是互补对数函数。JMP 本身并不直接提供这个函数,我们需要使用类似非线性平台之类的工具来构建它。它可以用最小极值分布来近似,但我们今天先不讨论这个。实际上,我们今天主要关注 JMP 中开箱即用的功能。
现在,我们需要做出第二个重要的假设,那就是,无论我们选择哪种变换,无论是 Logit 还是 Probit,我们都要假设误差服从二项分布。因为这里涉及两个部分。我不仅要进行变换,还要假设一个不同的分布。正如我之前提到的,前两个部分可以直接在 JMP 的平台上实现,所以很容易操作。我们将重点关注它们。最后一个部分可以使用非线性平台进行建模。值得一提的是,所有功能都可以在拟合模型平台中找到。在 JMP 中,我提供了三种不同的选项。
我可以使用逻辑回归,我们在示例中已经见过它了。还有一个叫做广义线性模型的选项,名义逻辑回归和广义线性模型之间有着很强的关联性。对于 JMP Pro 用户,我们还有广义回归,它提供了许多其他选项。现在,还有一个平台可以进行简单的逻辑回归,即用 X 拟合 Y。但是,由于我们处理的是实验条件,而且通常有多个因素,所以我就不赘述了。不过,对于简单的逻辑回归来说,用 X 拟合 Y 也是可行的。
在深入探讨如何在 JMP 中实现这一点之前,我们需要先讨论一下数据组织方式。因为数据组织方式决定了我们拥有哪些数据,以及我们如何组织数据。在“拟合模型”对话框中设置数据组织方式非常简单。我举一个简单的例子。假设我们有一个双因素实验,即时间和温度。我们已经完成了全因子实验,因此我们拥有时间和温度的所有可能组合。假设我们计划进行五次试验,每次试验处理对应五次试验。
我所说的“处理”指的是“行”,也就是我们数据表中每一行所代表的独特组合。我有三种不同的数据设置方式。第一种方式就是直接使用原始数据。数据表中的每一行都对应一次试验。你会注意到原始数据的第一行,它代表的是处理组合一,并给出了给定的时间和温度。在这个例子中,我的二元响应变量是绿色还是红色。第一次响应是绿色。第二行同样是处理组合一,这次响应是红色,以此类推。
这就是原始格式。这三种方法都可以使用原始格式。现在,我可以进行汇总。有时汇总数据更有意义。汇总数据时,我会同时汇总处理条件和响应水平。你会注意到,在汇总后的数据堆栈中,第一行是处理条件一,包含了所有绿色,以及两个观察到绿色的案例。第二行是我的第二个处理组合,有三个绿色的观测值,依此类推。我刚刚汇总的是我的处理组合和响应水平。
好的,这三种方法都可以使用这种汇总堆叠格式。第三种组织方式,对很多人来说可能是最自然的,因为它看起来很像我用于线性模型的组织方式,那就是汇总拆分格式。在这种情况下,我再次对处理组合进行了聚合,但只针对其中一个处理水平。你会注意到,在这种情况下,我统计了每次试验中出现绿色观测值的次数,以及试验次数。假设我要使用自定义设计器构建一个实验设计(DOE),那么在输入数据时,这就是我期望使用的格式。
如果我想使用汇总堆栈格式,实际上需要复制这些运行结果。我会分别复制一份用于绿色数据,一份用于红色数据,然后稍微调整一下顺序。逻辑回归不能使用这种格式,我必须使用其他两种格式之一。广义线性模型和广义回归可以使用这种格式。如果您打算使用逻辑回归,这一点需要注意。好了,现在开始吧。PPT 就到此为止。接下来,我将打开 JMP,讨论一下如何利用我们看到的实验数据来分析每个示例。
好的,我们来做逻辑回归。我们先从第一个例子——逻辑回归开始。我还注意到,这里有一个汇总后的堆栈,格式也已设置好。其中有一列包含了通过和失败的次数,也就是计数。这是汇总数据。另一列也包含了计数。好的,非常简单明了。我们接下来要讨论的所有内容都将在“拟合模型”下进行。因为我是用 JMP 设计的,所以它已经包含在我的模型里了。
这是我设计的响应曲面模型。对话框里已经预先填充好了。但我只想指出,这里的响应变量是名义变量,也就是合格/不合格。我还需要把计数也放进去,因为我已经汇总了数据。我要选择目标水平,这实际上取决于我希望输出结果的方向,是按照合格还是不合格的方向来分析。我来设置一下。我们把它改回合格。现在,我这里有几个不同的选项。
它们都是逻辑回归。我这里有一个名义逻辑回归模型。如果我对逐步回归有所了解,我也可以对我的 Logit 模型,也就是我的逻辑回归模型,进行逐步回归。这也是一种选择。好的,所以我们还是先用原来的名义逻辑回归模型吧。我要运行一下我的模型。同样,我会使用一些数据降维技术或者模型降维技术。我可能会手动从模型中删除一些项等等。或者我也可以直接使用逐步回归。
其实这并不重要,因为我一开始就用了正确的模型。让我再从模型中移除一个项。好了。假设这就是我们的最终模型,我们对这个模型很满意。让我们进入分析器。我向下滚动到分析器,把它放大一点,这样我们就能看得更清楚。现在,使用这个模型的一个好处是,我的通过和失败情况是有界的,但概率必须介于 0 和 1 之间。让我启用期望函数。现在,它看起来会有点不同,因为它实际上被分成了两组。
我已经设定了目标通过率和失败率。我打算把失败率设为零,因为我不想优化任何失败。我会提高通过率的期望值,我们来最大化这个期望值。它再次告诉我相同的温度持续时间。但是,我可以更准确地估算预测的失败率,或者在这个例子中是预测的通过率。这告诉我,在这些设置下,我的通过率应该在 96% 左右,也就是大约 4% 的失败率。
当然,它肯定不低于零,而且比我预期的还要远离零一些。好的,接下来我们来看广义线性模型,我们将使用汇总分割格式。如果你之前使用过线性模型,那么这种格式应该很熟悉。这些很可能是我设计实验中的观测值。我统计了其中一个水平的观测值数量,在本例中,我统计了不合格项目的数量,然后是试验的总次数。
好的,我再次打开“拟合模型”对话框。这里的设置略有不同。对于这个特定的组织,我有两个连续变量。第一个变量是每个个体的计数,第二个变量是总计数。我已经默认选择了广义线性模型。我选择了分布,这里默认是二项分布。在这里,我可以选择 Logit 模型或 Probit 模型。它们的概率略有不同。我们就选择 Logit 模型吧。默认情况下,Logit 模型和逻辑回归会给出相同的结果。
广义线性模型的一个优势在于,它允许我放宽之前提到的一些假设。其中一个假设是误差项服从二项分布。二项分布误差是固定的,无论概率如何变化,误差值都保持不变。而启用过度离散模型则意味着,变异性可能比预期略大,或者误差可能比预期略大。它在一定程度上放宽了二项分布误差的假设。
我还可以调整我的估计值以消除潜在的偏差。我只需启用过度离散度。再次运行我的模型。这种方法的一个缺点是它不具备逐步回归的能力。你需要手动操作,或者在决定最终使用哪个模型之前,先假设一个模型。同样,我选择手动操作。我将找出三个重要因素。你会注意到,如果将其与逻辑回归进行比较,由于我启用了过度离散度,我的变异性实际上比估计值略大。
我的 P 值略大。这时我需要问问自己,即使这些结果不显著,我是否真的要相信它们不值得保留在模型中等等。不过好消息是,我可以选择放宽模型中的这个特定假设。同样,如果我想启用分析器并进行优化,也是可以的。我拥有同样的强大功能。在这种情况下,组织结构略有不同,因为我建模的不是过去的失败,而是概率。这是我们更熟悉的分析器。显然,在这种情况下,我不想优化它,因为那样会最大化失败次数。我要最小化失败次数。让我们开始优化吧。
它再次告诉我,时间是 45 秒,温度也是 45 秒。它会给我一个略有不同的估计值,尽管它们非常接近。同样,好处在于我的值是有限制的。无论滑块移动到哪里,这些概率值都介于 0 和 1 之间。好的,最后一个例子,我们来谈谈广义回归。这是 JMP Pro 独有的功能。它为我提供了一些其他选项。我的起点相同,选择“拟合模型”,设置也相同,因为我已经有了汇总后的分割数据。
不过,我打算选择广义回归。现在,我要选择不同的分布。在这种情况下,我知道我的响应变量是二项分布,因为它由两个不同的变量构成。我有一个二项分布的响应变量,或者我也可以选择 beta-二项分布。Beta-二项分布类似于我在广义线性模型中使用过度离散选项的技术。这允许我考虑随概率值变化的方差。在这种情况下,我们将使用默认值。接下来,我们运行模型。
如果你之前用过广义回归,你就会知道这个平台提供了所有模型降维技术。在这种情况下,我可能会使用其中的一种技术。让我确认一下……我要强制执行遗传假设。我们使用向前逐步回归。这里有很多不同的选项。如果你之前没见过广义回归,我这里有很多不错的模型降维技术选项。我将使用向前逐步回归,这是逐步回归的默认选项。点击“运行”,这就是我的最终模型。
再次强调,结果非常一致。这三个模型都给出了非常一致的结果。参数估计值会略有不同,概率也会略有不同。好的,现在的问题是,我进行的试验次数是否足够多,足以让这个实验真正有意义?这就引出了如何合理安排实验规模的问题。让我切换回我的 PowerPoint 幻灯片,用几张幻灯片简要介绍一下实验设置。
我们将采用这种方法来确定实验规模。顺便一提,这项功能仅在 JMP Pro 中提供。对于非 JMP Pro 用户,您或许可以编写 JSL 脚本来实现,但这会非常繁琐。JMP Pro 让设置变得极其简单。我们将从自定义设计器开始。我们将使用自定义设计器构建我们预期的设计。在生成最终表格之前,我们将启用模拟响应。
它位于左上角的热点区域。创建数据表后,会出现一个对话框,我们可以在其中更改系数。下一张幻灯片中,我将简要介绍如何设置这些系数。我们将更改这些系数,并将它们更改为我们所需的数值。同样,下一张幻灯片中我会更详细地讲解。更改系数后,我们将误差设置为二项分布,并选择样本大小(即我们希望看到的试验次数),然后单击“应用”。
模拟响应选项会生成两列数据,因为我选择了二项式误差,所以一列是模拟试验次数和试验成功次数,另一列是试验总次数。我们将使用这些数据进行整体模拟。接下来我们讨论如何设置这些系数,因为这是确定实验规模的关键步骤。这些系数的设置取决于底层模型,也就是我选择的是Logit模型还是Probit模型。
我的例子将使用我们之前看到的Logit模型数据。这将决定我们如何设置这些值,也就是基线概率。如果你还记得我们之前的例子,我们说过,基线时的失败率大约是15%。这就是我们的基线。然后我们必须问,我希望在多大的概率下能够看到差异?再次提醒,我们说过,如果我们能够看到10%的改进,我们就很满意了。这就是我们希望在实验中达到的规模,即能够看到从15%到10%的改进。
接下来,我们将利用之前看到的变换来计算基线值,也就是我们想要检测的概率为 10% 时的值。我们将计算这两个值的差值,并将其作为系数。如果我们使用 Logit 模型,基线值就是 15% 除以 1 减去 15%。我们的基线值为 -1.73。如果我们想要观察 10% 失败率的变化,同样,我只需将其代入公式。它是 0.1 除以 1 减去 0.1。这得到 -2.2。因此,系数就是这两个值之间的差值。我将使用 0.5 作为系数。
PPT演示就到此为止。我们来看看实际操作是怎么做的。我的实验数据和实验因子都已准备就绪。我将使用自定义设计器。我先把因子加载进去。我要构建我想要的设计。如果你还记得,我说过,我有一个响应面设计。我们添加三个中心点。假设运行24次。我点击“生成设计”,让它运行并从算法中确定最佳设计。在生成最后一个表格之前,我要点击热点,然后选择“模拟响应”。现在,我要创建表格。这个表格会显示我的设计,我要把系数更改为我计算出的值。
让我先重置一下这些参数。我之前说过截距是-1.73。我要把每个系数都设为0.5。我复制一下,这样就可以粘贴了。最后,我要把误差分布设为二项分布。现在,我要点击“应用”按钮。请你留意一下那个表格。它会生成我分析要用到的两列数据。我先退一步。我想设置一下样本量。我不能忘记。如果你还记得的话,在最初的实验中,我运行了五次。第二次运行实验时,我又要重新应用这个设置。现在我已经把正确的方程都填进去了。
这些列我将用于初始分析和模拟。现在,如果你愿意,你实际上可以给这些效应赋予正负号。所谓赋予正负号,是指根据你预期看到的关系,将它们设为负值或正值。由于时间关系,我还没有详细讲解这一点。我有一张幻灯片,其中详细讲解了如何处理这些不同的效应,并判断它们应该是正值还是负值。当然,这样做对结果的影响远小于效应量本身的大小。但是,在大多数设计中,除非效应完全正交,否则这些效应之间都存在相关性,因此效应是正值还是负值可能会对我的统计功效产生一定影响。
现在我已经完成了初始设计,接下来我要进入拟合模型。我要分析这个设计。我需要确保输入模拟数据和试验数据。通常情况下,我会使用广义回归,并且再次强调,我会选择二项分布,因为它提供了丰富的模型简化选项。好处在于,模拟数据会直接应用到模型中,我无需编写任何脚本。我们来运行一下。同样,我将使用前向选择法。点击“运行”按钮。我向下滚动找到我的前向选择模型,它就在这里。
现在我已经获得了单个观测值,接下来我可以右键单击。通常我会将鼠标悬停在某个概率值上。右键单击后,在最底部会有一个“模拟”选项。我必须确保在这两个选项中都选中了包含模拟成功次数的公式列(默认情况下应该是选中的)。然后我会指定要进行的样本试验次数。现在,单击“开始”后,每次模拟迭代都会重新计算该公式列,并根据我的底层模型给出一组新的试验次数。
我会运行 2500 次,然后将数据汇总成一份漂亮的报告。现在,不用浪费时间看着它不停地运行,速度很快。通常只需要半分钟,最多一分钟。我已经运行过结果了,这就是结果的样子。这里是我 2500 次运行的结果,不包括第一次初始运行。我还添加了一些额外的函数和公式,我很乐意分享。但生成这份报告时会添加这两个脚本。功效分析只是分布的一个子集。我们来看看功效分析。
这样做可以让我获得大量数据,了解所有运行结果中 P 值的分布情况。如果你还记得本例中使用的模型,所有结果都具有统计学意义。这告诉我,这是我通过模拟观察到的 P 值分布情况,我的预测值大约是万分之一,这很好。我计算出了预测 P 值的置信区间。实际上,我认为这并非真正的置信区间,因为我们使用的是贝叶斯方法。
这更像是一个可信区间。或许应该说是一个置信区间。但它的确会限定在那个概率值所在的范围内。然而,一个有趣且重要的信息是我拒绝原假设(在本例中为零假设)的次数。这告诉我,如果我选择显著性水平 α = 0.01,即使我知道实际上我将其建模为真实效应,我也会大约有一半的概率拒绝原假设。如果我将显著性水平提高到 0.05,那么我大约有四分之三的概率拒绝原假设,以此类推。
我利用这些信息来问自己:我的实验规模是否合适?我能否检测到主效应、主效应和双因素交互作用,以及模型中的任何其他效应?检测次数和检测比例是否足够,才能让我对选择的实验次数感到满意?在这种情况下,我通常的做法是,不仅依赖一些内置报告,还会统计例如正确显著效应的数量。
我会设定一个阈值,然后计算正确回答的数量。同样,所有这些都会和材料一起打包,并附上一些解释以及我构建所有这些模型的公式。再次强调,我需要使用我自己对风险的定义来确定,我是否捕捉到了足够多的显著效应,从而使该实验值得运行5次、10次或20次等等。好了,这就是我想在JMP中向您展示的内容。让我们回到总结部分。
总而言之,无论我使用哪种技术,在对这些数据进行建模时,我都会使用“拟合模型”平台。我可以使用逻辑回归,在这种情况下,我可以选择使用逻辑回归,也可以选择在后台使用逻辑回归的逐步回归。我还可以设置广义线性模型,默认情况下,它会给出与逻辑回归相同的输出,但额外允许我放宽误差假设并校正偏差。此外,如果我安装了 JMP Pro,还可以使用广义回归,它不仅能够实现逻辑回归或广义线性模型的功能,而且还允许我进行一些模型生成操作。
在确定实验规模时,我将使用自定义设计器构建实验,然后使用 JMP 的内置模拟功能来运行我的自助法模拟实验和自助法模拟分析。以上就是我想讲的内容。补充幻灯片中会有更多信息,很遗憾我没有时间一一讲解,但我希望您喜欢以上内容,并希望它对您未来的工作有所帮助。非常感谢。