草庐IT

避不开的假设检验

Karen静舒 2023-03-28 原文

假设检验是六西格玛的基础,不了解假设检验,后面的各种控制图,过程能力,回归分析,试验设计的操作和解读都无从谈起。谈到假设检验,经常有辅导过的黑带同学向我诉苦:不好意思,又搞混了。什么时候该拒绝,什么时候则不能拒绝原假设呢?还有那句英文顺口溜,If the P is low, the null must go!到底是什么含义?

既然避不开,我们不妨深入学习,加强理解。冥冥之中,自有天意,英文单词(ESCAPE-避开)刚好可以帮我们轻松记住实施假设检验的五个步骤。E代表Establish,设立原假设和备择假设。S代表Select,选择显著性水平。Ca代表Calculate,计算出统计检验的结果,即P值。P代表Process,将P值和显著性水平进行对比。E代表Evaluate,评估结果并做出判断。

五步搞定假设检验

假设检验的意义在于通过样本去推断总体。下面我将详细介绍每一步的注意事项,让大家不仅明白假设检验的含义,还会应用假设检验对当下和未来的行动做出合理判断。

第一步、设定原假设(H0),与原假设相左的是备择假设(Ha)。

当我们设定假设检验后,原假设只有在证伪的情况下,也就是说推翻原假设时,假设检验才有意义。为什么呢?因为只有在原假设被证伪的前提下,才能对备择假设,也就是整体做出推断。正因为原假设不成立,我们才不得不接受它的对立面,即备择假设。反之,如果不能够证伪,也就是推翻不了原假设,那么对备择假设根本没有判断。只能说在有限的样本内,对样本本身做了一次判断。

举例来说,法官判断一个嫌疑犯是否有罪的依据是有没有切实的证据。原假设是无罪,备择假设是有罪。如果法官有证据,那么就推翻了原假设。推翻原假意味着接受备择假设,也就是嫌犯有罪。但是,如果法官没有证据,推翻不了原假设。疑罪从无,嫌犯被当庭释放,这并不意味着嫌犯真的无罪,而只是法官在此次审判中没有找到证据,也许以后又有证据了。

谈到原假设和备择假设的设定。大家还要记住的是原假设一定要容易被证明。我们反复强调假设检验是为了证伪,只有推翻了原假设,才能接受备择假设。比如,我们要证明脸上长包跟吃油腻食物的之间的关系。如果把原假设设定为脸上长包是因为吃了油腻食物。显然就不容易证明,也不容易推翻。因为造成脸上长包的原因很多,比如压力大,过敏,内分泌失调,而不仅仅是因为吃了油腻食物。但是如果我们把原假设定成脸上长包跟吃油腻食物没关系,备择假设就是有关系,这样就方便证明。方法就是我们一日三餐吃油腻食物,坚持一周,看看脸上是不是长了包。

第二步、选择能接受的显著性水平(significance level),或者说是阿尔法值

既然假设检验是为了推翻原假设,从而接受备择假设。换句话说是为了证伪。如何才能证伪呢?我们的判断的依据就是小概率的事件不太可能发生。比方说花两块钱买一张彩票就中一百万这样的好事发生的可能性微乎其微。所以说小概率事件发生的可能性非常低是支持证伪的前提。什么才叫小概率事件呢?在统计学上,我们一般认为,如果某个随机事件发生的概率只有5%,我们就认为它是一个小概率事件。所以,5%是常用的显著性水平。在实际工作中,比如说对业务的某项指标或某个产品的性能或可靠性做判断的时候,这个显著性水平的高低由我们自行去做判断。这又是为什么呢?因为我们的选择,无论是5%,10%,亦或是1%,它表明我们愿意承担小概率事件发生而带来的风险,并将它作为推翻原假设的依据。因此,无论这个显著性水平设为何值,在推翻原假设的同时,我们也承担了相应的风险。风险的大小就是我们设定的能接受小概率事件发生的这个值。但是即使是小概率事件,只是它发生的可能性非常低,假如它真的很不幸地发生了,我们就要为当时想当然地把它推翻而承担相应的风险。在统计学上,这种风险称为阿尔法风险(α risk)。与阿尔法风险对应的是贝塔风险(β risk)。所谓贝塔风险,就是本来有问题或不正常,我们却误把它判断为正常。需要强调的是,这个值如果设得不合理的话,不仅会增加判断的难度、准确性、还会增加成本。

