P<0.05就够了?还要校正!校正!3个方法献上

(2017-01-03 17:55:12)

  分类: 数理统计
(转  医生科研助手 解螺旋 微信公众号)
 
当有多组数据要比较时,不管是ANOVA,还是非参的Kruskal-Wallis检验等等,都只能看出整体的几组之间有没有差异。要是有,那么差异在哪里呢?还要做个两两比较才知道。OK,两两比较又要怎么做?有的小伙伴自然而然地会想到,每两组之间做一个T检验不就好了。To naive!这是个吃力不讨好的活,用这样的方式打开T检验会增加I型错误的风险。
 
I型错误,又称拒真错误,因为光看到P<0.05我就以为两组有差别,但这个P值是有bug的,这两组实际上没差别。你问这P值怎么了?!这就遇到了多重检验问题(multiple comparison problem)。
 
1. 什么是多重检验问题?
我们选择P值以0.05为界,来鉴定两组是否有差异,但那是两组!两组!当组数比较多时,这里就有了一个坑,叫族错误率(Family-wise Error Rate, FWER,又称Experiment-wise significant level),即一族(多重)检验做下来,犯I型错误的概率。每个检验中犯I型错误的概率用α表示,也就是显著性水平,就是我们紧盯着的0.05——每个检验里,我们只允许自己有5%的机会犯I型错误。
 
但要是做了k次检验,整个实验出现I型错误的概率就会积累:一个检验犯错误的概率是α,不犯错误的概率就是1-α;于是2个检验都不犯错误的概率就是(1-α)×(1-α),k个检验都不犯错误的概率就是(1-α)^k,最后k个检验会犯错误的概率就是1-(1-α)^k。即:

比如我们的实验有4个组,那么两两比较就要做的次数就是:C(4, 2)=4×3/2×1=6次。把k=6代入公式FWER=1-(1-0.05)^6≈0.26,也就是说,这一溜检验下来,如果每个检验都给5%的机会去犯I型错误,那最后整个实验犯I型错误的概率就积累到了26%!
 
所以为了控制好最后整个实验犯I型错误的概率,就要对每个两两比较的P值做校正,我们不能再纵容自己有5%的概率犯I型错误,这个容忍度要更小。
 
2. 多重检验怎么校正?
事后检验(post-hoc test)就是得知各组间有差异之后,用来寻找具体差异在哪的一系列方法,其中就有一些校正P值的方法。常用的有Bonferroni法和Dunn- Sidák法。
 
2.1 Bonferroni法
这是最常用也是简单粗暴的方法。做了k个比较,那就直接用0.05/k来生成一个新的P值(记作P’)。4组数据做6次两两检验,用则P’=0.05/6≈0.0083。就是说,如果A组和B组比较的P值为0.032>P’,应该认为这两组之间没有统计学差异;B组和C组比较的P值为0.006
 
2.2 Dunn-Sidák法
比Bonferroni精致一些。做了k个两两比较,那么:

咦,是不是和FWER那个有点像?其实就是从它倒推过来的啊~.~4组数据做6次比较,那么P’值应该设在1-(1-0.05)^1/6≈0.0087。
 
所以如果你非要选择T检验(正态、方差齐)或Mann-Whitney U检验(非参)等来做两两比较,那么还要选用以上两种方法之一去校正P值,来判断组间是否有差异。
 
2.3 Fisher最小显著差异法(Fisher LSD)
不过,也并不是所有的事后检验法都要对多重比较做校正,比如Fisher最小显著差异法(Fisher least significant difference test,Fisher LSD)。它可以说是T检验的延伸,不同的是,T检验时用到的标准差只考虑正在比较的两个组,而Fisher LSD要考虑所有样本的标准差,所以它才敢这么任性,比直接用T检验稍微准确一些。但由于不作校正,它又比较宽松。
 
在SPSS里面,“分析→比较均值→单因素方差分析→事后比较”的对话框里就有LSD,它下面赫然便是Bonferroni和Sidak。

如果在这里选择Bonferroni或Sidak,下边的显著性水平填0.05是没问题的,可以用它来做判断。因为此处是用相应的方法校正过的,不信你用T检验比较一下其中2组数据,再跟Bonferroni或Sidak计算结果中相应的2组对比一下就知道了。
 
3. 三种方法如何选择?
显然,前两种方法都相对较保守,因为要求的P值太小太严格,当我判断一个检验结果没有差异的时候,实际上它可能是有差异的,这就是II型错误,又称受伪错误。但像LSD这样任性的,的确比较敏感,更容易发现差异,可是又容易犯I型错误。到底要闹哪样?
 
