8漆腌、Integrating Datasets

原文鏈接Chapter 13 Integrating Datasets

1、目的

  • 在實(shí)際試驗(yàn)中抖甘,不可避免的可能generate data across multiple batches热鞍;
  • 正如天下沒有兩片完全的葉子一樣,分批實(shí)驗(yàn)總會(huì)對(duì)數(shù)據(jù)產(chǎn)生不可避免且不同的影響衔彻。different batches is often subject to uncontrollable differences
    -Hence薇宠,computational correction of these effects is critical for eliminating batch-to-batch variation

2、準(zhǔn)備實(shí)驗(yàn)示例數(shù)據(jù)

使用TENxPBMCData()包提供的多種 10X PBMC data中的兩批做示范

BiocManager::install("TENxPBMCData")
library(TENxPBMCData)

all.sce <- list(
  pbmc3k=TENxPBMCData('pbmc3k'),
  pbmc4k=TENxPBMCData('pbmc4k'))

colnames(rowData(all.sce$pbmc3k))
#將gene的不同ID儲(chǔ)存到rowData是一種值得借鑒的方法
head((rowData(all.sce$pbmc3k)))
table(is.na(rowData(all.sce$pbmc3k)$Symbol))
#也有1w+個(gè)symbol為NA值
  • Separate processing prior to the batch correction step is more convenient, scalable and (on occasion) more reliable.
  • 因此分別對(duì)兩批數(shù)據(jù)進(jìn)行前期的處理

注意下面流程中的R語言技巧值得借鑒學(xué)習(xí)艰额,以及復(fù)習(xí)下截止目前學(xué)習(xí)的pipelines

(1)質(zhì)控

以線粒體基因?yàn)槭纠?/p>

library(scater)
stats <- high.mito <- list()
for (n in names(all.sce)) {
  current <- all.sce[[n]]
  is.mito <- grep("MT", rowData(current)$Symbol_TENx)
  stats[[n]] <- perCellQCMetrics(current, subsets=list(Mito=is.mito))
  high.mito[[n]] <- isOutlier(stats[[n]]$subsets_Mito_percent, type="higher")
  all.sce[[n]] <- current[,!high.mito[[n]]]
}

(2)標(biāo)準(zhǔn)化

all.sce <- lapply(all.sce, logNormCounts)

(3)高變基因

library(scran)
all.dec <- lapply(all.sce, modelGeneVar)
all.hvgs <- lapply(all.dec, getTopHVGs, prop=0.1)

(4)降維

library(BiocSingular)
set.seed(10000)
all.sce <- mapply(FUN=runPCA, x=all.sce, subset_row=all.hvgs, 
                  MoreArgs=list(ncomponents=25, BSPARAM=RandomParam()), 
                  SIMPLIFY=FALSE)

set.seed(100000)
all.sce <- lapply(all.sce, runTSNE, dimred="PCA")

set.seed(1000000)
all.sce <- lapply(all.sce, runUMAP, dimred="PCA")

(5)聚類

for (n in names(all.sce)) {
  g <- buildSNNGraph(all.sce[[n]], k=10, use.dimred='PCA')
  clust <- igraph::cluster_walktrap(g)$membership
  all.sce[[n]]$clust  <- factor(clust)
}

(6)整理

pbmc3k <- all.sce$pbmc3k
dec3k <- all.dec$pbmc3k
pbmc3k
pbmc4k <- all.sce$pbmc4k
dec4k <- all.dec$pbmc4k
pbmc4k

#挑選兩個(gè)批次相同的基因
universe <- intersect(rownames(pbmc3k), rownames(pbmc4k))
length(universe)
pbmc3k <- all.sce$pbmc3k
dec3k <- all.dec$pbmc3k
pbmc3k
pbmc4k <- all.sce$pbmc4k
dec4k <- all.dec$pbmc4k
pbmc4k

(7)消除測(cè)序深度差異

  • rescale each batch to adjust for differences in sequencing depth between batches(adjusting the size factors)
  • 可以認(rèn)為先去除批次效應(yīng)的一個(gè)方面