举例讲现在的动态清零。阿尔法风险就是我们能承受的假阳性的比例。如果误判为假阳性,当事人被要求居家或集中隔离,给工作生活带来诸多不便并且增加了社会成本。但是好过有假阴性的人作为传染源,引发更多社会问题。因此,这也是为什么宁可承担更大的阿尔法风险,也要尽可能避免贝塔风险的发生。因为在样本量不足够大的时候,阿尔法风险和贝塔风险是此消彼涨的关系。

第三步、收集数据,实施统计检验,计算出P

既然假设检验只有在推翻原假设时才更有意义,而推翻原假设的依据是我们认为小概率事件不可能发生。接下来就要去找样本做相应的统计检验,然后根据验证的结果去做判断。判断的标准就是假定原假设为真的的情况下计算出这件事儿发生的概率有多高或多低,也就是P值。

第四步、将P值显著性水平比照

如果原假设为真的情况下,这件事儿发生的概率(P值)非常非常得小,比之前设定的显著性水平,比如5%还小,那当然要推翻原假设,因为原假设发生的可能性实在太低了,几乎不可能发生。相反,如果P值比较高,比如P值等于20%,它意味着在我们选定的样本中,原假设为真的可能性有20%之高,远远超过我们设定的显著性水平,这时候就不能推翻原假设。谨记:推翻不了原假设的时候,并不意味着对备择假设有任何的判断。只能说在有限的样本里面,对原假设做了一次判断,样本之外,无从判断。

第五步、将假设检验的判断转换成实际的改善行动

现实工作中,比如我们需要对产品的某项性能是否提升用假设检验做出判断。如果有限的样本量做出的统计检验不能推翻原假设,那么我们可能要考虑增加样本量继续做判断。如果样本量增加后,虽然勉强可以推翻原假设,但效果不显著,那么我们可以针对要优化的性能做进一步地改善,让效果更明显。

通过以上讲解,希望大家已经弄清If the P is low, the null must go!的含义。同时理解对假设检验做出严谨判断的正确表达要么是推翻原假设(Reject H0),要么是不能推翻原假设(Fail to reject H0)。

