空间组deg genemodule heatmap go分析
空间转录组通过手动划区注释之后,得到空间组的区域注释信息,这个时候我们便是想要得到其差异表达基因的功能注释信息,这里并没有能够通用的脚本,本人仅是提供一种思路,供大家参考。
由于我们的空间组的数据大都是 anndata 的 h5ad 的文件格式,所以我们需要将其转换为能够被 seurat 读取的 rds 文件格式,这里采用我们之前博客讲到的一个便捷工具 rds与h5ad的相互转换,大概代码如下所述:
1 | sceasy::convertFormat('/data/*.h5ad', |
于是便是得到了相应的 rds 文件,之后我们借助 seurat 中的 findallmarkers 函数,来进行差异表达基因的筛选,并且去除一些我们不需要的基因,例如线粒体基因,核糖体蛋白基因,血红蛋白基因,细胞质基因,胶原蛋白基因等等,这里我们可以通过正则表达式来进行筛选,以及对 avglog2fc 进行排序,筛选出每个类群的前 50 个差异表达基因,之后对其进行 genemodule 的计算。这里需要注意的是,我在进行 deg 的计算的时候,并没有对空间组的数据进行归一化,因为我是bin50的数据,当然也不是不能进行归一化,这个大家可以自行决定是否要进行归一化;此外在计算 genemodule 的地方,我则是选取了选取了 raw 矩阵和均一化之后的矩阵都进行了 genemodule 的计算,大家可以出现的结果决定是否要进行归一化,虽然 addgenemodule 的文档上写了输入的矩阵是归一化的矩阵。
脚本里面还有一些看着比较奇怪的代码,输入计算 deg 的矩阵和计算
genemodule
的矩阵可以是不一样的,原因在于我们可能空间组芯片上某些位置的捕获与其他地方不一样,需要我们去除掉,这个时候我们可以选取
去除了某些区域的矩阵
去计算 deg,之后再用正常的芯片去计算
genemodule。
1 | # Rscript your_script.R path_to_rds_file.rds refined_pred_column_name path_to_output_csv_file.csv |
计算了 genemodule 的信息之后,便是需要对其在空间组上进行绘制,看看这些计算出的 deg 是否在我们划分的区域富集,这里采用了 scanpy ,采用scanpy的原因在于 scanpy 的 spatial 绘图函数较为通用以及便捷。
1 | # python your_script.py --adata_file_path path_to_adata_file --csv_file_path path_to_csv_file --gene_modules module_name |
到此为止,deg计算完毕,genemodule 计算完毕,绘制完毕。接下来进行 heatmap 的绘制,这里是用的 python 进行计算,R 语言进行绘图,我们将每个区域视为一个 psudo bulk,对于每个基因,计算其在每个 psudo bulk 中的平均表达量,然后保存为 csv,之后采用 R 语言进行绘制。
1 | import pandas as pd |
绘制函数如下所示:
1 | # Rscript 1.R gene_list_value rds_path_value gene_modules_value gene_module_path_value gene_module_normalized_path_value |
R 函数的heatmap绘制了不止一个图,而且多个,大家可以自行选择需要的。最后是进行 GO 富集分析,这里我采用了 clusterProfiler 进行 GO 富集分析,这里的代码也是比较简单的,大家可以自行参考。
1 | # Rscript your_script.R path_to_rds_file.rds refined_pred_column_name path_to_output_csv_file.csv |
这段代码能够给一个大概的参考,有时候我们会只想要 BP 相关的数据,我们还可以读入上述生成的表格,重新进行绘制,代码如下:
1 | import pandas as pd |
总体上,我们实现了空间组数据的 deg 的计算,genemodule 的计算与绘制,每个基因在各个空间注释区域的表达量的计算与 heatmap 的绘制,以及各个区域的 GO 分析。
最后,还有一个简易的 sh 脚本将这 6 个 python 或 R 脚本进行统一的运行,如下所示:
1 | 所有文件的保存地址 |
以上。