其实如何选择是没有金标准,看具体实验中,犯哪种错误后果比较严重。当然也得看杂志和审稿人的要求,听说有小伙伴不做校正会被打回来要求做个Bonferroni,这时如果校正过后导致数据解读方向扭转,怕是文章得重写。有一种观点认为,当比较次数在10次(即5组数据)以内时,用Bonferroni比较好比较次数较多时,对I型错误也可以稍稍宽容。

P<0.05就够了?还要校正!校正!3个方法献上的更多相关文章

  1. 驱动开发学习笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇

    驱动开发读书笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇 下面这段摘自 linux源码里面的文档 : 内核版本2.6.22Doc ...

  2. nyoj 125-盗梦空间 (数学ans += temp * 60 * pow(0.05, cnt))

    125-盗梦空间 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:10 难度:2 题目描述: <盗梦空间>是一部精彩的影片,在这部电影里,Cobb等人可以进入 ...

  3. 【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动

    1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫“hellotest01”的项目. 新建活动FirstActivity,勾选“Generate Layout File”和“Launche ...

  4. Vue2.0 引用 exif.js 实现调用摄像头进行拍照功能以及图片上传功能

    vue组件代码 <template> <div> <div style="padding:20px;"> <div class=" ...

  5. SpringBoot2.0 基础案例(14):基于Yml配置方式,实现文件上传逻辑

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.文件上传 文件上传是项目开发中一个很常用的功能,常见的如头像上 ...

  6. 【8.0.0_r4】AMS分析(十六)(ActivityManagerService.java上)

    代码位于frameworks/base/services/core/java/com/android/server/am/,一共有七十个文件. Java源码位于package com.android. ...

  7. 在ios8上 [TableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];不起作用 经过测试加入下面方法 在ios7 8上都可以正常工作

    -(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)] ...

  8. Oracle Database 11.2.0.4.0 已在 中标麒麟Linux x86-64 NeoKylin Linux Advanced Server 6 上通过认证

    啥都不说了,上截图:

  9. 【JMeter4.0学习(二)】之搭建openLDAP在windows8.1上的安装配置以及JMeter对LDAP服务器的性能测试脚本开发

    目录: 概述 安装测试环境 安装过程 配置启动 配置搭建OpenLDAP 给数据库添加数据 测试查询刚刚插入的数据 客户端介绍 JMeter建立一个扩展LDAP服务器的性能测试脚本开发 附:LDAP学 ...

随机推荐

  1. 昆虫之膜翅目(Hymenoptera)

    1.简介 膜翅目昆虫(sawflies, wasps, ants, and bees,叶蜂.黄蜂目.蚂蚁目和蜜蜂目)是四大种类繁多的昆虫目之一,包括15.3万多种已知昆虫,可能还有多达100万种尚未发现 ...

  2. Bootstrap 轮播

    [Bootstrap 轮播] 1.要设置一个轮播界面,需要注意以下几点: 1)根div 必须为 class="carousel slide" 2)根div下含有三块子div a)& ...

  3. 数据类型&分支流程控制(2)

    1.数据类型 1.数据类型 局部变量:书写在方法中的变量: 全局变量:书写在类中,与方法平级的变量: -如果没有给变量赋初值 -全局变量会默认拥有一个初始值 -局部变量将没有初始值,这个时候不能使用这 ...

  4. Java 几种锁

    自旋锁 自旋锁顾名思义,它会等待一定时间(自旋),在这期中会什么都不做就是等资源被释放,好处在于没有了内核态用户态切换的效率损失,但是如果它一直不能访问到资源的话就会一直占用cpu资源,所以它会循环一 ...

  5. PHPActiveRecord 学习一

    #连接数据库 <?phprequire_once dirname(__FILE__) . '/../../ActiveRecord.php'; // initialize ActiveRecor ...

  6. 在 Android Studio 上调试数据库 ( SQLite ) (转)

    转自:http://c.colabug.com/thread-1781696-1-1.html 以前 Eclipse 时代,调试 SQLite 都是将数据库文件导出到电脑,然后再用软件打开查看.现在我 ...

  7. vue 定时器的问题

    在项目中,我们经常会使用到定时器setInterval(),可是很多时候我们会发现,即使我退出当前页面,定时器依然在工作,非常消耗内存,所以我们要进行手动清理: 将定时器保存在变量中,退出页面时清除变 ...

  8. pta_l1-6(连续因子)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805138600869888 题意:给定n,求n的最长的连续子因 ...

  9. 第十章 优先级队列 (c)堆排序

  10. Codeforces Round #450 (Div. 2)

    Codeforces Round #450 (Div. 2) http://codeforces.com/contest/900 A #include<bits/stdc++.h> usi ...