估计软件更改解决问题的概率

机器算法验证 假设检验 分布 t检验 预测区间
2022-03-18 08:40:01

在工作中,我们有一个硬件设备由于某些尚未确定的原因而出现故障。我的任务是查看是否可以通过更改其软件驱动程序来使该设备不发生故障。我已经构建了一个软件测试平台,它迭代了我认为最有可能导致设备失败的驱动程序功能。到目前为止,我已经强制执行了 7 次这样的失败,并且设备失败的迭代如下:

100 22 36 44 89 24 74

平均值 = 55.57 标准偏差 = 31.81

接下来,我对设备驱动程序进行了一些软件更改,并且在手动停止测试之前能够运行设备 223 次迭代而没有失败。

我希望能够回到我的老板那里并说“我们能够运行该设备 223 次迭代而没有失败的事实意味着我的软件更改有 X% 的概率可以解决问题。” 我也会对设备在此修复后仍会失败的相反概率感到满意。

如果我们假设设备失败的迭代是正态分布的,我们可以说进行 223 次迭代而不失败是平均值的 5.26 个标准差,大约有 1400 万分之一的机会发生。但是,因为我们只有 7 个样本(不包括 223 个),所以我相当肯定假设正常是不明智的。

这就是我认为学生 t 检验发挥作用的地方。使用 6 个自由度的 t 检验,我计算出实际总体平均值有 99% 的概率小于 94。

所以现在我向你们提出的问题是,是否允许我以 99% 的把握说达到 223 次迭代而不失败是 4.05 sigma 事件,即(22394)31.81=4.05我是否允许在该计算中使用 31.81 样本标准差,或者我应该做一些其他测试来获得 99% 的最大标准差置信度,然后在我的计算中使用它来计算有多少 sigma 223 真的离开了从 99% 置信水平的平均值?

谢谢!

更新

我在这里收到的答案超出了我的任何预期。我真的很感谢你们中的许多人投入的时间和想法。我有很多事情要考虑。

为了回应 whuber 对数据似乎不遵循指数分布的担忧,我相信我知道为什么。其中一些试验是在我认为是软件修复的情况下运行的,但最终以失败告终。如果这些试验是我们看到的 74 89 100 分组,我不会感到惊讶。尽管我无法解决问题,但似乎我确实能够扭曲数据。我会检查我的笔记,看看是否是这种情况,我很抱歉没有记得早些时候包含那条信息。

让我们假设上述情况为真,我们将从数据集中删除 74 89 100。如果我要使用原始驱动程序重新运行设备并获得值为 15 20 23 的附加故障数据点,那么您将如何计算 95% 置信水平下的指数分布参数预测限制?与假设独立的伯努利试验来找出 223 次迭代中没有失败的概率相比,您是否觉得这个预测极限仍然是一个更好的统计数据?

更仔细地查看关于预测限制的维基百科页面,假设 Excel 上的总体均值和未知标准差未知,我计算了 99% 置信水平的参数预测限制,如下所示:

Xn¯=55.57
Sn=31.81
Ta=T.INV(1+.992,6)

LowerLimit=55.573.70731.811+17=70.51
UpperLimit=55.57+3.70731.811+17=181.65

由于我对 223 的试验超出了 [-70.51 , 181.65] 的 99% 置信区间,我可以假设基础分布是 T 分布的情况下以 99% 的概率假设这是固定的吗?我想确保我的理解是正确的,即使底层分布很可能是指数分布,而不是正态分布。我丝毫不知道如何调整潜在指数分布的方程。

更新 2

所以我真的对这个“R”软件很感兴趣,我以前从未见过它。早在我上统计课时(几年前),我们使用的是 SAS。无论如何,根据我从 Owe Jessen 的示例中收集到的粗略知识和 Google 的一些帮助,我想我想出了以下 R 代码来生成预测极限,假设数据集假设为指数分布

如果我做对了,请告诉我:

fails <- c(22, 24, 36, 44, 15, 20, 23)
fails_xfm <- fails^(1/3)
Y_bar <- mean(fails_xfm)
Sy <- sd(fails_xfm)
df <- length(fails_xfm) - 1
no_fail <- 223

