scRNA-Seq | Seurat的三種單細胞數(shù)據(jù)整合方法匯總(批次校正)

適用背景

單細胞數(shù)據(jù)由于實驗平臺或樣本等原因會造成不同數(shù)據(jù)集之間存在批次效應球切,這種批次效應是人為因素造成的制妄,沒有實際的生物學意義涌萤,可能對研究結果產(chǎn)生極大影響坠狡。批次效應可由聚類結果確定继找,如果聚類出的某些亞群絕大部分都來自同一個樣本一般就認為存在批次效應,因此需要進行批次校正逃沿。
本文總結了三種常用的整合方法代碼:CCA婴渡,SCTransform和Harmony

方法一

CCA整合方法是目前應用最多方法凯亮,是Seurat自帶的边臼,大多數(shù)情況以及夠用了,效果也還可以假消,但是對于較大數(shù)據(jù)集柠并,耗時較長,占內(nèi)存也較大置谦。目前堂鲤,Seurat官網(wǎng)在此基礎上推薦reference-based,也就是指定參考數(shù)據(jù)集進行整合媒峡,但對于自產(chǎn)數(shù)據(jù)集瘟栖,一般根本無法預先知道哪個樣本效果最好,這種reference-based的思路更適合數(shù)據(jù)挖掘類的研究谅阿。
參數(shù)簡介

  • obj半哟,Seurat對象
  • group.by,整合分組
  • mt.pattern或mt.list签餐,指定線粒體基因寓涨,mt.pattern支持模糊搜索,mt.list直接給定基因集氯檐,格式為向量
  • dim.use PCA主成分的選擇個數(shù)
  • mt.cutoff 線粒體百分比閾值
  • nf.low 基因數(shù)下限
  • nf.high 基因數(shù)上限
  • nfeatures戒良,用于整合的高變基因選擇數(shù)
  • res,聚類亞群的分辨率
seurat_integ <- function(obj,group.by=NULL,
                         mt.pattern="^MT-",mt.list=NULL,dim.use=30,mt.cutoff=5,
                         nf.low=500,nf.high=6000,nfeatures=3000,
                         res=1.5) {
all <- obj
if (is.null(mt.list)) {
all[["percent.mt"]] <- PercentageFeatureSet(all, pattern = mt.pattern)
}else{
mt.list <- mt.list[which(mt.list %in% rownames(all))]
all[["percent.mt"]] <- PercentageFeatureSet(all, features = mt.list)
}

all <- subset(all, subset = nFeature_RNA > nf.low & percent.mt < mt.cutoff & nFeature_RNA < nf.high)
all <- NormalizeData(all, normalization.method = "LogNormalize", scale.factor = 10000)
all.list <- SplitObject(all, split.by = group.by)

for (i in 1:length(all.list)){
  all.list[[i]] <- NormalizeData(all.list[[i]], verbose = FALSE)
  all.list[[i]] <- FindVariableFeatures(all.list[[i]], selection.method = "vst",nfeatures = nfeatures, verbose = FALSE)}

reference.list <- all.list
all.anchors <- FindIntegrationAnchors(object.list = reference.list, dims =1:dim.use)
all.integrated <- IntegrateData(anchorset = all.anchors, dims = 1:dim.use)
DefaultAssay(all.integrated) <- "integrated"
all.integrated <- ScaleData(all.integrated, verbose = FALSE)
npcs <- dim.use+10
all.integrated <- RunPCA(all.integrated, npcs = npcs, verbose = FALSE)

all.integrated <- FindNeighbors(all.integrated, reduction = "pca", dims = 1:dim.use)
all.integrated <- FindClusters(all.integrated, resolution = res)
all.integrated <- RunUMAP(all.integrated, reduction = "pca", dims = 1:dim.use)

return(all.integrated)
}

方法二

第二種方法是Seurat官網(wǎng)極度推薦的冠摄,主要由于方法一的Normalization and variance stabilization流程存在一定問題糯崎,會造成基因表達量會與測序深度存在明顯的相關關系等几缭,因此提出了SCTransform進行預處理,然后再整合沃呢,其實后面的整合方法跟方法一的類型年栓,只不過這里的前期預處理用的是SCTransform,而方法一用的是LogNormalize薄霜,因此整合的對象結構是類似的某抓。詳細內(nèi)容可閱讀這篇文獻。這種方法理論上更為合理惰瓜,但是也更耗運行內(nèi)存和運行時間否副。參數(shù)與方法一一致。

