一、提出假设

mark

当面对两个选择时,抛硬币,总能奏效。就像曾小贤想用抛硬币来选择见不见胡一菲。

在统计学中,要确定最终的结果,需要先提出假设。

假设指的是当我们没有足够的证据支持一个结果时,先可以假定一个结果。这个事先给出的假定结果,就叫做原假设(或零假设, H0,同时提出与之相对应的假设,叫做**备择假设(H1)**。

对于曾小贤抛起的硬币,我们可以先假设它最终是正面(不见),作为原假设;反面(见)为备择假设。

怎么设定零假设和备择假设?

一般,原假设是需要收集证据来反对的假设(通过已有的知识,小概率发生的事件);备择假设是收集证据来支持的假设。

有零假设,为什么还要设置备择假设?

90多年前,英国著名的统计学家哥色特(Student)曾举例解释过这个问题,他的主要思想就是人们往往都倾向于选择相信概率比较大的事件。

比如一些来自于正态总体的数据,现想检验它们的均值是不是等于a0?

假设得到检验的概率值为0.0001,虽然这个值很小,但是你不能认为这批数据的均值不等于a0,为什么呢?因为这时候你只有一个a0供你检验,概率值再小,也不能否认它发生的可能性。而此时,如果你再有一个“备胎”(值为a1)让你去检验,最后检验的概率值为0.05,比前面的值大很多,这时候你就会倾向于选择后面a1这个值,而认为原来的a0不真。所以,我们需要有“比较”,多一个“备胎”,多一份选择!(《数理统计学简史》)。

在实际的统计工作中会遇到不同的样本量和需求,对于不同的样本,我们需要提出不同的假设形式:

样本(Sample:研究中实际观测或调查的一部分个体叫样本,这些个体的数目叫样本容量(sample size,研究对象的全部称为总体

对总体的规定:总体内所有观察单位必须是同质的

对样本的规定:抽取样本的过程中,必须遵守随机化原则;样本的观察单位还要有足够的数量

1.单个样本

现在要确定一个样本值(θ)与设定的已知值(θ0)的关系

零假设(H0),备择假设(H1)

  • 单边检验I:检验样本值与已知值相比,判断数轴一侧的大小关系
    mark

  • 单边检验II:检验样本值与已知值相比,判断数轴一侧的大小关系

    mark

  • 双边检验:检验样本值与已知值是否相等

    mark

2.两个样本

  • 单边检验I:

    mark

  • 单边检验II:

    mark

  • 双边检验:

    mark

3.多个样本

mark

mark

下面以单细胞表达数据为例:

  • 列分别代表基因,正常样本的5个细胞的重复样本,癌症样本5个细胞的重复样本

  • 行代表每个基因在所有样本的FPKM值

mark

我们如果要分析在正常和癌症样本的平均表达量是否一致,也就是双边检验。

首先提出假设:

  • 原假设:该基因在两个细胞中的表达量相等,无差异(H0:μ1=μ2)
  • 备择假设:该基因在两个细胞中的表达量不相等,有差异(H0:μ1≠μ2)

然后设定显著性阈值:

这里的阈值是用来判断统计分析得到p值,如果p小于阈值,证明有统计显著性,推翻原假设。这里阈值一般会选择0.05,即p<0.05。这个值越小越严格。

在设定显著性水平a作为阈值时,会遇到两类错误,导致结果错误:

  • 第一类错误(I型错误,标记为α):也叫“弃真”,上面提到的两组表达量平均值本来是相等的。但是在判断时,认为是结果有差异的,推翻了本来正确的原假设。
  • 第二类错误(II型错误,标记为β):也叫“取伪”,类似于上面,但是这里结果接收了错误的原假设。

这里的两类错误,如果想减少其中一种错误类型的发生,就会使另一种错误发生的概率增加。

如果想同时减少两种错误的发生,就需要增加样本容量,这就是做实验要增加重复样本的原因。

接下来,验证我们提出的假设:

我们一般在检验时需要根据某种分布,求出数据对应的统计量,然后据此判断该值是否落入拒绝域(拒绝原假设的取值范围)中。

那么我们看看目前有哪些分布和检验方法,

二、选择检验方法

2.1 正态分布

这是在统计学中大名鼎鼎的一种分布,最早由德国的天文学家Moivre提出。后来,德国数学家Gauss首先将其应用于天文学研究,故正态分布也叫“高斯分布”。高斯的这项工作对后世的科学研究影响极大,以至于德国10马克的钞票上印的是高斯头像和正态分布。

mark

正态分布的函数表达式:

mark

可以描述为,随机变量X服从一个位置参数μ,尺度参数σ的概率分布,记做mark,或X服从正态分布。一般,μ和σ都是常数,μ代表数据的均值,σ代表数据的标准差。

R语言绘制正态分布:

mark

我们可以从图中看到,均值μ决定正态分布的峰值位置,标准差σ决定分布的矮胖,σ越大越胖。

R代码:

set.seed(1)
x <- seq(-10,15,length.out = 1000)
# 计算N~(-2,1)
y1 <- dnorm(x, -2,1)
# 计算N~(2,1)
y2 <- dnorm(x, 2, 1)
# 计算N~(2,4)
y3 <- dnorm(x, 2, 2)
# 绘图
plot(x, y1, type = "l", col="#f0932b", ylab = "Density", lwd=2, xlim = c(-8,10))
lines(x, y2, lwd=2, col="#4834d4")
lines(x, y3, lwd=2, col="#95afc0")
legend("topright", c("X~N(-2,1)", "X~N(2,1)", "X~N(2,4)"), col = c("#f0932b", "#4834d4", "#95afc0"), lty = c(1),text.font = 12set.seed(1)
x <- seq(-10,15,length.out = 1000)
# 计算N~(-2,1)
y1 <- dnorm(x, -2,1)
# 计算N~(2,1)
y2 <- dnorm(x, 2, 1)
# 计算N~(2,4)
y3 <- dnorm(x, 2, 2)
# 绘图
plot(x, y1, type = "l", col="#f0932b", ylab = "Density", lwd=2, xlim = c(-8,10))
lines(x, y2, lwd=2, col="#4834d4")
lines(x, y3, lwd=2, col="#95afc0")
legend("topright", c("X~N(-2,1)", "X~N(2,1)", "X~N(2,4)"), col = c("#f0932b", "#4834d4", "#95afc0"), lty = c(1),text.font = 12)

2.2 t分布(t-distribution)与T检验

t分布由Gosset于1908年首先发表,因为当时他在都柏林的健力士酿酒厂工作的原因,不能以他本人的名义发表,所以论文用学生(Student)这一笔名,因此该分布也成为称为student分布。t分布是正态分布的一种特殊情况

t分布的函数表达式:

mark

可以描述为,当X服从正态分布N(0,1)时,Y服从mark,X于Y相互独立,自由度为n的t分布,记为mark

R语言绘制t分布:

mark

不难看出,t分布和正态分布几乎一样。当自由度n趋于无穷大时,t分布会趋于正态分布。因此,针对小样本数据,可以应用t分布。

set.seed(1)
x <- seq(-10,15,length.out = 1000)
# 计算X~t(1)
y1 <- dt(x, 1)
# 计算X~t(10)
y2 <- dt(x, 10)
# 计算X~t(100)
y3 <- dt(x, 100)
# 绘图
plot(x, y1, type = "l", col="#f0932b", ylab = "Density", lwd=2, xlim = c(-8,8), ylim= c(0, 0.5))
lines(x, y2, lwd=2, col="#4834d4")
lines(x, y3, lwd=2, col="#6ab04c")
legend("topright", c("X~t(1)", "X~t(10)", "X~t(100)"), col = c("#f0932b", "#4834d4", "#6ab04c"), lty = c(1),text.font = 12set.seed(1)
x <- seq(-10,15,length.out = 1000)
# 计算X~t(1)
y1 <- dt(x, 1)
# 计算X~t(10)
y2 <- dt(x, 10)
# 计算X~t(100)
y3 <- dt(x, 100)
# 绘图
plot(x, y1, type = "l", col="#f0932b", ylab = "Density", lwd=2, xlim = c(-8,8), ylim= c(0, 0.5))
lines(x, y2, lwd=2, col="#4834d4")
lines(x, y3, lwd=2, col="#6ab04c")
legend("topright", c("X~t(1)", "X~t(10)", "X~t(100)"), col = c("#f0932b", "#4834d4", "#6ab04c"), lty = c(1),text.font = 12)

如果现在已正态分布或t分布为依据进行假设检验,该检验方法就叫t检验。

2.3 F分布(F-distribution)与方差分析

F分布,由英国统计学家R.A.Fisher提出,用Fisher的第一个字母F来命名。F分布有着广泛的应用,如在方差分析、回归方程的显著性检验中都有着重要的地位。

假设有两个独立的随机变量,这两个变量都分别符合卡方分布,它们相除以后的比率,我们就用F分布来描述。

F分布的函数表达式:

mark

可以描述为,当样本 markmark,X和Y相互独立,随机变量F服从自由度为(n, m)的F分布,记为F~F(n, m)

R语言绘制F分布

mark

R代码如下

set.seed(1)
x <- seq(0,10,length.out = 1000)
# 计算F~F(1, 1)
y1 <- df(x, 1, 1)
# 计算F~F(4, 1)
y2 <- df(x, 4, 1)
# 计算F~F(3, 10)
y3 <- df(x, 3, 10)
# 绘图
plot(x, y1, type = "l", col="#f0932b", ylab = "Density", lwd=2, xlim = c(0,10), ylim= c(0, 1))
lines(x, y2, lwd=2, col="#4834d4")
lines(x, y3, lwd=2, col="#6ab04c")
legend("topright", c("F~F(1, 1)", "F~F(4, 1)", "F~F(3, 10)"), col = c("#f0932b", "#4834d4", "#6ab04c"), lty = c(1),text.font = 12set.seed(1)
x <- seq(0,10,length.out = 1000)
# 计算F~F(1, 1)
y1 <- df(x, 1, 1)
# 计算F~F(4, 1)
y2 <- df(x, 4, 1)
# 计算F~F(3, 10)
y3 <- df(x, 3, 10)
# 绘图
plot(x, y1, type = "l", col="#f0932b", ylab = "Density", lwd=2, xlim = c(0,10), ylim= c(0, 1))
lines(x, y2, lwd=2, col="#4834d4")
lines(x, y3, lwd=2, col="#6ab04c")
legend("topright", c("F~F(1, 1)", "F~F(4, 1)", "F~F(3, 10)"), col = c("#f0932b", "#4834d4", "#6ab04c"), lty = c(1),text.font = 12)

与F分布相对应的是方差分析,该方法可以评估数据间的波动程度。目的在于检验两个或多个样本均值是否有统计学意义。

2.4 卡方分布 (chi-square distribution)与卡方检验

卡方分布是由Abbe于1863年首先提出的,后来由海尔墨特(Hermert)和现代统计学的奠基人之一的卡·皮尔逊(C K.Pearson)分别于1875年和1900年推导出来。

如果有n个独立的随机变量,这些变量都服从标准正态分布,那么这些随机变量的平方和会构成一个新的随机变量,这个随机变量分布规律就是卡方分布

卡方分布的函数表达式:

mark

可以描述为,当样本 mark,其中i=1,2,…,n,Y服从自由度为n的卡方分布,记为 mark

R语言绘制卡方分布

mark

set.seed(1)
x <- seq(0,10,length.out = 1000)
# 计算Y~x(1)
y1 <- dchisq(x, 1)
# 计算Y~x(5)
y2 <- dchisq(x, 5)
# 计算Y~x(10)
y3 <- dchisq(x, 10)
# 绘图
plot(x, y1, type = "l", col="#f0932b", ylab = "Density", lwd=2, xlim = c(0,10), ylim= c(0, 1))
lines(x, y2, lwd=2, col="#4834d4")
lines(x, y3, lwd=2, col="#6ab04c")
legend("topright", c("Y~x(1)", "Y~x(5)", "Y~x(10)"), col = c("#f0932b", "#4834d4", "#6ab04c"), lty = c(1),text.font = 12set.seed(1)
x <- seq(0,10,length.out = 1000)
# 计算Y~x(1)
y1 <- dchisq(x, 1)
# 计算Y~x(5)
y2 <- dchisq(x, 5)
# 计算Y~x(10)
y3 <- dchisq(x, 10)
# 绘图
plot(x, y1, type = "l", col="#f0932b", ylab = "Density", lwd=2, xlim = c(0,10), ylim= c(0, 1))
lines(x, y2, lwd=2, col="#4834d4")
lines(x, y3, lwd=2, col="#6ab04c")
legend("topright", c("Y~x(1)", "Y~x(5)", "Y~x(10)"), col = c("#f0932b", "#4834d4", "#6ab04c"), lty = c(1),text.font = 12)

如果现在已卡方分布为依据进行假设检验,该检验方法就叫卡方检验。

卡方检验

应用:

  • 检验数据符合哪种分布,包括正态分布,泊松分布,卡方分布等
  • 检验列联表数据

列联表,又叫交互分类表。是指同时依据两个变量的值,将所研究的个案分类。我们会得到两个变量的分组,然后比较各组的分布情况,寻找变量间的关系。

比如,依据是否吸烟与是否患肺癌进行分类,然后可以通过比较这些数值,寻找吸烟与患肺癌之间是否相关。

2.4.1 检验数据是否服从某种分布

现在,统计到一个班级里所有人的体重,我们看看是否符合正态分布:

2.4.1.1 使用绘图

查看数据密度分布与正态分布曲线的一致性

mark

蓝色为数据密度分布曲线,红色为正态分布曲线,通过观察,我们会发现这组数据虽然与标准分布有区别,但是总体是符合正态分布的。

w <- c(63.0, 62.1, 63.8, 57.0, 56.2, 71.1, 72.0, 63.5, 74.2, 67.2, 65.4, 80.1, 66.8, 51.5, 48.4, 54.2, 58.9, 68.3, 65.1)
hist(w, freq = FALSE)
lines(density(w), col = "blue")
x <- (min(w)):(max(w))
lines(x, dnorm(x, mean(w), sd(w)), col = "red"w <- c(63.0, 62.1, 63.8, 57.0, 56.2, 71.1, 72.0, 63.5, 74.2, 67.2, 65.4, 80.1, 66.8, 51.5, 48.4, 54.2, 58.9, 68.3, 65.1)
hist(w, freq = FALSE)
lines(density(w), col = "blue")
x <- (min(w)):(max(w))
lines(x, dnorm(x, mean(w), sd(w)), col = "red")

也可以使用qq图判断:

mark

可以发现样本数据偏离直线不远,判断数据基本来自于正态分布。

d <- c(100, 63.8, 56.2, 71.1, 72.0, 63.5, 74.2, 67.2, 65.4, 80.1, 66.8, 51.5, 48.4, 54.2, 58.9, 68.3, 65.1)
qqnorm(d)
qqline(dd <- c(100, 63.8, 56.2, 71.1, 72.0, 63.5, 74.2, 67.2, 65.4, 80.1, 66.8, 51.5, 48.4, 54.2, 58.9, 68.3, 65.1)
qqnorm(d)
qqline(d)
2.4.1.2 使用卡方检验
d <- c(63.8, 56.2, 71.1, 72.0, 63.5, 74.2, 67.2, 65.4, 80.1, 66.8, 51.5, 48.4, 54.2, 58.9, 68.3, 65.1)
# 卡方检验
chisq.test(dd <- c(63.8, 56.2, 71.1, 72.0, 63.5, 74.2, 67.2, 65.4, 80.1, 66.8, 51.5, 48.4, 54.2, 58.9, 68.3, 65.1)
# 卡方检验
chisq.test(d)

结果得出p-value = 0.3107,p>0.05,认为该班体重分布符合正态分布

2.4.1.3 使用Kolmogorov-Smirnov检验
d <- c(63.8, 56.2, 71.1, 72.0, 63.5, 74.2, 67.2, 65.4, 80.1, 66.8, 51.5, 48.4, 54.2, 58.9, 68.3, 65.1)
ks.test(d, "pnorm", mean(d), sd(d))
# 如果数据中有重复值,会报错:Kolymogorov - Smirnov检验里不应该有连结
# 需要在数据加点噪音,不会影响数据分布和检测结果
ks.test(jitter(d),"pnorm",mean(d),sd(d)d <- c(63.8, 56.2, 71.1, 72.0, 63.5, 74.2, 67.2, 65.4, 80.1, 66.8, 51.5, 48.4, 54.2, 58.9, 68.3, 65.1)
ks.test(d, "pnorm", mean(d), sd(d))
# 如果数据中有重复值,会报错:Kolymogorov - Smirnov检验里不应该有连结
# 需要在数据加点噪音,不会影响数据分布和检测结果
ks.test(jitter(d),"pnorm",mean(d),sd(d))

结果得到p-value = 0.7857,p>0.05,认为该班体重分布符合正态分布

2.4.2 检验列联表数据

mark

x <- c(60, 3, 32, 11)
dim(x) <- c(2,2)
chisq.test(xx <- c(60, 3, 32, 11)
dim(x) <- c(2,2)
chisq.test(x)

得到p-value = 0.004855,p<0.05,可认为患肺癌与吸烟有关

三、根据P值,得到结论

依据不同的数据分布,选择合适的检验方法,我们会得到相应的P值,最终我们会根据P值来确定最后的结论。需要注意的是:

  • 结论不能是绝对的,结论中最好不包含“一定,肯定”等,这样的结论不严谨
  • 显著性水平a的大小用来确定拒绝区间,进而确定是否拒绝原假设,也就是说数据间是否有差异,是定性用的。通过它的值是不能确定差异大小的,要定量的话,需要用到差异倍数(Fold Change,FC)值。可以使用火山图绘制P值与FC值来筛选并可视化最终的差异数据。
  • 显著性水平a,也就是P值确定的阈值,0.05, 0.01,这个值是约定俗成的规则,不是绝对的值。只要有足够的理由或文献支持,可以根据自己的需求来调节

使用统计学来分析自然或社会规律的数据,只是为客观事物提供统计学意义的科学参考,并不代表事物一定会向结论发展或发生。但是,如果你想让你的结论为大众所接受,那你在采集和分析数据时,就应遵守数理统计学方法的规范,这才能使自己的结论建立在健全的科学基础上,得到公众的认可。陈希孺教授在《数理统计学简史》 中讲数理统计方法是一个中立性的工具,这“中立”的含义是指,它既不在任何问题上有何主张,也不维护任何利益或在任何学科中坚持任何学理。作为一个工具,谁都可以使用,若是谁不同意这种方法,可以不用它,而去做单纯定性式的讨论。

有时候,我们做的决定并不是为大众所接受的,而是取决于主体的,就像前面到曾小贤抛硬币做决定的同时内心还有段独白:

当面对两个选择时,抛硬币总能奏效,

并不是因为它总能给出对的答案,

而是在你把它抛在空中的那一秒里,

你突然知道你希望它是什么……