美文网首页
关于GEO的分组矩阵与对比问题

关于GEO的分组矩阵与对比问题

作者: BioJournal_Link | 来源:发表于2019-08-28 02:26 被阅读0次

    当下载完GEO数据,并做好数据整理后,得到了行名为SYMBOL,列名为SAMPLE的基因表达矩阵(已去重,log2等),现在就要开始进行差异表达分析。
    分组表达矩阵,告诉代码,哪些样本属于那些分组

    #懒得下载,自己构建基因表达矩阵
    x <- 100#行数
    y <- 24#列数
    r <- rnorm(x*y)#创建24*100个符合正态分布的数据
    dim(r) <- c(x,y)#给数据以行、列维度
    class(r)#matrix
    dim(r)# 100 24
    r[,1:6] <- r[,1:6]+5#因为有些为负数,把他全部变为正数,以下一样
    r[,7:12] <- r[,7:12]+5.3
    r[,13:18] <- r[,13:18]+6.3
    r[,19:24] <- r[,19:24]+7
    r[1:4,1:4]
    # > r[1:4,1:4]
    #       sample_1 sample_2 sample_3 sample_4
    # gene_1 6.930203 3.445526 6.364362 5.482402
    # gene_2 5.676164 4.680503 4.450948 5.608166
    # gene_3 3.427881 6.070465 5.540297 4.522752
    # gene_4 6.666888 6.002557 5.336065 5.947510
    rowname <- c(paste0("gene_",1:nrow(r)))
    colname <- c(paste0("sample_",1:ncol(r)))
    # > length(rowname)
    # [1] 100
    # > length(colname)
    # [1] 24
    colnames(r) <- colname#赋列名
    rownames(r) <- rowname#赋行名
    r[1:4,1:4]
    # > r[1:4,1:4]
    #       sample_1 sample_2 sample_3 sample_4
    # gene_1 6.930203 3.445526 6.364362 5.482402
    # gene_2 5.676164 4.680503 4.450948 5.608166
    # gene_3 3.427881 6.070465 5.540297 4.522752
    # gene_4 6.666888 6.002557 5.336065 5.947510
    group_list <- rep(c('normal','tumour_1','tumour_2','tumour_3'),each=rep(6,4))
    #group_list <- factor(group_list,levels = c('normal','tumour_1','tumour_2','tumour_3'))
    
    library(limma)
    design=model.matrix(~group_list)
    design
    colnames(design) <- levels(group_list)#给design赋列名
    rownames(design) <- colname#给design赋行名
    #> design
    #           normal tumour_1 tumour_2 tumour_3
    # sample_4       1        0        0        0
    # sample_5       1        0        0        0
    # sample_6       1        0        0        0
    # sample_10      1        1        0        0
    # sample_11      1        1        0        0
    # sample_12      1        1        0        0
    # sample_16      1        0        1        0
    # sample_17      1        0        1        0
    # sample_18      1        0        1        0
    # sample_22      1        0        0        1
    # sample_23      1        0        0        1
    # sample_24      1        0        0        1
    # attr(,"assign")
    # [1] 0 1 1 1
    # attr(,"contrasts")
    # attr(,"contrasts")$`group_list`
    # [1] "contr.treatment"
    #design是一个分组对比矩阵,他告诉代码哪个样本是属于哪个分组
    #design的列顺序就是group_list这个因子向量的level顺序,这个很重要
    fit1=lmFit(r,design)
    fit2=eBayes(fit1) 
    allDiff=topTable(fit2,adjust='fdr',coef=2,number=Inf)#根据自己的需求调参数得到差异表达基因
    allDiff[1,]
    # > allDiff[1,]
    #           logFC  AveExpr        t      P.Value  adj.P.Val         B
    # gene_71 2.116048 6.101674 3.697074 0.0002239722 0.02239722 0.3369323
    #logFC即logFoldChange,即两组之间的log表达量取平均后进行相除,看两组之间某个基因表达的对比情况
    #一般是实验组/对照组,正值代表实验组该基因表达量高于对照组,数值代表高多少倍,负值同理
    #但是我们怎么知道是实验组/对照组,还是对照组/实验组呢?
    #这跟design的设置有关,design=model.matrix(~group_list)会默认第一列为“截距”,而后面的分组都会跟这个“截距”进行对比,这个“截距”会被默认为分母
    #而design的列名的顺序是取决于group_list的level顺序
    #这边写得比较乱,mark下
    mean(r["gene_71",7:12])-mean(r["gene_71",1:6])#验证一下logFC算法是否正确
    # > mean(r["gene_71",7:12])-mean(r["gene_71",1:6])
    # [1] 2.116048
    mean(r["gene_71",1:24])
    # > mean(r["gene_71",1:24])
    # [1] 6.101674
    #可以看出AveExpr是这24个样本的平均表达量,而不是normal和tumour_1两组的平均表达量
    #topTable函数的coef参数,coef=2是指design的第2列,即tumour_1,即把tumour_1与normal进行对比
    #同理coef=3是指design的第3列,即tumour_2,即把tumour_2与normal进行对比
    #所以,这里coef=2也可以写成coef="tumour_1"
    #allDiff=topTable(fit2,adjust='fdr',coef="tumour_1",number=Inf)
    

    那假如我想要tumour_2和tumour_1进行对比呢?
    这里有两种方法:

    #方法一:
    #修改group_list的level的顺序
    group_list <- factor(group_list,levels = c('tumour_1','normal','tumour_2','tumour_3'))
    design=model.matrix(~group_list)
    colnames(design) <- levels(group_list)
    rownames(design) <- colname
    design
    #> design
    #      tumour_1           normal           tumour_2           tumour_3
    #6            1                1                  0                  0
    #12           1                0                  0                  0
    #18           1                0                  1                  0
    #24           1                0                  0                  1
    #现在tumour_1变成了“截距”,所以就可以进行比较了
    
    #方法二:
    design <- model.matrix(~0+group_list)
    colnames(design) <- levels(group_list)
    rownames(design) <- colname
    design
    #> design
    #             tumour_1           normal           tumour_2           tumour_3
    #6                   0                1                  0                  0
    #12                  1                0                  0                  0
    #18                  0                0                  1                  0
    #24                  0                0                  0                  1
    #这里并没有指定哪一个是“截距”
    contrast.matrix <- makeContrasts(contrasts=c('tumour_2-normal',
                                                 'tumour_1-normal',
                                                 'tumour_2-tumour_1'),levels = design)
    
    #> contrast.matrix
    #          Contrasts
    #Levels     tumour_2-normal tumour_1-normal tumour_2-tumour_1
    #  normal                -1              -1                 0
    #  tumour_1               0               1                -1
    #  tumour_2               1               0                 1
    #  tumour_3               0               0                 0
    fit=lmFit(r,design)
    fit1 <- contrasts.fit(fit, contrast.matrix)
    fit2=eBayes(fit1) 
    allDiffc=topTable(fit2,adjust='fdr',coef=2,number=Inf,p.value=0.05)
    #coef=2,即指contrast.matrix的第2列
    #所以这个方法是自由度最大的一种
    

    还有配对比较矩阵,太晚了,明天写

    相关文章

      网友评论

          本文标题:关于GEO的分组矩阵与对比问题

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