sct_integ <- function(obj,group.by=NULL,
                         mt.pattern="^MT-",mt.list=NULL,dim.use=30,mt.cutoff=5,
                         nf.low=500,nf.high=6000,nfeatures=3000,
                         res=1.5) {
all <- obj
if (is.null(mt.list)) {
all[["percent.mt"]] <- PercentageFeatureSet(all, pattern = mt.pattern)
}else{
mt.list <- mt.list[which(mt.list %in% rownames(obj))]
all[["percent.mt"]] <- PercentageFeatureSet(all, features = mt.list)
}

all <- subset(all, subset = nFeature_RNA > nf.low & percent.mt < mt.cutoff & nFeature_RNA < nf.high)
all <- NormalizeData(all, normalization.method = "LogNormalize", scale.factor = 10000)
obj <- all

ifnb.list <- SplitObject(obj, split.by = group.by)

if (!requireNamespace("glmGamPoi", quietly = TRUE)) {
ifnb.list <- lapply(X = ifnb.list, FUN = SCTransform, vars.to.regress = "percent.mt", verbose = FALSE)
}else{
ifnb.list <- lapply(X = ifnb.list, FUN = SCTransform, vars.to.regress = "percent.mt", verbose = FALSE, method = "glmGamPoi")
}

features <- SelectIntegrationFeatures(object.list = ifnb.list, nfeatures = nfeatures)
ifnb.list <- PrepSCTIntegration(object.list = ifnb.list, anchor.features = features)
immune.anchors <- FindIntegrationAnchors(object.list = ifnb.list, normalization.method = "SCT",
    anchor.features = features)
immune.combined.sct <- IntegrateData(anchorset = immune.anchors, normalization.method = "SCT")
immune.combined.sct <- RunPCA(immune.combined.sct, verbose = FALSE)
immune.combined.sct <- RunUMAP(immune.combined.sct, reduction = "pca", dims = 1:dim.use)

all.integrated <- immune.combined.sct
all.integrated <- FindNeighbors(all.integrated, reduction = "pca", dims = 1:dim.use)
all.integrated <- FindClusters(all.integrated, resolution = res)
all.integrated <- RunUMAP(all.integrated, reduction = "pca", dims = 1:dim.use)

return(all.integrated)
}

方法三

第三種方法是一種降維整合崎坊,基于harmony包副编,這種方法的優(yōu)勢在于夠快,大部分情況都能有比較好的結果流强。參數(shù)與方法一一致痹届。

harmony_integ <- function(obj,group.by=NULL,
                         mt.pattern="^MT-",mt.list=NULL,dim.use=20,mt.cutoff=5,
                         nf.low=500,nf.high=6000,nfeatures=3000,
                         res=1.5) {
library(harmony)
all <- obj
if (is.null(mt.list)) {
all[["percent.mt"]] <- PercentageFeatureSet(all, pattern = mt.pattern)
}else{
mt.list <- mt.list[which(mt.list %in% rownames(all))]
all[["percent.mt"]] <- PercentageFeatureSet(all, features = mt.list)
}

all <- subset(all, subset = nFeature_RNA > nf.low & percent.mt < mt.cutoff & nFeature_RNA < nf.high)
all <- NormalizeData(all, normalization.method = "LogNormalize", scale.factor = 10000)
all <- FindVariableFeatures(all, selection.method = "vst", nfeatures = 2000)
all.genes <- rownames(all)
all <- ScaleData(all , features = all.genes, vars.to.regress = "nCount_RNA")
saveRDS(all,"regress.rds")
all <- RunPCA(all, features = VariableFeatures(object = all))
all <- RunHarmony(all, group.by , plot_convergence = F,dims.use = 1:dim.use)
Combine <- all
Combine = RunTSNE(Combine, reduction = "harmony", dims = 1:dim.use)
Combine = RunUMAP(Combine, reduction = "harmony", dims = 1:dim.use)
Combine = FindNeighbors(Combine, reduction = "harmony",dims = 1:dim.use)
Combine = FindClusters(Combine, resolution = res)
return(Combine)
}

小結與補充

單細胞數(shù)據(jù)整合一直是個玄學,沒有說哪一種整合方法是最好的打月,不同方法針對不同樣本會出現(xiàn)不同效果队腐,只能每種方法都試一下才能知道哪種較好。而且還需要結合實際情況進行選擇奏篙,例如數(shù)據(jù)集太大柴淘,或者運行內(nèi)存不夠,可能harmony的方法更適合秘通,當然如果數(shù)據(jù)集適中为严,各種運行條件也合適那就可以考慮理論上更為合理的SCTransform方法。

轉自:jianshu.com)](http://www.reibang.com/p/acd2138fb449

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肺稀,一起剝皮案震驚了整個濱河市第股,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌话原,老刑警劉巖夕吻,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異繁仁,居然都是意外死亡涉馅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門黄虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稚矿,“玉大人,你說我怎么就攤上這事∥畲В” “怎么了偶翅?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碉渡。 經(jīng)常有香客問我,道長母剥,這世上最難降的妖魔是什么滞诺? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮环疼,結果婚禮上习霹,老公的妹妹穿的比我還像新娘。我一直安慰自己炫隶,他們只是感情好淋叶,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伪阶,像睡著了一般煞檩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栅贴,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天斟湃,我揣著相機與錄音,去河邊找鬼檐薯。 笑死凝赛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的坛缕。 我是一名探鬼主播墓猎,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赚楚!你這毒婦竟也來了毙沾?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宠页,失蹤者是張志新(化名)和其女友劉穎搀军,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勇皇,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡罩句,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了敛摘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门烂。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屯远,到底是詐尸還是另有隱情蔓姚,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布慨丐,位于F島的核電站坡脐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏房揭。R本人自食惡果不足惜备闲,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捅暴。 院中可真熱鬧恬砂,春花似錦、人聲如沸蓬痒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梧奢。三九已至狱掂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亲轨,已是汗流浹背符欠。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓶埋,地道東北人希柿。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像养筒,于是被迫代替她去往敵國和親曾撤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容