空间转录组2022||空间数据反卷积RCTD分析:细胞类型鉴定

参考教程链接:

RCTD可以将单细胞类型或细胞类型混合分配到空间转录组spots上。RCTD 有三种模式:

  • doublet mode:它为每个Spot分配1-2种细胞类型,推荐用于高空间分辨率的技术,如Slide-seq和MERFISH
  • full mode:它为每个Spot分配任意数量的细胞类型,推荐用于空间分辨率较低的技术,如100微米分辨率的Visium
  • multi mode:doublet mode的扩展,可以在每个点上发现两种以上的细胞类型,作为full mode的替代选项

每种模态都有一个对应的教程

今天先来学习Doublet mode: spatial transcriptomics vignette. Also, most other vignettes use doublet mode.

包安装

# install.packages("devtools")
devtools::install_github("dmcable/spacexr", build_vignettes = FALSE)
library(spacexr)
library(Matrix)

Introduction

稳健细胞类型分解(Robust Cell Type Decomposition,简称RCTD)是一种从空间转录组数据中学习细胞类型的统计方法。
在本次示例中,我们将为小脑Slide-seq数据集反卷积注释细胞类型。教程使用带注释的snRNA-seq小脑数据集定义细胞类型。
Note:参考也可以是单细胞数据集或细胞类型特定的bulkRNA-seq数据集。

数据预处理

RCTD需要两个数据:带有注释的单细胞转录组参考数据,需要反卷积注释的空间转录组数据。

reference数据

首先是单细胞参考数据集。reference使用RCTD包中Reference函数,这个函数需要三个参数:

  • counts:为矩阵或dgCmatrix对象。行名是基因,列名代表barcode/细胞名。counts应该是未转换的原始counts数据
  • cell_types:为带有细胞命名的(通过细胞barcode)细胞类型因子。因子的“水平”是可能的细胞类型标识。
  • nUMI:可选,具有barcode的每个像素中总counts or UMI列表。如果没有提供,nUMI将被假定为出现在每个像素上的总数。

reference可能来自各种数据类型,但需要将其加载到R环境中。

在本教程中,我们的reference作为两个csv文件存储在' reference /Vignette '文件夹中:

  • meta_data.csv:CSV文件(有3列,标题为“barcode”、“cluster”和“nUMI”),包含每个细胞的nUMI和单元格类型分配。
  • dge.csv:标准10x格式的基因表达CSV文件。
### Load in/preprocess your data, this might vary based on your file type
# directory for the reference
refdir <- system.file("extdata",'Reference/Vignette',package = 'spacexr') 
# load in counts matrix
counts <- read.csv(file.path(refdir,"dge.csv")) 
# Move first column to rownames
rownames(counts) <- counts[,1]
counts[,1] <- NULL
counts[1:4,1:4]


# load in meta_data (barcodes, clusters, and nUMI)
meta_data <- read.csv(file.path(refdir,"meta_data.csv")) 
head(meta_data)

# create cell_types named list
cell_types <- meta_data$cluster
names(cell_types) <- meta_data$barcode 
# convert to factor data type
cell_types <- as.factor(cell_types) 
head(cell_types)

# create nUMI named list
nUMI <- meta_data$nUMI
names(nUMI) <- meta_data$barcode 
head(nUMI)

### Create the Reference object
reference <- Reference(counts, cell_types, nUMI)
str(reference)

## Examine reference object (optional)
#observe Digital Gene Expression matrix
print(dim(reference@counts)) 
#> [1] 384 475

#number of occurences for each cell type
table(reference@cell_types) 

## Save RDS object (optional)
saveRDS(reference, file.path(refdir,'SCRef.rds'))

至此,reference已经构建好。

空间转录组数据

接下来,加载空间数据为SpatialRNA对象。SpatialRNA函数需要三个参数:

  • coords:数据框或者矩阵对象,为空间像素坐标,行名为每个像素的barcode,列为x和y
  • counts:矩阵或者dgCmatrix对象,行名是基因,列名是每个像素的barcode,counts值没有进行转换。
  • nUMI:可选

构建SpatialRNA有不同的方法,本教程为两个文件:

  • BeadLocationsForR.csv:CSV文件,三列,列名为"barcodes”, “xcoord”, and “ycoord”,包含每个像素的空间坐标;
  • MappedDGEForR.csv:每个像素的表达矩阵文件
##=============================== 读取空间数据
# directory for sample Slide-seq dataset
datadir <- system.file("extdata",'SpatialRNA/Vignette',package = 'spacexr') 
counts <- read.csv(file.path(datadir,"MappedDGEForR.csv"))
rownames(counts) <- counts[,1]; counts[,1] <- NULL
counts[1:4,1:4]

coords <- read.csv(file.path(datadir,"BeadLocationsForR.csv"))
rownames(coords) <- coords$barcodes
coords$barcodes <- NULL
head(coords)

# In this case, total counts per pixel is nUMI
nUMI <- colSums(counts) 
head(nUMI)

### Create SpatialRNA object
puck <- SpatialRNA(coords, counts, nUMI)
str(puck)


### Create SpatialRNA object
puck <- SpatialRNA(coords, counts, nUMI)
str(puck)

## Examine SpatialRNA object (optional)
print(dim(puck@counts))

# histogram of log_2 nUMI
hist(log(puck@nUMI,2))

