文章阅读目录大纲
零分布(null distribution)是指在假设零假设(null hypothesis)成立的情况下,某个统计量随机取值的概率分布。在统计假设检验中,我们通常提出一个零假设(例如“两组数据没有显著差异”或“观察到的模式仅由随机因素造成”),然后根据观测数据计算一个检验统计量。零分布描述了这个统计量在零假设为真时的分布情况。通过将实际观测到的统计量与零分布进行比较,我们可以计算出P-value:即在零假设下,出现等于或更极端观测结果的概率。如果P-value很小(例如低于预设的显著性水平α),我们就认为零假设不太可能成立,从而拒绝零假设,认为观测结果是统计显著的。
构建零分布的方法有多种,取决于问题的复杂性和可用的模型:
- 解析模型(参数模型):当统计量的分布已知且可推导时,可以使用理论公式计算P-value。例如,二项分布、泊松分布、正态分布等都可用于描述特定零假设下的统计量分布。在这种情况下,零分布是解析已知的,可以直接计算P-value。
- 置换检验(Permutation Test):当没有现成的理论分布或数据不满足参数假设时,可以通过随机置换来构建经验零分布。具体做法是将样本标签随机打乱,重新计算统计量,重复成千上万次,从而得到该统计量在“无真实效应”情况下的分布。然后根据实际观测统计量在这个经验分布中的位置计算P-value。置换检验不依赖数据分布假设,因此非常灵活,但计算成本较高。
- 蒙特卡洛模拟:与置换检验类似,但通过生成符合零假设的随机数据来构建零分布。例如,在序列分析中,可以生成大量与背景组成相同的随机序列,计算某模式出现的频率,从而得到该模式在随机情况下的分布。
无论采用哪种方法,零分布的核心思想都是量化“如果零假设成立,我们观测到的结果有多极端”。P-value就是衡量这种极端程度的指标。需要注意的是,P-value本身并不衡量零假设为真的概率,而是衡量数据与零假设的兼容程度。P-value越小,表示在零假设下观测到当前结果或更极端结果的概率越低,从而提供证据反对零假设。
在生物信息学中,零分布和P-value计算被广泛应用于评估各种分析结果的统计显著性,例如motif发现、序列比对、通路富集分析以及宏基因组reads的k-mer分类等。
VisualBasic中实现一个零分布检验框架
Public MustInherit Class NullHypothesis(Of T)
Public ReadOnly Property Permutation As Integer
Sub New(Optional permutation As Integer = 1000)
_Permutation = permutation
End Sub
''' <summary>
''' generates the random set with <see cref="permutation"/> elements.
''' </summary>
''' <returns></returns>
Public MustOverride Function ZeroSet() As IEnumerable(Of T)
Public MustOverride Function Score(x As T) As Double
Public Function Pvalue(score As Double, Optional alternative As Hypothesis = Hypothesis.Greater) As Double
Dim zero As T() = ZeroSet.ToArray
Dim n As Integer
Select Case alternative
Case Hypothesis.Greater
' mu > mu0
n = Aggregate x As T
In zero.AsParallel
Let per_score As Double = Me.Score(x)
Where per_score >= score
Into Count
Case Hypothesis.Less
' mu < mu0
n = Aggregate x As T
In zero.AsParallel
Let per_score As Double = Me.Score(x)
Where per_score <= score
Into Count
Case Hypothesis.TwoSided
' 计算观测统计量的绝对值,用于双侧检验判断极端性
Dim abs_score As Double = std.Abs(score)
' 双侧检验:置换统计量的绝对值 >= 观测统计量的绝对值
n = Aggregate x As T
In zero.AsParallel
Let per_score As Double = Me.Score(x)
Let abs_per_score As Double = std.Abs(per_score)
Where abs_per_score >= abs_score
Into Count
Case Else
Throw New InvalidProgramException($"unknown alternative hypothesis: {alternative}!")
End Select
If alternative = Hypothesis.TwoSided Then
Return 2 * (n + 1) / (Permutation + 1)
Else
Return (n + 1) / (Permutation + 1)
End If
End Function
End Class
- 零分布原理及其在生物信息学中的应用 - 2025年12月15日
- 宏基因组测序数据基因丰度估算方法理论 - 2025年12月8日
- 最低共同祖先(Lowest Common Ancestor, LCA)算法讲解 - 2025年12月2日

No responses yet