有关避不开的假设检验的更多相关文章

  1. ruby-on-rails - 检验 gem 的正确方法 - 2

    如果gem具有rails依赖项,您认为以可以独立运行或在rails项目下运行的方式编写gem测试更好吗? 最佳答案 gem应该是一段独立运行的代码。否则它是应用程序的一部分,因此测试也应该独立创建。通过这种方式,其他人(假设)也可以执行测试。如果测试依赖于您的应用程序,则其他人无法测试您的gem。此外,当您想要测试您的gem时,它不应该因为您的应用程序失败而失败。在您的gem通过测试后,您可以测试应用程序,知道您的gem运行良好(假设您测试了所有内容)。gem是否依赖于Rails不是问题,因为Rails也已经过测试(您可以假设它工作

  2. javascript - 我可以假设 promise 中的错误会冒泡到新的 Promise 并捕获它吗? - 2

    我有一个函数,如果找到任何内容,它将查找缓存,否则它将继续获取数据并设置缓存。这是非常标准的。我想知道错误是否发生在最内部的函数中,它会一直冒泡到最外层的Promise吗?所以,我可以只用一个catch而不是一个。这是我的代码。我正在使用Bluebirdvar_self=this;returnnewPromise(function(resolve,reject){_self.get(url,redisClient).then(functiongetCacheFunc(cacheResponse){if(cacheResponse){returnresolve(JSON.parse(ca

  3. javascript - d3 似乎假设我知道 csv 的列名? - 2

    我有生成的csv文件,我正在尝试将它们加载到d3中以绘制它们。列名是基于数据的,所以我基本上无法提前知道它们。通过测试,如果我知道列的名称,我就能够加载这些数据并将其绘制得很好而且很好......但我不知道我的用例。我如何在d3中处理这个问题?我似乎无法在网上或文档中找到任何帮助/引用此信息的内容。当我从d3.csv登录到控制台数据[0]时,我可以看到有两列和为它们读取的值,但我不知道如何在不知道的情况下任意引用数据的第1列或第2列提前列的名称。一般来说,我想避免这种情况,因为我知道我的时间戳在第1列中,而我的数据在第2列中,如果这有意义的话。编辑,我的答案使用d3.entries来帮

  4. javascript - 为什么 Twitter Bootstrap 网格系统有 12 列而不是 10 列(假设是 100%)? - 2

    如果10可以表示100%(例如在CSS宽度上),为什么这个网格系统有12列而不是只有10列?我想其他框架也有这种方式。 最佳答案 12可以被2、3、4、6平分,这样你就可以轻松做出2、3、4列同格的布局。这对10列的网格来说不是很好。 关于javascript-为什么TwitterBootstrap网格系统有12列而不是10列(假设是100%)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/que

  5. 去超时不开火 - 2

    为了好玩,我在Go中实现了一些排序算法,现在我想测试它们对随机整数的性能。所以我写了下面的程序。我遵循了类似的格式:https://gobyexample.com/timeouts但是,似乎超时未正确触发。下面是我的代码:packagemainimport("allanpinkerton.com/algorithms/sorting""fmt""math/rand""os""strconv""time")//PrintsoutthetimeelapsedsincestartfunctimeExecution(startTimetime.Time,functionNamestring,i

  6. Go mod 下载良好,但 golint 在假设下载的依赖项上失败 - 2

    在GitlabCI中,我需要指定GITLAB_DEPLOY_TOKEN,因为我有一些私有(private)存储库。这适用于编译步骤。但是当我执行golint时,它会再次下载所有依赖项,并且在私有(private)依赖项上会失败。我可以添加相同的gitconfig指令,图片:golang变量:包路径:/go/src/gitlab.com/company/sam/daemonPACKAGE_API_NAME:registry.gitlab.com/company/sam/daemonREGISTRY_URL:https://registry.gitlab.comDOCKER_DRIVER:

  7. go - 我可以假设 unix 时间戳将随着 go 增加吗? - 2

    例子...funcMakeTimestamp()int64{returntime.Now().UTC().UnixNano()/int64(time.Nanosecond)}这将创建类似于1539222678608597000我将这些数据存储在mongodb上,我最终会使用类似的东西:db.getCollection('xxxxx').find({"timestamp":{$lte:1539194688262205259,$gte:1539176688262205057}},{"venue":1},{"product":0})https://play.golang.org/p/--rH

  8. c++ - 我在哪里可以找到与 Clang 假设的目录结构相同的 mingw32? - 2

    抱歉,我在哪里可以找到与Clang假设的目录结构相同的mingw32?我从这里下载了32位版本http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/还有一个来自这里http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.8.1/32-bit/threads-posix/dwarf/但所有这些都与我运行时clang搜索的内容不同:c

  9. c# - 假设注册表配置单元始终相同有多安全? - 2

    我正在编写一个允许您与注册表交互的控制台应用程序。应用程序以设置为空的字符串path开始。当用户键入ls时,我希望它列出所有注册表配置单元(因为它们当前位于本地计算机的顶层)。然而,经过一些广泛的研究后,我无法找到一种方法来获取当前机器上的所有注册表配置单元。假设这些hive将一直在那里有多安全?HKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERSHKEY_CURRENT_CONFIG如果认为它们始终存在是不安全的,我如何动态获取它们?(很抱歉,如果“hive”不是根级子项的正确术语,我对处理注册表还很陌生)

  10. node.js - 我可以假设 `node` 总是在 NPM 设置的 $PATH 中吗? - 2

    几年来我一直将NPM作为一个简单的构建工具使用,我可以假设通过package.json安装的每个CLI工具都可以在PATH,因为NPM添加了./node_modules/.bin路径。但是当我准备编写一个小的Node脚本来做一些家庭清理杂务时,如果NPM实际上在它提供给用户的PATH中有node可执行文件,我有点担心。这可能看起来很愚蠢,因为./node_modules/.bin中的所有脚本都依赖于node存在,以便Unix上的包装器脚本能够找到它,但我我认为Windows中可能会发生一些神奇的事情。也许他们使用了自己的其他魔法。或者其他的东西。没关系,真的,我只想能够断言:node可

随机推荐