结果图:可以看到空间数据的每个像素中UMI的数值分布。


image-20221111222523662.png
print(head(puck@coords)) # start of coordinate data.frame
barcodes <- colnames(puck@counts) # pixels to be used (a list of barcode names). 

# This list can be restricted if you want to crop the puck e.g. 
# puck <- restrict_puck(puck, barcodes) provides a basic plot of the nUMI of each pixel
# on the plot:
p <- plot_puck_continuous(puck, barcodes, puck@nUMI, ylimit = c(0,round(quantile(puck@nUMI,0.9))), title ='plot of nUMI') 

结果图:使用x,y坐标展示每个像素中的UMI分布

image-20221111222947585.png

创建RCTD对象

使用create.RCTD函数创建。以下为几个有用的参数:

  • max_cores:对于并行处理,使用的线程数
  • gene_cutoff, fc_cutoff, gene_cutoff_reg, fc_cutoff_reg:差异表达基因筛选阈值
  • UMI_min, UMI_max:每个像素点的阈值筛选

运行RCTD

可以使用run.RCTD函数,这个函数等价于:fitBulk,choose_sigma_c, andfitPixels这三个函数。doublet_mode可以选择上面提到的三种反卷积模式。

myRCTD <- create.RCTD(puck, reference, max_cores = 10)
myRCTD <- run.RCTD(myRCTD, doublet_mode = 'doublet')
str(myRCTD)

myRCTD结构:

image-20221112182253019.png

RCTD结果

RCTD结果保存在myRCTD对象中的@results中

  • @results$weights:是一个数据框,为full mode模式下每一个spots(即像素)中细胞类型的权重
  • @results$results_df:doublet_mode的结果
    • spot_class:因子类型,RCTD的分类,singlet表示每个spot有一种细胞类型,doublet_certain表示每个spot有两种细胞类型,doublet_uncertain表示spot上有2种细胞类型,但只确定有1种,reject表示没有预测到结果。
    • first_type:因子类型,预测到的第一种细胞类型
    • second_type:因子类型,预测到的第一种细胞类型
  • @results$weights_doublet:doublet_mode下每种细胞类型的权重
results <- myRCTD@results

# normalize the cell type proportions to sum to 1.
norm_weights = normalize_weights(results$weights) 

#list of cell type names
cell_type_names <- myRCTD@cell_type_info$info[[2]] 
spatialRNA <- myRCTD@spatialRNA

## you may change this to a more accessible directory on your computer.
resultsdir <- 'RCTD_Plots' 
dir.create(resultsdir)

results$results_df结果示例如下:


image-20221112184204705.png

接下来对结果可视化绘图:

# make the plots 
# 绘制full_mode模式下每种细胞类型的可信权重 (saved as 
# 'results/cell_type_weights_unthreshold.pdf')
plot_weights(cell_type_names, spatialRNA, resultsdir, norm_weights) 

# 绘制full_mode模式下每种细胞类型的权重
# 这里每种细胞类型一幅图,点表示空间上的一个像素或者spot,颜色为权重 (saved as
# 'results/cell_type_weights.pdf')
plot_weights_unthreshold(cell_type_names, spatialRNA, resultsdir, norm_weights) 

# 绘制full_mode模式下每种细胞类型预测到的spots数 (saved as 
# 'results/cell_type_occur.pdf')
plot_cond_occur(cell_type_names, resultsdir, norm_weights, spatialRNA)

# 绘制doublet_mode模式下每种细胞类型的权重 (saved as 
# 'results/cell_type_weights_doublets.pdf')
plot_weights_doublet(cell_type_names, spatialRNA, resultsdir, results$weights_doublet, results$results_df) 

其中,绘制full_mode模式下每种细胞类型预测到的spots数结果图如下:

从这里可以看得出,空间数据预测出来的主要为细胞类型10,其次是18。


image-20221112192742832.png
# 所有细胞类型的map结果 (saved as 
# 'results/all_cell_types.pdf')
plot_all_cell_types(results$results_df, spatialRNA@coords, cell_type_names, resultsdir) 

所有细胞类型的map结果图:

image-20221112194400757.png

绘制doublets:

# doublets
# obtain a dataframe of only doublets
doublets <- results$results_df[results$results_df$spot_class == "doublet_certain",] 

# 绘制所有的doublets (saved as 
# 'results/all_doublets.pdf')
plot_doublets(spatialRNA, doublets, resultsdir, cell_type_names) 

# 对每种细胞类型绘制doublets (saved as 
# 'results/all_doublets_type.pdf')
plot_doublets_type(spatialRNA, doublets, resultsdir, cell_type_names) 

# a table of frequency of doublet pairs 
doub_occur <- table(doublets$second_type, doublets$first_type) 

# 绘制doublet出现的堆积柱状图 (saved as   
# 'results/doublet_stacked_bar.pdf')
plot_doub_occur_stack(doub_occur, resultsdir, cell_type_names) 

doublet_stacked_bar结果图:

image-20221112194946431.png

感觉这个软件的结果图不是很好看,可调整度也不高,我觉得跟教程的数据有关系,后面重新找个数据看看。

教程的空间数据是slide-seq的数据:


img

找了个10x Visium的文献来看看:

ref1:Cell2location maps fine-grained cell types in spatial transcriptomics ( https://doi.org/10.1038/s41587-021-01139-4 )

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

推荐阅读更多精彩内容