多芯片分析

因为目前合并多个测序、芯片数据集这一块并没有完全统一的标准,方法大概有五六种。公说公有理婆说婆有理,对于我这样的新手来说,最简单的是跟随顶级文章的文章思路或者分析流程和步骤。于是我选取了一篇欧洲泌尿外科的顶级文章,从这篇文章的补充材料可以看出来:

移除批次效应前

image.png

image.png

image.png

image.png

移除批次效应后

image.png

image.png

image.png

作者将所有的芯片测序数据分为affy和illumina两类;
将affy公司的芯片通过标准的affy公司流程分析及combat;
illumina同样是通过标准的illumina公司流程分析及combat;
最后将两类芯片combat到一起,上一步是消除batch effect是不同的cohort,而这一步是affy和illumina两个平台的区别。


image.png

加载包

###step1 加载包################################
# =======================================================

# if (!requireNamespace("BiocManager", quietly = TRUE))
#   install.packages("BiocManager")
# 
# BiocManager::install("bladderbatch")

rm(list=ls()) 

library("sva")

options(stringsAsFactors=FALSE)

setwd('D:\\train\\data')

library(bladderbatch)

加载用于分析的数据

# =======================================================
###step2 加载用于分析的数据################################
#包括一个表达量矩阵和一个分组文件
# =======================================================
data(bladderdata)

edata = exprs(bladderEset)


edata[1:5,1:5]

pheno = pData(bladderEset)

pheno[1:5,1:4]

dt <- data.frame(cel=rownames(pheno), pheno)

dt[1:5,1:5]

绘制图片显示以前聚类效果

# =======================================================
###step3 绘制图片显示合并以前的聚类结果##################
# =======================================================

PCA_raw <- prcomp(t(edata), scale = FALSE)

dataGG <- data.frame(PC1 = PCA_raw$x[,1], PC2 = PCA_raw$x[,2],
                     Disease = dt$cancer,
                     batch = dt$batch)

dataGG$batch <- as.factor(dataGG$batch)


library(ggplot2)

(qplot(PC1, PC2, data = dataGG, color = Disease,
       main = "PCA plot of the raw data (log-transformed)", size = I(2),
       asp = 1.0)
  + scale_colour_brewer(palette = "Set2"))


library(ggplot2)
(qplot(PC1, PC2, data = dataGG, color = batch,
       main = "PCA plot of the raw data (log-transformed)", size = I(2),
       asp = 1.0)
  + scale_colour_brewer(palette = "Set2"))


boxplot(edata, target = "core",
        main = "Boxplots of log2-intensities for the raw data")


dist_mat <- dist(t(edata))
clustering <- hclust(dist_mat, method = "complete")
par(mfrow=c(2,1))
plot(clustering, labels = pheno$batch)
plot(clustering, labels = pheno$cancer)
image.png

image.png

image.png

image.png

从这些图片看出有明显批次效应,批次效应出现在以下情形:

一个实验不同部分在不同时间完成;
一个实验不同部分不同人完成;
试剂用量、芯片、实验仪器不同;
自己的数据与网站数据混用

Combat参数(prarametric)或者非参数(non-prarametric)的经验贝叶斯框架进行批次效应校正。

移除批次效应

# =======================================================
####step4 combat移除批次效应 ############################
# =======================================================

library(bladderbatch)

data(bladderdata)

pheno = pData(bladderEset)
# add fake age variable for numeric
pheno$age = c(1:7, rep(1:10, 5))

# write.table(data.frame(cel=rownames(pheno), pheno),
#             row.names=F, quote=F, sep="\t",
#             file="bladder-pheno.txt")

edata = exprs(bladderEset)

# write.table(edata, row.names=T, 
#             quote=F, sep="\t", file="bladder-expr.txt")
# use dataframe instead of matrix

mod = model.matrix(~as.factor(cancer) + age, data=pheno)

t = Sys.time()

# parametric adjustment

cdata = ComBat(dat=edata, batch=as.factor(pheno$batch), 
               mod=mod,par.prior=TRUE, prior.plots=TRUE)

print(Sys.time() - t)

print(cdata[1:5, 1:5])

# write.table(cdata, "r-batch.txt", sep="\t", quote=F)
image.png

绘制聚类后的图片

# =======================================================
####step5 绘制合并后聚类图片############################
# =======================================================

dt <- data.frame(cel=rownames(pheno), pheno)


PCA_raw <- prcomp(t(cdata), scale = FALSE)


dataGG <- data.frame(PC1 = PCA_raw$x[,1], PC2 = PCA_raw$x[,2],
                     Disease = dt$cancer,
                     batch = dt$batch)

dataGG$batch <- as.factor(dataGG$batch)

library(ggplot2)
(qplot(PC1, PC2, data = dataGG, color = Disease,
       main = "PCA plot of the raw data (log-transformed)", size = I(2),
       asp = 1.0)
  + scale_colour_brewer(palette = "Set2"))

library(ggplot2)
(qplot(PC1, PC2, data = dataGG, color = batch,
       main = "PCA plot of the raw data (log-transformed)", size = I(2),
       asp = 1.0)
  + scale_colour_brewer(palette = "Set2"))

boxplot(cdata, target = "core",
        main = "Boxplots of log2-intensities for the raw data")

dist_mat <- dist(t(cdata))
clustering <- hclust(dist_mat, method = "complete")
par(mfrow=c(2,1))
plot(clustering, labels = pheno$batch)
plot(clustering, labels = pheno$cancer)