percentile <- c(.9000, .9500, .9750, .9900, .9950, .9990, .9995, .9999)
quantile <- qt(percentile, df)

UPL <- (Y_bar + quantile*Sy*sqrt(1+(1/length(fails_xfm))))^3
plot(percentile,UPL)
abline(h=no_fail,col="red") 
text(percentile, UPL, percentile, cex=0.9, pos=2, col="red")

预测限制 http://img411.imageshack.us/img411/5246/grafr.png

4个回答

这个问题要求一个预测极限 这将测试未来的统计数据是否与以前的数据“一致”。(在这种情况下,未来的统计数据是 223 的固定后值。)它以三种方式解释了机会机制或不确定性:

  1. 数据本身可能会随机变化。

  2. 因此,根据数据做出的任何估计都是不确定的。

  3. 未来的统计数据也可能因机会而异。

从数据句柄 (1) 估计概率分布。但是,如果您只是将未来值与来自该分布的预测进行比较,您将忽略 (2) 和 (3)。这会夸大您注意到的任何差异的重要性。这就是为什么使用预测极限方法而不是一些特别的方法很重要的原因。

故障时间通常被认为是指数分布的(本质上是几何分布的连续版本)。指数是具有“形状参数”1 的Gamma 分布的一个特例。正如 Krishnamoorthy、Mathew 和 Mukherjee 在2008 年 Technometrics 文章中所发表的,已经制定了Gamma 分布的近似预测极限方法。计算相对简单。我不会在这里讨论它们,因为还有更重要的问题需要先处理。

在应用任何参数程序之前,您应该检查数据是否至少大致符合程序的假设。在这种情况下,我们可以通过制作指数概率图来检查数据是否呈指数(或几何)此过程将排序的数据值 =匹配到(任何)指数分布的百分比,可以计算为当我这样做时,情节看起来明显弯曲,表明这些数据不是k1,k2,,k722,24,36,44,74,89,1001(11/2)/7,1(21/2)/7,,1(71/2)/7从指数(或几何)分布中得出。对于这些分布中的任何一个,您都应该看到一组较短的故障时间和较长的故障时间。在这里,初始聚类在处很明显,但是在从处有另一个聚类这应该会导致我们不信任参数模型的结果。22,24,26,44447474,89,100

在这种情况下,一种方法是使用非参数预测限制在这种情况下,这是一个非常简单的过程:如果修复后的值是所有值中最大的,那应该证明修复实际上延长了故障时间。如果所有八个值(七个前缀数据和一个后缀值)来自同一个分布并且是独立的,那么第八个值最大的可能性因此,我们可以以 % 的置信度说该修复已改善了故障时间。此过程还正确处理审查1/811/8=87.5在最后一个值中,它确实记录了某个大于 233 的未知值的故障时间。(如果参数预测限制恰好超过 233——我怀疑 [根据经验和@Owe Jessen 的引导程序的结果] 它会如果我们以 95% 的置信度计算它,则接近 - 我们将确定数字233 与其他数据并不矛盾,但这将无法回答有关真正失效时间的问题,因为 233 只是低估了.)

根据@csgillespie 的计算,正如我在上面所说的那样,它可能高估了 % 的置信度,但我们仍然发现了一个实际置信度可能存在的窗口:它至少为 %,略低于 % (假设我们对几何分布模型有任何信心)。98.387.598.3

最后,我将分享我最担心的问题:上述问题很容易被误解为呼吁使用统计数据来给人留下印象或使结论神圣化,而不是提供关于不确定性的真正有用的信息。如果有其他理由认为修复已经奏效,那么最好的方法是调用它们并且不要理会统计数据。根据其技术优势提出案例。另一方面,如果几乎不能保证修复是有效的——我们只是不确定——并且这里的目标是确定数据是否值得继续进行,就好像它确实有效一样,那么一个谨慎的决定制造商可能更喜欢非参数程序提供的保守置信水平。

编辑

对于(假设的)数据 {22, 24, 36, 44, 15, 20, 23},指数概率图并不是非常非线性:

