DEseq2-差异分析

数据读入

使用airway中的数据,SummarizedExperiment格式。

data("airway")
airway

#定义condition
airway$dex <- relevel(airway$dex, "untrt")

#创建DEseq对象
dds <- DESeqDataSet(airway, design = ~ cell + dex)
class: RangedSummarizedExperiment 
dim: 64102 8 
metadata(1): ''
assays(1): counts
rownames(64102): ENSG00000000003 ENSG00000000005 ... LRG_98 LRG_99
rowData names(0):
colnames(8): SRR1039508 SRR1039509 ... SRR1039520 SRR1039521
colData names(9): SampleName cell ... Sample BioSample

如果没有SummarizedExperiment格式也可以使用DESeqDataSetFromMatrix导入。

对于运行DESeq2模型,您可以使用R的公式表示法来表达任何固定效果的实验设计。请注意,DESeq2使用与baseR的lm函数相同的公式表示法。如果研究目的是确定各组的治疗效果不同的基因,则可以包括相互作用项并使用设计进行测试如 ~ group + treatment + group:treatment。

countdata <- assay(airway)
coldata <- colData(airway)
dds <- DESeqDataSetFromMatrix(countData = countdata,
                                  colData = coldata,
                                  design = ~ cell + dex)

标准化

探索性多维数据分析的许多常用统计方法,例如聚类和主成分分析(PCA),最适合通常在不同平均值范围内具有相同方差范围的数据。当方差的预期量为约跨越不同的平均值是相同的,该数据被认为是同方差。但是,对于RNA-seq计数,预期方差随平均值而增加。例如,如果直接在计数或标准化计数的矩阵上执行PCA(例如,校正测序深度的差异),则结果图通常主要取决于具有最高序列的基因计数是因为它们在样本之间显示出最大的绝对差异。避免这种情况的一种简单且经常使用的策略是取标准化计数值的对数加上1的伪计数。但是,根据伪计数的选择,现在计数最低的基因将对结果图产生很大的干扰,因为取小计数的对数实际上会夸大其方差。

#vst标准化,blind参数指定实验设计不直接用于转换
vsd <- vst(dds, blind = FALSE)
head(assay(vsd), 3)

#rlog标准化
rld <- rlog(dds, blind = FALSE)
head(assay(rld), 3)

差异分析

#预处理
dds <- dds[ rowSums(counts(dds))>1, ] ##将所有样本基因表达量之和小于1的基因过滤掉

#差异分析
dds <- DESeq(dds)
#根据contrast参数提取结果,alpha 指定p值,lfcThreshold指定logfoldchange
res <- results(dds, contrast=c("dex","trt","untrt"),alpha = 0.05,lfcThreshold = 1)
summary(res)
out of 33469 with nonzero total read count
adjusted p-value < 0.05
LFC > 1.00 (up)    : 142, 0.42%
LFC < -1.00 (down) : 80, 0.24%
outliers [1]       : 0, 0%
low counts [2]     : 13588, 41%
(mean count < 2)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results

基因注释

library("AnnotationDbi")
library("org.Hs.eg.db")

res$symbol <- mapIds(org.Hs.eg.db,
                     keys=row.names(res),
                     column="SYMBOL",
                     keytype="ENSEMBL",
                     multiVals="first")
res$entrez <- mapIds(org.Hs.eg.db,
                     keys=row.names(res),
                     column="ENTREZID",
                     keytype="ENSEMBL",
                     multiVals="first")

与基因表达矩阵合并并导出结果

res_deseq <- res[order(res$padj),]
#提取差异基因
diffSig <- subset(res_deseq, padj<0.05 & (log2FoldChange > 1 | log2FoldChange < -1))
diffSig <- row.names(diffSig)

#合并结果并导出
res <-merge(as.data.frame(res),as.data.frame(counts(dds,normalize=TRUE)),by="row.names",sort=FALSE)
diffmRNAexp<- res %>% 
  remove_rownames() %>% 
  column_to_rownames(var = 'Row.names')

diffmRNAexp<- diffmRNAexp[diffSig,]

结果可视化

#jitter
topGene <- rownames(res)[which.min(res$padj)]
plotCounts(dds, gene = topGene, intgroup=c("dex"))

#MAplot
res <- lfcShrink(dds, coef="dex_untrt_vs_trt")
plotMA(res, ylim = c(-5, 5))

#MAplot中添加label
topGene <- rownames(res)[which.min(res$padj)]
with(res[topGene, ], {
  points(baseMean, log2FoldChange, col="dodgerblue", cex=2, lwd=2)
  text(baseMean, log2FoldChange, topGene, pos=2, col="dodgerblue")
})

多因素差异分析

DESeq2可用于分析时程实验,例如,找到与一组基线样本相比随时间以特定于条件的方式发生反应的那些基因。在这里,我们展示了使用fission数据包进行的基本时程分析,该 数据包包含裂变酵母的RNA-seq时程的基因计数。酵母暴露于氧化应激,一半的样品含有atf21基因的缺失。我们使用一个设计公式来模拟时间0处的应变差异,随时间变化的差异以及随时间变化的任何应变特定的差异(交互作用项strain:minute)。

library("fission")
data("fission")
ddsTC <- DESeqDataSet(fission, ~ strain + minute + strain:minute)

下面的代码块执行似然比测试,其中我们去除了随时间变化的应变特定差异。此测试中p值小的基因是那些在时间0后一个或多个时间点显示出菌株特异性作用的基因。因此请注意,这不会给两个菌株中以相同方式随时间上下移动的基因提供小的p值。

#test指定似然比检验,reduced指定要与之进行比较的简化公式,即去掉相关术语的完整公式。
ddsTC <- DESeq(ddsTC, test="LRT", reduced = ~ strain + minute)
resTC <- results(ddsTC)
resTC$symbol <- mcols(ddsTC)$symbol
head(resTC[order(resTC$padj),], 4)

这只是可以应用于时间序列数据的测试之一。另一个选择是将计数建模为时间的平滑函数,并包括条件与平滑函数的交互项。可以使用R中的样条基函数建立这样的模型,另一种更现代的方法是使用高斯过程(Tonner et al.2017)。

我们可以使用ggplot2随时间变化的组计数 ,对于调整后的p值最小的基因,测试条件相关的时间曲线,并说明时间0的差异(下图)。

fiss <- plotCounts(ddsTC, which.min(resTC$padj), 
                   intgroup = c("minute","strain"), returnData = TRUE)
fiss$minute <- as.numeric(as.character(fiss$minute))
ggplot(fiss,
  aes(x = minute, y = count, color = strain, group = strain)) + 
  geom_point() + stat_summary(fun.y=mean, geom="line") +
  scale_y_log10()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353