library(batchelor)
rescaled <- multiBatchNorm(pbmc3k, pbmc4k)
pbmc3k <- rescaled[[1]]
pbmc4k <- rescaled[[2]]

(8)新的hvg

library(scran)
combined.dec <- combineVar(dec3k, dec4k)
chosen.hvgs <- combined.dec$bio > 0
sum(chosen.hvgs)

最終得到的數(shù)據(jù)是pbmc3k澄港、pbmc4k兩個(gè)processed and batch-normalized sce 以及chosen.hvgs。供下面的批次效應(yīng)流程處理柄沮。

3慢睡、檢查是否存在批次效應(yīng)

  • 簡(jiǎn)單思路:直接合并兩個(gè)sce,進(jìn)行整體聚類铡溪;再與原始sce的分類結(jié)果比較觀察漂辐。
  • 理想的情況是整體數(shù)據(jù)的細(xì)胞分類平均分到每個(gè)batch中,而不是單一棕硫、異常的分布髓涯。

(1)合并sce對(duì)象

rowData(pbmc3k) <- rowData(pbmc4k) #使用4k的rowData
#因?yàn)閮蓚€(gè)原始sce對(duì)象的rowData(feature annotation)不完全一致(無法合并)
pbmc3k$batch <- "3k" #增加批次colData annotation
pbmc4k$batch <- "4k"
#直接合并兩個(gè)sce對(duì)象(未校正)
uncorrected <- cbind(pbmc3k, pbmc4k)

#基于直接合并的sce進(jìn)行聚類
# Using RandomParam() as it is more efficient for file-backed matrices.
library(scater)
set.seed(0010101010)
uncorrected <- runPCA(uncorrected, subset_row=chosen.hvgs,
                      BSPARAM=BiocSingular::RandomParam())
library(scran)
snn.gr <- buildSNNGraph(uncorrected, use.dimred="PCA")
clusters <- igraph::cluster_walktrap(snn.gr)$membership

(2)觀察直接合并的聚類與原始sce的聚類有無差異

  • Ideally, each cluster should ideally consist of cells from both batches.
tab <- table(Cluster=clusters, Batch=uncorrected$batch)
tab
3-1
  • 但是從上面結(jié)果來看, cells of the same type are artificially separated due to technical differences between batches.
  • 可視化看一看哈扮,的確批次效應(yīng)造成的分離影響很大纬纪,需要去除該效應(yīng)
set.seed(1111001)
uncorrected <- runTSNE(uncorrected, dimred="PCA")
plotTSNE(uncorrected, colour_by="batch")
3-2

4蚓再、去除方法

法一:Linear regression

(1)前提假設(shè)
  • assume that the composition of cell subpopulations is the same across batches.
  • assume that the batch effect is additive.
(2)實(shí)現(xiàn)方法
  • batchelor包的rescaleBatches()函數(shù)
  • roughly equivalent to applying a linear regression to the log-expression values per gene.
set.seed(1010101010) # To ensure reproducibility of IRLBA.
#降維
rescaled <- runPCA(rescaled, subset_row=chosen.hvgs, exprs_values="corrected")
#聚類
snn.gr <- buildSNNGraph(rescaled, use.dimred="PCA")
clusters.resc <- igraph::cluster_walktrap(snn.gr)$membership
#聚類結(jié)果在不同batch的分布情況
tab.resc <- table(Cluster=clusters.resc, Batch=rescaled$batch)
tab.resc
  • 如下圖結(jié)果,可以看到相當(dāng)部分的批次效應(yīng)導(dǎo)致的分類偏離已經(jīng)消除了

  • However, at least one batch-specific cluster is still present, indicating that the correction is not entirely complete.(batch effect 未完全消除)


    4-1
  • 再tsne可視化看一看

rescaled <- runTSNE(rescaled, dimred="PCA")
rescaled$batch <- factor(rescaled$batch)
plotTSNE(rescaled, colour_by="batch")
4-2