替代文字

(如果这对您来说看起来是非线性的,请从指数 [25] 分布中生成七次抽取的几百次实现的概率图,以查看它们会随机摆动多少。)

因此,使用此修改后的数据集,您可以更轻松地使用Krishnamoorthy等人的方程式。( op. cit. ) 来计算预测极限。然而,调和平均值 25.08 和相对较小的 SD(大约 10)表明任何典型置信水平(例如95% 或 99%)的预测极限将远小于 223。这里的原理是使用统计洞察力并做出艰难的决定。当结果很明显时,统计程序几乎没有(额外的)帮助。

有几种方法可以解决这个问题。我解决这个问题的方法如下。

您拥有的数据来自几何分布。失败前的伯努利试验次数。几何分布有一个参数p,即每一点的失效概率。对于您的数据集,我们估计p如下:

p^1=100+22+36+44+89+24+747=55.57

所以根据 CDF,运行 223 次迭代并观察到失败的概率为:p^=1/55.57=0.018

1(1p^)223=0.983

所以运行 223 次迭代并且没有失败的概率是

10.983=0.017

因此,您似乎很可能(但不是势不可挡)已经解决了这个问题。如果您运行大约 300 次迭代,那么概率会下降到 0.004

一些笔记

  1. 伯努利试验只是抛硬币,即只有两种结果。
  2. 几何分布通常用成功(而不是失败)来表述。对你来说,机器坏了就是成功!

我认为您可以通过自举来折磨您的数据。在使用几何分布进行 cgillspies 计算之后,我玩了一会儿,想出了以下 R 代码 - 任何更正都非常感谢:

fails <- c(100, 22, 36, 44, 89, 24, 74) # Observed data
N <- 100000 # Number of replications
Ncol <- length(fails) # Number of columns in the data-matrix
boot.m <- matrix(sample(fails,N*Ncol,replac=T),ncol=Ncol) # The bootstrap data matrix
# it draws a vector of Ncol results from the original data, and replicates this N-times
p.hat <- function(x){p.hat = 1/(sum(x)/length(x))} # Function to calculate the 
# probability of failure
p.vec <- apply(boot.m,1,p.hat) # calculates the probabilities for each of the   
# replications
quant.p <- quantile(p.vec,probs=0.01) # calculates the 1%-quantile of the probs.
hist(p.vec) # draws a histogram of the probabilities
abline(v=quant.p,col="red") # adds a line where quant.p is
no.fail <- 223 # Repetitions without a fail after the repair
(prob.fail <- 1 - pgeom(no.fail,prob=quant.p)) # Prob of no fail after 223 reps with 
# failure prob qant.p

这个想法是获得概率的最坏情况值,然后在给定先验失败概率的情况下,使用它来计算在 223 次迭代后观察到没有失败的概率。最坏的情况当然是一开始的失败概率很低,这将提高在 223 次迭代后观察到没有失败而没有解决问题的可能性。结果是 6.37% - 据我了解,如果问题仍然存在,在 223 次试验后没有观察到失败的概率为 6%。

当然,您可以生成试验样本并从中计算概率:

boot.fails <- rbinom(N,size=no.fail, prob=quant.p) # repeats draws with succes-rate 
# quant.prob N times.
mean(boot.fails==0) # Ratio of no successes 

结果为 6.51%。

我自己也遇到了这个问题,并决定尝试费舍尔的精确检验。这样做的好处是,算法可以归结为你可以用 JavaScript 做的事情。我把它放在一个网页上 - http://www.mcdowella.demon.co.uk/FlakyPrograms.html - 这应该可以从那里工作,或者如果你将它下载到你的计算机(欢迎你这样做)。我认为你在旧版本中总共有 382 次成功和 7 次失败,而在新版本中总共有 223 次成功和 0 次失败,即使新版本没有更好,你也可以随机获得这个概率大约 4%。

我建议你多跑一点。你可以在网页上玩一下,看看如果你活得更久,概率会如何变化——我会选择超过 1000 的东西——事实上,我会努力把它变成我可以自动运行的东西,然后让它在一夜之间变得真正闪电战的问题。