作者,Evil Genius
关于visium(stereo bin > 50)全部的分析思路和方法已经都教给大家了,剩下的就是大家多积累一些项目经验,合理的运用到自己的课题中去了。
今天借助项目分析,复习这部分内容。
对于visium(stereo bin > 50)而言,单细胞空间不分家的,首先必须做好单细胞的分析,其中单细胞的注释为重中之重。
目前单细胞的注释,尤其亚群的注释,仍然依据marker注释为主,其中也有很多需要注意的细节,在2025第一课和第二课已经全部讲到了。
空转的基础分析第三课全部讲到了,包括多样本整合去批次。
空间数据的注释,这个也是重点,cell2location和RCTD是最重要的两个方法,当然了,其他方法也很重要,比如王凌华教授的文章就采用了RCTD联合iSTAR,其中联合需要注意的地方在第四课已经全部讲到了。
接下来就是分析细胞niche,第五课的关键内容。
关于细胞niche,2024的课程讲解的是R版本,2025不仅更新了R版本,同时提供了python版本,大家拿到之后,用在自己的项目中即可,其中有很多的注意事项要留意,不要盲目跑代码。
再往下就是共定位,第六课的关键内容。
关于细胞niche与共定位的生物学解读,推荐大家读文章
随着做空间的课题组越来越多,越来越卷是必然的趋势,那么分析也会水涨船高,就像单细胞分析一样,慢慢会的人也越来越多,风口也就那么几年,希望大家抓住机遇,珍惜时间。
最后附上Misty分析空间转录组共定位的封装代码(R版本),注意分析的Seurat版本。
#!/usr/bin/env Rscript
###zhaoyunfei
####20240401
suppressPackageStartupMessages({
library(argparse)
library(Seurat)
library(mistyR)
library(future)
library(dplyr)
})
create_parser <- function() {
parser <- ArgumentParser(description = "MISTY 空间转录组分析流程")
parser$add_argument("-i", "--input", type = "character", required = TRUE,
help = "输入 Seurat 对象的 RDS 文件路径")
parser$add_argument("-o", "--output", type = "character", required = TRUE,
help = "输出目录路径")
parser$add_argument("-s", "--sample", type = "character", default = "sample",
help = "样本名称 (默认: sample)")
parser$add_argument("--assay", type = "character", default = "Spatial",
help = "使用的 assay (默认: Spatial)")
parser$add_argument("--slot", type = "character", default = "data",
help = "使用的数据 slot (默认: data)")
parser$add_argument("--features", type = "character",
help = "要分析的基因列表文件 (每行一个基因)")
parser$add_argument("--nfeatures", type = "integer", default = 2000,
help = "如果未指定基因列表,使用的高变基因数量 (默认: 2000)")
parser$add_argument("--views", type = "character", default = "intra,para",
help = "要创建的视图类型,逗号分隔 (默认: intra,para)")
parser$add_argument("--l", type = "integer", default = 10,
help = "参数视图的邻域大小 (默认: 10)")
parser$add_argument("--workers", type = "integer", default = 4,
help = "并行工作线程数 (默认: 4)")
return(parser)
}
# 主分析函数
run_misty_analysis <- function(seurat_obj, params) {
# 设置并行计算
plan("multisession", workers = params$workers)
# 选择特征
if (!is.null(params$features)) {
features <- readLines(params$features)
features <- intersect(features, rownames(seurat_obj))
if (length(features) == 0) {
stop("指定的基因列表中没有在数据中找到的基因")
}
} else {
# 如果没有提供基因列表,使用高变基因
seurat_obj <- FindVariableFeatures(seurat_obj, nfeatures = params$nfeatures)
features <- VariableFeatures(seurat_obj)
}
cat(paste("使用", length(features), "个特征进行分析\n"))
# 获取空间坐标
coordinates <- GetTissueCoordinates(seurat_obj)
# 创建视图
views <- unlist(strsplit(params$views, ","))
misty.views <- create_initial_view(data = GetAssayData(seurat_obj,
assay = params$assay,
slot = params$slot))
if ("intra" %in% views) {
cat("添加细胞内视图\n")
misty.views <- add_paraview(misty.views, l = params$l)
}
if ("para" %in% views) {
cat("添加参数视图\n")
misty.views <- add_paraview(misty.views, l = params$l)
}
# 运行 MISTY
cat("运行 MISTY 分析...\n")
results <- run_misty(misty.views, results.folder = file.path(params$output, "results"))
# 保存结果
cat("保存结果...\n")
saveRDS(results, file.path(params$output, "misty_results.rds"))
# 可视化
cat("生成可视化...\n")
pdf(file.path(params$output, "misty_plots.pdf"))
plot_interaction_heatmap(results)
plot_view_contributions(results)
dev.off()
return(results)
}
# 主函数
main <- function() {
parser <- create_parser()
args <- parser$parse_args()
# 创建输出目录
if (!dir.exists(args$output)) {
dir.create(args$output, recursive = TRUE)
}
# 记录参数
writeLines(capture.output(print(args)),
file.path(args$output, "analysis_parameters.txt"))
# 加载数据
cat(paste("加载数据:", args$input, "\n"))
seurat_obj <- readRDS(args$input)
# 运行分析
results <- tryCatch({
run_misty_analysis(seurat_obj, args)
}, error = function(e) {
cat("分析过程中出错:\n")
cat(e$message, "\n")
traceback()
quit(status = 1)
})
cat("分析完成!\n")
}
if (!interactive()) {
main()
}
生活很好,有你更好
网友评论