虽然很多人一入学就有接触概率统计等课程,但因为课程本身对于数学要求比较高,然后又比较抽象,所以很有可能学完以后很快就抛之脑后(对,说的就是我),大约最后只留下了p值小于0.05就很开心的印象。
最近刚结束生物统计课的助教生涯,想与大家分享一下非常非常非常形象的p value的计算方法,希望能加强大家的理解。
无论是从事干实验还是湿实验研究的人大概都知道p value是假设检验中进行检验决策的一个重要依据,一般以p value是否小于0.05来衡量是否具有统计学差异。拿一个简单的两群体t test来说:有两组病人的血压值,一组病人使用了某种降压药,一组没有使用药物,如果群体量不是很大并且数据基本满足正态分布,那么就可以通过很简单的t test来检验用药组和非用药组的血压值是否有显著差异,进而说明药物是否真的有效(此处大概已经有人准备祭出SPSS、SAS、R或者Excel等一系神器了)。但是这个t test中的p value到底是怎样一个直观的存在呢?
我们可以用R模拟随机生成两组数据作为样本,分别为用药组(drug组)和非用药组(control组)的血压值。这里使用的随机函数是rnorm。rnorm(x,y,z) 用以表示随机生成x个符合均值为y、标准差为z正态分布的数值:
所以在我们的样本中,drug组中有30例样本,control组中有40例样本。两组血压的分布直方图画出来大概是这个样子:
然后请静静忘记我们生成数据的过程,包括均值啊、标准差啊等等,勇敢地告诉自己现在只有两个不同组别的血压数据!
通过简单地计算,我们可以得到样本中drug组均值为137.06,标准差为10.61;control组均值为141.47,标准差为6.91,两组数据独立且均符合正态分布。那么到底怎样才能手动检验两组数据是否有差别的呢?
首先,假设检验的前提是作出假设,这里很明显,无效假设就是drug组和control组的血压值均值没有差别,备择假设就是均值存在差别。
依照数据的特征,我们可以生成一个两组血压均值差的正态分布(默念:两个独立的正态分布的任意线性组合仍服从正态分布)。通过计算,我们可以得到它的均值为0(需要满足无效假设),标准差为2.22。通过计算机模拟抽取10000个值(rnorm(10000,0,2.22)),绘制分布图如下:
也就是说,如果两组数据均值没有差别,它们两组抽样的均值差就是符合如此乖巧的正态分布。
扭头看下我们手上的数据,两组数据的均值差为-4.41(137.06-141.47),那么这个差值或者比它更凶残的情况出现的情况有多少呢?在模拟的10000次抽样中,有356个结果小于等于-4.41,215个结果大于等于4.41,也就是落在了蓝色区域。
所以在10000次模拟结果中一共有571次出现了比当前样本差值更大的情况,占比为0.0571,对照p value的定义“当原假设为真时所得到的样本观察结果或更极端结果出现的概率”,不难发现此次检验中p value即为0.0571,大于0.05,不能拒绝无效假设,两组间的血压值没有显著差别。
使用R自带的函数(t.test)做检验,得到p value为0.05345406,和我们计算出来的p value是基本相符的。
你大约有点困惑了 诶我们不是产生随机数的时候已经给他们设定了不同的平均值么!?大约要遗憾的告诉你可能由于我们设定的两组的标准差有点大,数据分布的范围较广,造成两者抽样相差不大的趋势,所以两组之间存在的差别更有可能认为是抽样误差所造成的。如果降低标准差的设定,相信你就会得到你想要的小惊喜。
欢迎关注
点击以下「关键词」,查看往期内容:
一个物种一个家
TCGA | 小工具 | 数据库 |组装| 注释 | 基因家族 | Pvalue
基因预测 |bestorf | sci | NAR | 在线工具 | 生存分析 | 热图
生信不死 | 初学者 | circRNA | 一箭画心| 十二生肖 | circos
舞台|基因组 | 黄金测序 | 套路 | 杂谈组装 | 进化 | 测序简史