法二:MNN(Mutual nearest neighbors)【推薦】

  • Mutual nearest neighbors are pairs of cells from different batches that belong in each other’s set of nearest neighbors.
  • 簡(jiǎn)單來說尋找兩個(gè)批次中理想情況下不受影響包各,互相距離最近的點(diǎn)(pairs)摘仅。利用這些pairs將兩個(gè)batch“拉到一起”
  • batchelor包的fastMNN()函數(shù)
set.seed(1000101001)
mnn.out <- fastMNN(pbmc3k, pbmc4k, d=50, k=20, subset.row=chosen.hvgs,
                   BSPARAM=BiocSingular::RandomParam(deferred=TRUE))
mnn.out

assay slot 的 reconstructed 矩陣為兩個(gè)batch 的調(diào)整后的融合矩陣;
reducedDim slot 的 corrected 是融合矩陣的主成分信息问畅,即不需要再進(jìn)行降維處理娃属。
關(guān)于fastMNN()函數(shù)的參數(shù)--

  • d=:To reduce computational work and technical noise, all cells in all batches are projected into the low-dimensional space defined by the top d principal components.
  • k=:specifies the number of nearest neighbors to consider when defining MNN pairs.
  • subset.row=一般僅挑選矩陣的hvg代表基因
library(scran)
#聚類
snn.gr <- buildSNNGraph(mnn.out, use.dimred="corrected")
clusters.mnn <- igraph::cluster_walktrap(snn.gr)$membership
tab.mnn <- table(Cluster=clusters.mnn, Batch=mnn.out$batch)
tab.mnn

如下圖結(jié)果

  • We see that all clusters contain contributions from each batch after correction, consistent with our expectation that the two batches are replicates of each other.
4-3
library(scater)
set.seed(0010101010)
mnn.out <- runTSNE(mnn.out, dimred="corrected")

mnn.out$batch <- factor(mnn.out$batch)
plotTSNE(mnn.out, colour_by="batch")
  • 與第一種方法相比,兩個(gè)batch也的確更加緊密的結(jié)合在一起了


    4-4

以上是第十三章Integrating Datasets部分的簡(jiǎn)單流程筆記护姆,主要學(xué)習(xí)了linear regression與MNN兩種整合數(shù)據(jù)并去除批次效應(yīng)的兩種方法矾端。但整合的同時(shí)也要考慮是否去除了數(shù)據(jù)本身的 biological difference,因此可進(jìn)一步對(duì)整合數(shù)據(jù)進(jìn)行診斷卵皂,這里暫時(shí)不做記錄了秩铆,詳見Chapter 13 Integrating Datasets
本系列筆記基于OSCA全流程的大致流程梳理,詳細(xì)原理可參考原文灯变。如有錯(cuò)誤殴玛,懇請(qǐng)指正!
此外還有劉小澤老師整理的全文翻譯筆記添祸,詳見目錄族阅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膝捞,隨后出現(xiàn)的幾起案子坦刀,更是在濱河造成了極大的恐慌,老刑警劉巖蔬咬,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲤遥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡林艘,警方通過查閱死者的電腦和手機(jī)盖奈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狐援,“玉大人钢坦,你說我怎么就攤上這事∩督矗” “怎么了爹凹?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)镶殷。 經(jīng)常有香客問我禾酱,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任颤陶,我火速辦了婚禮颗管,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滓走。我一直安慰自己垦江,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布搅方。 她就那樣靜靜地躺著比吭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腰懂。 梳的紋絲不亂的頭發(fā)上梗逮,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天项秉,我揣著相機(jī)與錄音绣溜,去河邊找鬼。 笑死娄蔼,一個(gè)胖子當(dāng)著我的面吹牛怖喻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岁诉,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼锚沸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了涕癣?” 一聲冷哼從身側(cè)響起哗蜈,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坠韩,沒想到半個(gè)月后距潘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡只搁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年音比,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氢惋。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洞翩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焰望,到底是詐尸還是另有隱情骚亿,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布熊赖,位于F島的核電站循未,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜的妖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一绣檬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫂粟,春花似錦娇未、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宽涌,卻和暖如春平夜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卸亮。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工忽妒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兼贸。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓段直,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親溶诞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸯檬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348