美文网首页
超几何分布计算P及R语言实现

超几何分布计算P及R语言实现

作者: 一只烟酒僧 | 来源:发表于2020-11-02 16:16 被阅读0次
    ######################################################## 
    #-------------------------------------------------------
    # Topic:超几何分布检验推导
    # Author:Wang Haiquan
    # Date:Sat Oct 31 08:53:20 2020
    # Mail:mg1835020@smail.nju.edu.cn
    #-------------------------------------------------------
    ########################################################
    
    
    #我们通过一次分析,从100个总基因(其中位于A通路的有20个)中筛到了10个差异基因,其中位于A通路的基因有2个,不位于A中的有8个
    #问:1、出现该情况的概率是多少?
    #   2、该抽样过程是否是随机情况?
    
    #1、该情况的概率
    choose(20,2)*choose(80,8)/choose(100,10)
    #[1] 0.3181706
    #2、该情况是否为随机的
    phyper(q=2,
           m=20,
           n=80,
           10)
    #[1] 0.6812201
    因为p=0.6812201>0.05,因此认为该过程为随机情况(这里计算的左侧累积概率)
    
    另附其它的集中情况的可能性:
    choose(20,0)*choose(80,10)/choose(100,10)#
    #[1] 0.09511627
    choose(20,1)*choose(80,9)/choose(100,10)#
    #[1] 0.2679332
    choose(20,2)*choose(80,8)/choose(100,10)#
    #[1] 0.3181706
    choose(20,3)*choose(80,7)/choose(100,10)#
    #[1] 0.2092081
    choose(20,4)*choose(80,6)/choose(100,10)
    #[1] 0.0841073
    choose(20,5)*choose(80,5)/choose(100,10)
    #[1] 0.02153147
    choose(20,6)*choose(80,4)/choose(100,10)
    #[1] 0.00354136
    choose(20,7)*choose(80,3)/choose(100,10)
    #[1] 0.0003679335
    choose(20,8)*choose(80,2)/choose(100,10)
    #[1] 2.299585e-05
    choose(20,9)*choose(80,1)/choose(100,10)
    #[1] 7.762311e-07
    choose(20,10)*choose(80,0)/choose(100,10)
    #[1] 1.067318e-08
    
    

    结论 :

    phyper(q=2,m=20,n=80,k=10)=choose(20,0)choose(80,10)/choose(100,10)+choose(20,1)choose(80,9)/choose(100,10)+choose(20,2)*choose(80,8)/choose(100,10)

    抽到 未抽到 合计
    A通路 2 18 20
    非A通路 8 72 80
    合计 10 90 100

    重复clusterprofiler包的结果!

    我们先使用clusterprofiler的示例数据

    data(geneList, package = "DOSE")
    de <- names(geneList)[1:100]
    yy <- enrichGO(de, 'org.Hs.eg.db', ont="BP", pvalueCutoff=0.01)
    head(yy)
                       ID                          Description GeneRatio   BgRatio       pvalue
    GO:0140014 GO:0140014             mitotic nuclear division     28/99 264/18670 5.669344e-29
    GO:0000280 GO:0000280                     nuclear division     30/99 407/18670 2.557918e-26
    GO:0048285 GO:0048285                    organelle fission     30/99 449/18670 4.637016e-25
    GO:0000070 GO:0000070 mitotic sister chromatid segregation     20/99 151/18670 9.796542e-23
    GO:0007059 GO:0007059               chromosome segregation     25/99 321/18670 1.735044e-22
    GO:0000819 GO:0000819         sister chromatid segregation     21/99 189/18670 3.390547e-22
                   p.adjust       qvalue
    GO:0140014 9.972377e-26 7.954985e-26
    GO:0000280 2.249689e-23 1.794581e-23
    GO:0048285 2.718837e-22 2.168822e-22
    GO:0000070 4.308029e-20 3.436524e-20
    GO:0007059 6.103885e-20 4.869081e-20
    GO:0000819 9.939952e-20 7.929120e-20
    
    xx<-data.frame(a=str_split(yy$GeneRatio,"\\/",simplify = T)[,1],
                   b=str_split(yy$GeneRatio,"\\/",simplify = T)[,2],
                   c=str_split(yy$BgRatio,"\\/",simplify = T)[,1],
                   d=str_split(yy$BgRatio,"\\/",simplify = T)[,2],
                   p=yy$pvalue,
                   p.adj=yy$p.adjust)
    #   a  b   c     d            p        p.adj
    #1 28 99 264 18670 5.669344e-29 9.972377e-26
    #2 30 99 407 18670 2.557918e-26 2.249689e-23
    #3 30 99 449 18670 4.637016e-25 2.718837e-22
    #4 20 99 151 18670 9.796542e-23 4.308029e-20
    #5 25 99 321 18670 1.735044e-22 6.103885e-20
    #6 21 99 189 18670 3.390547e-22 9.939952e-20
    xx<-apply(xx,2,as.numeric)
    xx<-as.data.frame(xx)
    #注意!!!我这里使用的是q-1 ,同时设置了lower.tail=F
    xx$p.diy<-apply(xx,1,function(a){phyper(a[1]-1,a[3],a[4]-a[3],a[2],lower.tail = F)})
    xx$p.adj.diy=p.adjust(xx$p.diy,"BH")
    #   a  b   c     d            p        p.adj        p.diy    p.adj.diy
    #1 28 99 264 18670 5.669344e-29 9.972377e-26 5.669344e-29 9.972377e-26
    #2 30 99 407 18670 2.557918e-26 2.249689e-23 2.557918e-26 2.249689e-23
    #3 30 99 449 18670 4.637016e-25 2.718837e-22 4.637016e-25 2.718837e-22
    #4 20 99 151 18670 9.796542e-23 4.308029e-20 9.796542e-23 4.308029e-20
    #5 25 99 321 18670 1.735044e-22 6.103885e-20 1.735044e-22 6.103885e-20
    #6 21 99 189 18670 3.390547e-22 9.939952e-20 3.390547e-22 9.939952e-20
    

    有两点疑惑:
    1、q的取值中为何要是28-1 ?
    2、lower.tail 参数的定义为 logical; if TRUE (default), probabilities are P[X ≤ x], otherwise, P[X > x].
    也就是说F代表我们计算的是P[X>x],也就是计算的右侧累计概率,这么做的目的是什么呢?

    在医学统计学课本中,对于确定最终p值得描述为:先求出所有组合四格表得概率,然后将小于等于原样本四格表概率得所有四格表概率值相加,得到双侧检验的P值,原样本的四格表以左(包括原样本)的所有四格表概率之和为左侧概率,以右(包括原样本)的所有四格表概率之和为右侧概率,左侧和右侧概率中较小者单侧检验的P值

    抽到 未抽到 合计
    A通路 28 71 264
    非A 99-28 18670-264-99+28 18670-264
    合计 99 18670-99 18670

    一个原函数的链接:https://www.cnblogs.com/leezx/p/12510385.html

    相关文章

      网友评论

          本文标题:超几何分布计算P及R语言实现

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