Harmony整合单细胞数

Seurat结合Harmony的整合流程

参考:
单细胞测序分析: Seurat V3联合harmony进行单细胞数据整合分析
2021-07-21 harmony整合不同平台的单细胞数据

方法1

使用Harmony之前,需要构建一个Seurat对象, 进行一个标准的Seurat分析(包括PCA)。
Seurat中使用Harmony的流程与常规流程的区别是:可以所有细胞创建一个Seurat 对象,不需要为每个数据集创建一个Seurat 对象(Seurat list)。

R语言中%>%的含义是什么呢,管道函数啦,就是把左件的值发送给右件的表达式,并作为右件表达式函数的第一个参数。

library(devtools)
install_github("immunogenomics/harmony")
library(Seurat)
library(cowplot)
library(harmony)

#################    创建Seurat对象等一系列计算     ########################

pbmc <- CreateSeuratObject(counts = cbind(stim.sparse, ctrl.sparse), project = "PBMC", min.cells = 5) %>%
    Seurat::NormalizeData(verbose = FALSE) %>%
    FindVariableFeatures(selection.method = "vst", nfeatures = 2000) %>% 
    ScaleData(verbose = FALSE) %>% 
    RunPCA(pc.genes = pbmc@var.genes, npcs = 20, verbose = FALSE)

##1.  %>%管道函数的作用:将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存
##   例如:anscombe_tidy <- anscombe %>%mutate(observation = seq_len(n()))
##  等价于 anscombe_tidy=mutate(anscombe,observation = seq_len(n()))
##2.  上述函数进行了 创建Seurat对象 >-数据标准化>- 计算高变基因>- 数据缩放 >-PCA降维

##############  更改维度信息   #########################
#在object的metadata中定义细胞ID信息,变量名为stim.
pbmc@meta.data$stim <- c(rep("STIM", ncol(stim.sparse)), rep("CTRL", ncol(ctrl.sparse)))
##1.函数形式:rep(x, time = , length = , each = ,)
##    x:代表的是你要进行复制的对象,可以是一个向量或者是一个因子。
##    times:代表的是复制的次数,只能为正数。负数以及NA值都会为错误值。复制是指的是对整个向量进行复制。
##    each:代表的是对向量中的每个元素进行复制的次数。
##    length.out:代表的是最终输出向量的长度。 
##2.ncol(stim.sparse) 计算stim.sparse有多少列
##3.我们只需将两个数据集分开即可,所有将stim定义为两个细胞系的名字




#现在还没有使用Harmony矫正主成分分析结果的数据,数据集之间还是有很大的差异。
options(repr.plot.height = 5, repr.plot.width = 12)
##options为环境设置函数,修改绘图区域大小
p1 <- DimPlot(object = pbmc, reduction = "pca", pt.size = .1, group.by = "stim", do.return = TRUE)
##DimPlot绘制降维图。object为创建的   Seurat对象;reduction为降维方法,如果没有指定,首先搜索umap,然后是tsne,然后是pca;
##pt.size为调节绘图点的大小;group.by为分组依据。
p2 <- VlnPlot(object = pbmc, features = "PC_1", group.by = "stim", do.return = TRUE, pt.size = .1)
##绘制小提琴图。object为创建的 Seurat对象;features用于绘图的特征,可以是基因表达数,可以为PC得分。
plot_grid(p1,p2)
##将数个图拼接

###############   经运行Harmony校正后可视化结果   #################
#运行Harmony进行数据整合(矫正批次效应)
输入:使用Harmony,需要一个Seurat 对象和指定metadata信息中需要整合的变量名。
输出:返回一个Seurat对象,以及矫正之后的Harmony 信息
plot_convergenc参数设置为TRUE,保证Harmony 在运行中每一次迭代都在使矫正越累越好。

options(repr.plot.height = 2.5, repr.plot.width = 6)
pbmc <- pbmc %>% 
    RunHarmony("stim", plot_convergence = TRUE)
##函数公式:RunHarmony(object, group.by.vars, ...)
##object为管道对象,必须计算过PCA;

##获取Harmony 矫正之后的信息,使用Embeddings()函数
harmony_embeddings <- Embeddings(pbmc, 'harmony')
harmony_embeddings[1:5, 1:5]

##查看数据Harmony整合之后的前两个维度上数据是不是很好的整合,最好是很好的整合结果。
options(repr.plot.height = 5, repr.plot.width = 12)
p1 <- DimPlot(object = pbmc, reduction = "harmony", pt.size = .1, group.by = "stim", do.return = TRUE)
p2 <- VlnPlot(object = pbmc, features = "harmony_1", group.by = "stim", do.return = TRUE, pt.size = .1)
plot_grid(p1,p2)

