美文网首页
PH525x series - Hierarchical Mod

PH525x series - Hierarchical Mod

作者: 3between7 | 来源:发表于2019-12-09 17:18 被阅读0次

    在上一篇文章PH525x series - Bayesian Statistics中是将层次模型应用到了棒球运动当中,这篇文章作者讲的是在高通量数据的分析中如何应用层次模型。

    既然是层次模型,那我们首先要做的就是构建两个level,第一个描述的是样本或单元之间的变异,第二个level则描述的是某种特征之间的变异。这次作者使用的例子是limma包中的一组基因表达数据(2组,每组3个样本,其中共有16个差异显著基因),这个包提供了一种修饰t-test,比原本的t-test更具有统计效力。

    与棒球运动的例子不同的是,这次我们为方差建模。我们先来看使用原本的t-test检验做差异显著检验的结果是怎样的:

    library(SpikeInSubset) ##Available from Bioconductor data(rma95)
    library(genefilter)
    fac <- factor(rep(1:2,each=3))
    tt <- rowttests(exprs(rma95),fac)
    smallp <- with(tt, p.value < .01)
    #注意pData(rma95)获得的那些基因是真实存在差异的基因,共16个
    spike <- rownames(rma95) %in% colnames(pData(rma95))
    cols <- ifelse(spike,"dodgerblue",ifelse(smallp,"red","black"))
    with(tt, plot(-dm, -log10(p.value), cex=.8, pch=16,
         xlim=c(-1,1), ylim=c(0,4.5),
         xlab="difference in means",
         col=cols))
    abline(h=2,v=c(-.2,.2), lty=2)
    
    volcanotst.png

    上述结果有两点问题,这第一便是使用FDRp值进行检验之后,仅剩1个基差异显著的基因;

    sum(p.adjust(tt$p.value,method="BH")[spike] < 0.05)
    ## [1] 1
    

    当然导致这一结果的原因肯定与样本量过少有关。第二个问题就是按照t-testp值对基因进行排序后,无论是取排名前多少的一组基因,这当中都包含了很多的假阳性,比如在排名前10的基因中有6个是假阳性:

    table(top10 =rank(tt$p.value <=10, spike)) #t-stat and p-val rank is the same
    
    ##        spike
    ## top10   FALSE  TRUE
    ##   FALSE 12604    12
    ##   TRUE      6     4
    

    从上面的火山图中我们可以看到,小p值但又是假阳性的那些基因其实就是那些效应力很小(也就是标准误会很小)的基因(图中那些红点其横坐标集中在了-0.2-0.2)。我们可以通过下图确认这点:

    tt$s <- apply(exprs(rma95), 1, function(row) sqrt(.5 * (var(row[1:3]) + var(row[4:6]) ) ) )
    with(tt, plot(s, -log10(p.value), cex=.8, pch=16,
                  log="x",xlab="estimate of standard deviation",col=cols))
    
    se.png

    这种情况下,使用层次模型会更有效。如果我们能够为这些基因的方差构建分布模型,就可以根据这种分布修饰那些过小的p值,从而达到提高统计效力的目的。

    根据PH525x series - Statistical Models(二)中介绍的F分布可知,我们可以使用如下模型为方差建模:

    s^2 ∼ s_0^2F_{d,d_0}

    像我们这种利用经验(empirical)数据构建先验分布(Bayesian approach)的方法就是经验贝叶斯方法。现在我们有了每个基因的观察值s_g,也有了先验分布模型(即F分布),按照如下公式公式就可以去计算方差σ_g^2的后验分布平均值了:
    \mbox{E}[\sigma^2_g \mid s_g] = \frac{d_0 s_0^2 + d s^2_g}{d_0 + d}
    在这里,s_g^2是观察值的方差(observed variance,就是实际的方差),s_0^2是全局方差(global variance,其实就是后验分布的方差,也就是由果求因得到的真实的方差)。在得到后验分布的均值和标准差之后,我们就可以使用这两个数值去进行moderated t-tests了,这一过程说起来复杂,代码其实就几行:

    library(limma)
    ##先为每个基因构建一个线性模型
    fit <- lmFit(rma95, model.matrix(~ fac))
    ##进行经验贝叶斯检验
    ebfit <- eBayes(fit)
    ##提取差值与p值
    limmares <- data.frame(dm=coef(fit)[,"fac2"], p.value=ebfit$p.value[,"fac2"])
    ##绘图
    with(limmares, plot(dm, -log10(p.value),cex=.8, pch=16,
         col=cols,xlab="difference in means",
         xlim=c(-1,1), ylim=c(0,5)))
    abline(h=2,v=c(-.2,.2), lty=2)
    
    modertst.png

    这样一来,在p值升序排列的前10个基因中假阳性率就降到了2:

    table( top10=rank(limmares$p.value)<= 10, spike)
    
    ##        spike
    ## top50   FALSE  TRUE
    ##   FALSE 12608     8
    ##   TRUE      2     8
    

    可见这种moderated t-tests的统计效力要比原始的** t-tests**要好。还有一个重要的点要知道:原先那些标准差接近0的样本在通过层次模型矫正后就不再接近0了,而是朝着s_0的方向收缩。

    函数讲解:

    • limFit(object): Fit linear model for each gene given a series of arrays
    • ebayes(fit): Given a microarray linear model fit, compute moderated t-statistics, moderated F-statistic, and log-odds of differential expression by empirical Bayes moderation of the standard errors towards a common value.
    • coef(object): ‘coef’ is a generic function which extracts model coefficients from objects returned by modeling functions.

    原文请戳

    相关文章

      网友评论

          本文标题:PH525x series - Hierarchical Mod

          本文链接:https://www.haomeiwen.com/subject/eiabgctx.html