前后对比,可以发现不同batch基本不再是泾渭分明,而我们呢关心的cancer和normal泾渭分明了,便于下一步分析。


image.png

image.png

image.png

image.png

实例验证 数据

# =======================================================
####step6 实例验证 ################################
# =======================================================
rm(list=ls()) 
library(dplyr)
library(tibble)
library(tidyr)
library("sva")
options(stringsAsFactors=FALSE)
setwd('D:\\train\\data\\multi_micro')
data1 <- read.table('GSE68799.txt', header = T, sep = '\t')
data2 <- read.table('GSE102349.txt', header = T, sep = '\t')
data3 <- read.table(file = 'GSE118719.tsv', sep = '\t', header = TRUE)
data1[1:5,1:5]
data2[1:5,1:5]
data3[1:5,1:5]
data1 <- data1 %>%
  tidyr::separate(GeneID, into=c('geneSymbol', 'chr'), sep='\\_')%>%
  dplyr::select(-chr)
data1[1:5,1:5]
data2$geneSymbol <- data2$Gene.Symbol
data2$Gene.Symbol <- NULL
data3$Geneid <- NULL
a <- intersect(data2$geneSymbol, data1$geneSymbol)
a <- intersect(a, data3$geneSymbol)
data1 <- data1[which(data1$geneSymbol %in% a), ]
data2 <- data2[which(data2$geneSymbol %in% a), ]
data3 <- data3[which(data3$geneSymbol %in% a), ]

data1 <- data1 %>%
  distinct(geneSymbol, .keep_all = T)
data2 <- data2 %>%
  distinct(geneSymbol, .keep_all = T)
data3 <- data3 %>%
  distinct(geneSymbol, .keep_all = T)%>%
  column_to_rownames(var = 'geneSymbol')
data3 <- log2(data3 +1)
data3[1:5,1:5]
data3 <- data3 %>%
  rownames_to_column(var = 'geneSymbol')
data <- merge(data1, data2, by='geneSymbol')

data <- merge(data, data3, by='geneSymbol')%>%
  column_to_rownames(var = 'geneSymbol')
data[1:5,1:5]
metadat <- as.data.frame(colnames(data))
# write.csv(metadat, file = 'metadat.csv')

write.csv(data, file = 'data.csv')

# =======================================================
####step7 移除批次效应 ################################
# =======================================================
setwd('D:\\train\\data\\multi_micro')
rm(list=ls()) 
library("sva")
options(stringsAsFactors=FALSE)
library(bladderbatch)
data(bladderdata)
edata  <- read.csv('data.csv', header = T, row.names = 1)
pheno <- read.csv('metadat.csv', header = T)
dt <- pheno
PCA_raw <- prcomp(t(edata), scale = FALSE)
dataGG <- data.frame(PC1 = PCA_raw$x[,1], PC2 = PCA_raw$x[,2],
                     Disease = dt$cancer,
                     batch = dt$batch)

dataGG$batch <- as.factor(dataGG$batch)

library(ggplot2)
(qplot(PC1, PC2, data = dataGG, color = Disease,
       main = "PCA plot of the raw data (log-transformed)", size = I(2),
       asp = 1.0)
  + scale_colour_brewer(palette = "Set2"))

library(ggplot2)
(qplot(PC1, PC2, data = dataGG, color = batch,
       main = "PCA plot of the raw data (log-transformed)", size = I(2),
       asp = 1.0)
  + scale_colour_brewer(palette = "Set2"))

dist_mat <- dist(t(edata))
clustering <- hclust(dist_mat, method = "complete")
par(mfrow=c(2,1))
plot(clustering, labels = pheno$batch)
plot(clustering, labels = pheno$cancer)


#再做一个分组列,用于批次效应中排除项。
pheno$hasCancer <- as.numeric(pheno$cancer == "T")  
#分组模型
model <- model.matrix(~hasCancer, data = pheno)
t = Sys.time()
cdata <- ComBat(dat = as.matrix(edata),
                       batch = pheno$batch, mod = model)

print(Sys.time() - t)

print(cdata[1:5, 1:5])

PCA_raw <- prcomp(t(cdata), scale = FALSE)

dataGG <- data.frame(PC1 = PCA_raw$x[,1], PC2 = PCA_raw$x[,2],
                     Disease = dt$cancer,
                     batch = dt$batch)

dataGG$batch <- as.factor(dataGG$batch)
library(ggplot2)
(qplot(PC1, PC2, data = dataGG, color = Disease,
       main = "PCA plot of the raw data (log-transformed)", size = I(2),
       asp = 1.0)
  + scale_colour_brewer(palette = "Set2"))

library(ggplot2)
(qplot(PC1, PC2, data = dataGG, color = batch,
       main = "PCA plot of the raw data (log-transformed)", size = I(2),
       asp = 1.0)
  + scale_colour_brewer(palette = "Set2"))

dist_mat <- dist(t(cdata))
clustering <- hclust(dist_mat, method = "complete")
par(mfrow=c(2,1))
plot(clustering, labels = pheno$batch)
plot(clustering, labels = pheno$cancer)

question:
同属于illumina平台的batch1和batch2的移除批次效应结果很满意,但是affy效果一般;
1.可能是affy数据表达矩阵为原始数据,而illumina为标准化后的数据,所以差距大;
2.这篇顶刊提示我么为什么对affy标准化后才和illumina合并

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

推荐阅读更多精彩内容