估计阅读时长: 4 分钟

零分布(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
谢桂纲

No responses yet

Leave a Reply

Your email address will not be published. Required fields are marked *

博客文章
December 2025
S M T W T F S
 123456
78910111213
14151617181920
21222324252627
28293031  
  1. 谢博,您好。阅读了您的博客文章非常受启发!这个基于k-mer数据库的过滤框架,其核心是一个“污染源数据库”和一个“基于覆盖度的决策引擎”。这意味着它的应用远不止于去除宿主reads。 我们可以轻松地将它扩展到其他场景: 例如去除PhiX测序对照:建一个PhiX的k-mer库,可以快速剔除Illumina测序中常见的对照序列。 例如去除常见实验室污染物:比如大肠杆菌、酵母等,建一个联合的污染物k-mer库,可以有效提升样本的纯净度。 例如还可以靶向序列富集:反过来想,如果我们建立一个目标物种(比如某种病原体)的k-mer库,然后用这个算法去“保留”而不是“去除”匹配的reads,这不就实现了一个超快速的靶向序列富集工具吗? 这中基于kmer算法的通用性和扩展性可能会是它的亮点之一。感谢博主提供了这样一个优秀的思想原型

  2. WOW, display an image on a char only console this is really cool, I like this post because so much…

  3. 确实少有, 这么高质量的内容。谢谢作者。;-) 我很乐意阅读 你的这个技术博客网站。关于旅行者上的金唱片对外星朋友的美好愿望,和那个时代科技条件限制下人们做出的努力,激励人心。