一个数据里两种分组信息怎么做差异分析

1.背景知识

众所周知,limma可以做基因表达芯片和转录组数据的差异分析,可以方便的得处两组之间有表达量差别的基因。多分组差异分析其实也是两两差异分析的批量做法。

有的实验设计相对复杂一点,比如今天使用的例子:

image.png

实验设计包括了两种分组,一个是siC和sip53,一个是NT与TNF。

那么常规的两组之间的差异分析也就不能同时分析这两种实验设计啦!

这时候我们就需要用到双因素差异分析。

1.整理表达矩阵

rm(list = ls())
library(tinyarray)
library(tidyverse)
library(limma)
gse = "GSE53153"
a = geo_download(gse,destdir=tempdir(),colon_remove = T)
find_anno(a$gpl)
library(illuminaHumanv4.db);ids <- toTable(illuminaHumanv4SYMBOL)
eset = trans_array(log2(a$exp+1),ids)
eset[1:4,1:4]
##          GSM1283060 GSM1283061 GSM1283062 GSM1283063
## EEF1A1    16.125688  16.097172  16.035905  15.996306
## GAPDH     15.125034  15.114759  15.188604  15.102693
## SLC35E2A   7.980711   8.234099   7.651769   8.134426
## CLXN       7.634448   7.811856   7.692790   7.792465

2.整理实验设计

#双因素分析
targets = data.frame(mutate = rep(c("siC","sip53"),each = 6),
                     induce = rep(c("untreat", "treat"), each = 3, times = 2))
targets
##    mutate  induce
## 1     siC untreat
## 2     siC untreat
## 3     siC untreat
## 4     siC   treat
## 5     siC   treat
## 6     siC   treat
## 7   sip53 untreat
## 8   sip53 untreat
## 9   sip53 untreat
## 10  sip53   treat
## 11  sip53   treat
## 12  sip53   treat

把这两种分组合并到一起

TS <- paste(targets$mutate, targets$induce, sep=".")
TS <- factor(TS, levels=c("siC.untreat","siC.treat","sip53.untreat","sip53.treat"))
TS
##  [1] siC.untreat   siC.untreat   siC.untreat   siC.treat     siC.treat    
##  [6] siC.treat     sip53.untreat sip53.untreat sip53.untreat sip53.treat  
## [11] sip53.treat   sip53.treat  
## Levels: siC.untreat siC.treat sip53.untreat sip53.treat

3.做差异分析

这里同时做了三次差异分析:

哪些基因对siC组的treat有反应,即siC组的treat-untreat

哪些基因对sip53组的treat有反应,即sip53组的treat-untreat

与siC组相比,哪些基因在sip53组中的反应不同,即上面两组差异分析所得的logFC再比较!

前两次差异分析其实相当于取子集+二分组差异分析。第三次是双因素差异分析咯。

design <- model.matrix(~0+TS)
colnames(design) <- levels(TS)
fit <- lmFit(eset, design)
cont.matrix <- makeContrasts(
  w = siC.treat-siC.untreat,
  m = sip53.treat-sip53.untreat,
  diff = (sip53.treat-sip53.untreat)-(siC.treat-siC.untreat),
  levels=design)
fit2 <- contrasts.fit(fit, cont.matrix)
fit2 <- eBayes(fit2)

deg1 = topTable(fit2,number = Inf,coef = 1)
deg2 = topTable(fit2,number = Inf,coef = 2)
deg3 = topTable(fit2,number = Inf,coef = 3)
head(deg3)
##            logFC   AveExpr          t      P.Value    adj.P.Val         B
## MMP9   -1.889600  8.014973 -17.520398 8.191150e-12 1.712278e-07 13.259648
## CXCL10 -1.598374  9.294062 -12.550379 1.166271e-09 1.218986e-05 10.453810
## PI3     1.458585  8.562082  10.029716 2.812942e-08 1.960058e-04  8.248613
## EBI3   -1.382219  8.596838  -9.797690 3.885369e-08 2.030494e-04  8.008927
## LTB    -1.412194  8.331969  -8.950493 1.327325e-07 5.549282e-04  7.072795
## TNIP1  -1.048539 12.778876  -8.828485 1.594793e-07 5.556259e-04  6.929717

4.差异基因

get_diff_gene = function(deg,logFC_t = 1,p_t = 0.05){
  k1 = (deg$P.Value < p_t)&(deg$logFC < -logFC_t)
  k2 = (deg$P.Value < p_t)&(deg$logFC > logFC_t)
  library(dplyr)
  deg = mutate(deg,change = ifelse(k1,"down",ifelse(k2,"up","stable")))
  table(deg$change)
  return(rownames(deg)[deg$change!="stable"])
}

cg1 = get_diff_gene(deg1);length(cg1)
## [1] 121
cg2 = get_diff_gene(deg2);length(cg2)
## [1] 109
cg3 = get_diff_gene(deg3);length(cg3)
## [1] 14
dat = list(siC = cg1,
           sip53 = cg2,
           diff = cg3)
draw_venn(dat,"")
ggsave("v.png")
image.png
dat = data.frame(t(eset[cg3,]),
                 targets,
                 TS,check.names = F)
library(ggplot2)
ps = lapply(cg3, function(g){
  ggplot(dat,aes_string(x = "TS",
                      y =  paste0("`",g,"`"),
                      fill = "induce"))+
  geom_boxplot()+
  theme_bw()+
  theme(legend.position = "top")
})
library(patchwork)
wrap_plots(ps[1:4],ncol = 2)
image.png

5.logFC 是如何计算的

TS
##  [1] siC.untreat   siC.untreat   siC.untreat   siC.treat     siC.treat    
##  [6] siC.treat     sip53.untreat sip53.untreat sip53.untreat sip53.treat  
## [11] sip53.treat   sip53.treat  
## Levels: siC.untreat siC.treat sip53.untreat sip53.treat
x = eset["MMP9",]
(mean(x[10:12])-mean(x[7:9]))-(mean(x[4:6])-mean(x[1:3]))
## [1] -1.8896
deg3$logFC[1]
## [1] -1.8896

所以也就是计算出了两组之间的logFC之差。

代码参考自limma帮助文档第九章。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容