#下游分析
下游分析都是基于Harmony矫正之后的PCA降维数据,不是基因表达数据和直接的PCA降维数据。设置reduction = 'harmony',后续分析就会调用Harmony矫正之后的PCA降维数据。
要使用校正后的Harmony embeddings而不是PC进行后续分析,请设置reduction ='harmony'。

使用Harmony 矫正之后的数据,UMAP 和 Nearest Neighbor分析。
pbmc <- pbmc %>% 
    RunUMAP(reduction = "harmony", dims = 1:20) %>% 
    FindNeighbors(reduction = "harmony", dims = 1:20) %>% 
    FindClusters(resolution = 0.5) %>% 
    identity()

##UMAP 结果
在UMAP embedding中,我们可以看到更复杂的结构。由于我们使用harmony embeddings,因此UMAP embeddings混合得很好。
options(repr.plot.height = 4, repr.plot.width = 10)
DimPlot(pbmc, reduction = "umap", group.by = "stim", pt.size = .1, split.by = 'stim')

##聚类分析
options(repr.plot.height = 4, repr.plot.width = 6)
DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = .1)

方法2

参考:
2021-05-26 单细胞分析之harmony与Seurat
解读-Harmony原理介绍和官网教程


这个方法读取和前面的不一样
dir = c('Data/GSE139324) sample_name <- c('HNC01PBMC') scRNAlist

## 1、安装
library(harmony)
install_github("immunogenomics/harmony")
library(devtools)

## 2、创建Seurat对象
library(Seurat)
library(tidyverse)
library(patchwork)
rm(list=ls())
dir = c('Data/GSE139324/GSE139324_SUB/GSM4138110', 
        'Data/GSE139324/GSE139324_SUB/GSM4138111', 
        'Data/GSE139324/GSE139324_SUB/GSM4138128',
        'Data/GSE139324/GSE139324_SUB/GSM4138129',
        'Data/GSE139324/GSE139324_SUB/GSM4138148',
        'Data/GSE139324/GSE139324_SUB/GSM4138149',
        'Data/GSE139324/GSE139324_SUB/GSM4138162',
        'Data/GSE139324/GSE139324_SUB/GSM4138163',
        'Data/GSE139324/GSE139324_SUB/GSM4138168',
        'Data/GSE139324/GSE139324_SUB/GSM4138169')       
#GSE139324是存放数据的目录

sample_name <- c('HNC01PBMC', 'HNC01TIL', 'HNC10PBMC', 'HNC10TIL', 'HNC20PBMC',
                 'HNC20TIL',  'PBMC1', 'PBMC2', 'Tonsil1', 'Tonsil2')
scRNAlist <- list()
for(i in 1:length(dir)){
  counts <- Read10X(data.dir = dir[i])

#这里怎么还有去线粒体的步骤呢?
 scRNAlist[[i]] <- CreateSeuratObject(counts, project=sample_name[i], min.cells=3, min.features = 200)
  scRNAlist[[i]][["percent.mt"]] <- PercentageFeatureSet(scRNAlist[[i]], pattern = "^MT-")
  scRNAlist[[i]] <- subset(scRNAlist[[i]], subset = percent.mt < 10) 
}   
saveRDS(scRNAlist, "scRNAlist.rds")

##==harmony整合多样本==##
library(harmony)
scRNAlist <- readRDS("scRNAlist.rds")
##PCA降维
scRNA_harmony <- merge(scRNAlist[[1]], y=c(scRNAlist[[2]], scRNAlist[[3]], scRNAlist[[4]], scRNAlist[[5]], 
                                           scRNAlist[[6]], scRNAlist[[7]], scRNAlist[[8]], scRNAlist[[9]], scRNAlist[[10]]))
 scRNA_harmony <- NormalizeData(scRNA_harmony) %>% FindVariableFeatures() %>% ScaleData() %>% RunPCA(verbose=FALSE)
##整合
system.time({scRNA_harmony <- RunHarmony(scRNA_harmony, group.by.vars = "orig.ident")})
#   用户   系统   流逝 
# 34.308  0.024 34.324

#user  system elapsed 
#62.90    4.06   72.08 

#降维聚类
scRNA_harmony <- RunUMAP(scRNA_harmony, reduction = "harmony", dims = 1:30)
scRNA_harmony <- FindNeighbors(scRNA_harmony, reduction = "harmony", dims = 1:30) %>% FindClusters()
##作图
#group_by_cluster
plot1 = DimPlot(scRNA_harmony, reduction = "umap", label=T) 
#group_by_sample
plot2 = DimPlot(scRNA_harmony, reduction = "umap", group.by='orig.ident') 
#combinate
plotc <- plot1+plot2
plotc

自己做

参考:
2021-05-26 单细胞分析之harmony与Seurat
单细胞转录组高级分析一:多样本合并与批次校正
看了几个帖子都说是用Harmony分析的话,先用Seurat跑到PCA结束,然后再用Harmony分析。但是我自己比对了下这几个帖子的分析流程,感觉不太一样,就跟着帖子分析吧。最难的地方还是读取多样本合并Seurat这一步,就是这步很多教程说的不是很清楚,循坏看不太懂。弄好合并对象之后跟着做就行。

整体思路:

1.读取数据;
2.创建Seurat对象(这里看教程上面的代码应该是先对每个样本创建Seurat对象,然后再 merge合并成一个)
3.整合成一个之后就开始用教程的代码。代码如下:




library(harmony)
install_github("immunogenomics/harmony")
library(devtools)
library(Seurat)
library(tidyverse)
library(patchwork)
library(tidyverse)
rm(list=ls())

#1.数据准备,下载好的数据都是压缩文件。读取文件方式现在只会标准的三个文件的读取方式。
#下载好数据之后,可以用下面的代码整理成标准三文件格式,
#但是教程上面的还有改名这一步,他们的代码暂时看不懂,先用下面的吧。
#改名以后再学,或者后面修图的时候改下名字。
#压缩文件下载好之后,解压成文件夹,改这个就行"GSE139324_RAW" 


fs=list.files('D:/临时/GSE139324_RAW/','^GSM')
fs
library(tidyverse)
samples=str_split(fs,'_',simplify = T)[,1]

lapply(unique(samples),function(x){
  y=fs[grepl(x,fs)]
  folder=paste0("GSE139324_RAW/", str_split(y[1],'_',simplify = T)[,1])
  dir.create(folder,recursive = T)
  #为每个样本创建子文件夹
  file.rename(paste0("GSE139324_RAW/",y[1]),file.path(folder,"barcodes.tsv.gz"))
  #重命名文件,并移动到相应的子文件夹里
  file.rename(paste0("GSE139324_RAW/",y[2]),file.path(folder,"features.tsv.gz"))
  file.rename(paste0("GSE139324_RAW/",y[3]),file.path(folder,"matrix.mtx.gz"))
})


#2.数据读取有两种方法:一种是直接全部读入,创建对象;另一种方法是先对每个样本创建对象,再将所有对象合并为最终的对象。

library(Seurat)
samples=list.files("GSE139324_RAW/")
samples
dir <- file.path('./GSE139324_RAW',samples)
names(dir) <- samples

#这里用合并方法2
scRNAlist <- list()
for(i in 1:length(dir)){
  print(i)
  counts <- Read10X(data.dir = dir[i])
  scRNAlist[[i]] <- CreateSeuratObject(counts, min.cells=3, min.features = 200) # 这里记得改参数
}
scRNA2 <- merge(scRNAlist[[1]], y=c(scRNAlist[[2]], scRNAlist[[3]], 
                                    scRNAlist[[4]], scRNAlist[[5]], scRNAlist[[6]], scRNAlist[[7]], 
                                    scRNAlist[[8]], scRNAlist[[9]], scRNAlist[[10]]))
dim(scRNA2)   #查看基因数和细胞总数
table(scRNA2@meta.data$orig.ident)  #查看每个样本的细胞数

# 在参考的第二个示例中,在合并对象之后有一个Warning message,其他教程没看到,暂时不知道怎么处理 
Warning message:
  In CheckDuplicateCellNames(object.list = objects) :
  Some cell names are duplicated across objects provided. Renaming to enforce unique cell names.

#3. 开始跑流程
scRNA2 <- NormalizeData(scRNA2) %>% FindVariableFeatures() %>% ScaleData() %>% RunPCA(verbose=FALSE)


#开始整合
system.time({scRNA2 <- RunHarmony(scRNA2, group.by.vars = "orig.ident")})

#降维聚类
scRNA2 <- FindNeighbors(scRNA2, reduction = "harmony", dims = 1:15) %>% FindClusters(resolution = 0.5)


#降维可视化
scRNA2 <- RunUMAP(scRNA2, reduction = "harmony", dims = 1:15)

#画图看看整合效果
#group_by_cluster
plot1 = DimPlot(scRNA2, reduction = "umap", label=T) 
#group_by_sample
plot2 = DimPlot(scRNA2, reduction = "umap", group.by='orig.ident') 
#combinate
plotc <- plot1+plot2
plotc

后续如何分析,暂时不知道,看到其他教程再更新。

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

推荐阅读更多精彩内容