protectdream的个人博客分享 http://blog.sciencenet.cn/u/protectdream

博文

审稿人让你把单细胞数据挖掘代码上传到github

已有 2486 次阅读 2023-7-15 08:41 |个人分类:技术类|系统分类:科研笔记

多次在我们的各种单细胞交流群看到了小伙伴们提问:审稿人希望大家把单细胞数据挖掘代码上传到github。其实这是一个很好的趋势,促进单细胞数据挖掘的可复现,虽然说对初学者要求可能会有点高。但是高标准严要求是能促进领域的进步和正规性。

而且不得不说,github在生物信息学领域的重要性,之前我们介绍过代码海洋,详见:《代码海洋-你想模仿的这里都有啊》,比如《单细胞天地》公众号分享的文献:单细胞转录组揭示肺腺癌特有的肿瘤微环境,就是配全部的代码。也有专门的github收集整理的更加齐全,而且还分门别类整理好了,详见:https://github.com/genecell/single-cell-papers-with-code

最近就看到了很简单的数据挖掘《Cellular hierarchy framework based on single-cell/multi-patient sample sequencing reveals metabolic biomarker PYGL as a therapeutic target for HNSCC》,可以作为一个很好的案例。大家以后可以参考这个:https://link.springer.com/article/10.1186/s13046-023-02734-w

这个数据挖掘作者把代码简单的整理到了,https://github.com/Mcdull8/METArisk/blob/main/METArisk_code.R

Image

很简单的数据挖掘

这个文章的单细胞数据挖掘部分其实就是降维聚类分群后,有一个简单的生物学功能通路富集而已。

首先是降维聚类分群

这样的单细胞转录组数据分析的标准降维聚类分群,并且进行生物学注释后的结果。可以参考前面的例子:人人都能学会的单细胞聚类分群注释 ,我们演示了第一层次的分群。如果你对单细胞数据分析还没有基础认知,可以看基础10讲:

这里我们简单的看看作者的代码里面的生物学亚群命名即可,可以看到其实是需要一个外部文件:./annotation/annotation_Mali.xlsx

# Cell Classification----
DefaultAssay(sce) <- "RNA"
all.markers <- FindAllMarkers(sce, 
                              only.pos = TRUE
                              min.pct = 0.1
                              logfc.threshold = 0.25)
significant.markers  <- all.markers[all.markers$p_val_adj < 0.05, ]

Idents(sce) <- sce$RNA_snn_res.1

annotation_curated_main <- read_excel("./annotation/annotation_main.xlsx")
new_ids_main <- annotation_curated_main$Main_cell_type
names(new_ids_main) <- levels(sce)
sce <- RenameIdents(sce, new_ids_main)
sce <- subset(sce,idents = "Other",invert = TRUE)
levels(sce) <- c("Malignant",
                 "Fibroblast",
                 "Endothelial",
                 "T",
                 "B_Plasma",
                 "Monocytic",
                 "Mast")
sce@meta.data$Main_cell_type <- Idents(sce)

这个其实跟我比较类似了,我喜欢肉眼看自己收集整理好的基因列表去人工给名字,比如前面我们系统性梳理了各种器官的上皮细胞的细分亚群,以及其对应的标记基因列表:

然后提取恶性细胞亚群

因为作者给出来了代码,所以我们可以很清晰的看到了作者单细胞数据挖掘里面的对肿瘤单细胞转录组数据处理的一些瑕疵,比如前面的亚群命名后,这里作者默认全部的上皮细胞都是恶性细胞,其实是有待商榷。

另外就是, 作者里面的真的每个个体的恶性肿瘤细胞,然后继续整合后降维聚类分群,这个整合步骤意思有问题的。


# Malignant Subset & METArisk----
Mali=sce[,sce$Main_cell_type %in% c('Malignant')] 

Malilist <- SplitObject(Mali, split.by = "orig.ident")
Malilist
......
......
Idents(Mali) <- Mali$RNA_snn_res.0.8

annotation_curated_main <- read_excel("./annotation/annotation_Mali.xlsx")
new_ids_main <- annotation_curated_main$Cluster
names(new_ids_main) <- levels(Mali)
Mali <- RenameIdents(Mali, new_ids_main)

levels(Mali) <- c(paste0(rep("PrimaryC",5),1:5),
                  paste0(rep("MixedC",2),1:2),
                  paste0(rep("MetastaticC",2),1:2))
Mali@meta.data$Cluster <- Idents(Mali)

然后是差异分析后加上gsea分析

这个时候作者很有意思,前面的恶性肿瘤细胞按照病人样品整合了,所以接下来降维聚类分群后就需要结合前面的样品分组熟悉来做Pseudobulk,这个是亮点。

# Pseudobulk
Cell <- rep("Malignant",nrow(Mali@meta.data))
Mali$Cell <- Cell
DE <- run_de(Mali,replicate_col = "orig.ident", cell_type_col = "Cell", label_col = "Group",
            de_family = "pseudobulk",
            de_method = "edgeR")
logFC_cutoff <- 0.25
DE$change <- as.factor(ifelse(DE$p_val < 0.05 & abs(DE$avg_logFC) > logFC_cutoff,
                                   ifelse(DE$avg_logFC > logFC_cutoff ,'UP','DOWN'),'NOT'))
DE$symbol <- DE$gene
s2e <- bitr(DE$symbol, 
            fromType = "SYMBOL",
            toType = "ENTREZID",
            OrgDb = org.Hs.eg.db)
DE <- inner_join(DE,s2e,by=c("symbol"="SYMBOL"))

# Functional Analysis
gene_up <- DE[DE$change %in"UP","symbol"]
gene_down <- DE[DE$change %in"DOWN","symbol"]

gene_up <- as.character(na.omit(AnnotationDbi::select(org.Hs.eg.db,keys = gene_up,columns = 'ENTREZID',keytype = 'SYMBOL')[,2]))
gene_down <- as.character(na.omit(AnnotationDbi::select(org.Hs.eg.db,keys = gene_down,columns = 'ENTREZID',keytype = 'SYMBOL')[,2]))

run_kegg <- function(gene_up,gene_down,geneList=F,pro='test'){
  gene_up=unique(gene_up)
  gene_down=unique(gene_down)
  kk.up <- enrichKEGG(gene         = gene_up,
                      organism     = 'hsa',
                      #universe     = gene_all,
                      pvalueCutoff = 0.9,
                      qvalueCutoff =0.9)
  kk=kk.up
  kk=DOSE::setReadable(kk, OrgDb='org.Hs.eg.db',keyType='ENTREZID')
  write.csv(kk@result,paste0(pro,'_kk.up.csv'))
  kk.down <- enrichKEGG(gene         =  gene_down,
                        organism     = 'hsa',
                        #universe     = gene_all,
                        pvalueCutoff = 0.9,
                        qvalueCutoff =0.9)
  head(kk.down)[,1:6]
  kk=kk.down
  dotplot(kk)
  kk=DOSE::setReadable(kk, OrgDb='org.Hs.eg.db',keyType='ENTREZID')
  write.csv(kk@result,paste0(pro,'_kk.down.csv'))
}

run_kegg(gene_up,gene_down,pro=paste0("./Functional_Analysis/KEGG"))

Keggall <- read.gmt("./kegghsa.gmt"# download from GSEA database
Keggmeta <- filter(Keggall,Keggall$term %in% c("hsa01100_Metabolic_pathways")|str_detect(Keggall$term,"metabolism$"))

head(KEGG)
head(Keggmeta)

gene <- unique(as.vector(DE$symbol))
gene <- bitr(gene, fromType="SYMBOL", toType="ENTREZID", OrgDb="org.Hs.eg.db")
gene_df <- data.frame(logFC= DE$avg_log2FC,
                      SYMBOL = DE$gene)
gene_df <- merge(gene_df,gene,by="SYMBOL")
geneList <- gene_df$logFC
names(geneList) <- gene_df$SYMBOL
geneList <- sort(geneList, decreasing = TRUE)
gsea <- GSEA(geneList,TERM2GENE = META_ACTIVATE)

同时AUCell可视化通路打分情况:

这个都是常规代码了:


# AUCell
geneSets <- lapply(unique(META_ACTIVATE$term), function(x){Hallmarker$gene[META_ACTIVATE$term == x]})
names(geneSets) <- unique(META_ACTIVATE$term)
names(geneSets) <- "META_ACTIVATE"

exprMatrix <- as.matrix(Mali@assays$RNA@data)
cells_rankings <- AUCell_buildRankings(exprMatrix,splitByBlocks=TRUE
cells_AUC <- AUCell_calcAUC(geneSets, cells_rankings, aucMaxRank=nrow(cells_rankings)*0.1)
cells_assignment <- AUCell_exploreThresholds(cells_AUC, plotHist=T, assign=TRUE)
warningMsg <- sapply(cells_assignment, function(x) x$aucThr$comment)

warningMsg[which(warningMsg =="")]
sapply(cells_assignment, function(x) x$aucThr$selected)

selectedThresholds <- getThresholdSelected(cells_assignment)
cellsAssigned <- lapply(cells_assignment, function(x) x$assignment)
assignmentTable <- reshape2::melt(cellsAssigned, value.name="cell")
colnames(assignmentTable)[2] <- "geneSet"

head(assignmentTable)

assignmentMat <- table(assignmentTable[,"geneSet"], assignmentTable[,"cell"])
selectedThresholds <- getThresholdSelected(cells_assignment)
dat <- data.frame(Mali@meta.data, Mali@reductions$umap@cell.embeddings)
umap <- data.frame(Mali@reductions$umap@cell.embeddings)
umap <- as.matrix(umap)
plot(umap, cex=.3)
assignmentTable[1:4,]

for(geneSetName in names(selectedThresholds)){
  colorPal_Neg <- grDevices::colorRampPalette(c("black","blue""skyblue"))(5)
  colorPal_Pos <- grDevices::colorRampPalette(c("pink""magenta""red"))(5)
  passThreshold <- getAUC(cells_AUC)[geneSetName,] >  selectedThresholds[geneSetName]
  if(sum(passThreshold) >0 )  {
    aucSplit <- split(getAUC(cells_AUC)[geneSetName,], passThreshold)
    cellColor <- c(setNames(colorPal_Neg[cut(aucSplit[[1]], breaks=5)], names(aucSplit[[1]])),
                   setNames(colorPal_Pos[cut(aucSplit[[2]], breaks=5)], names(aucSplit[[2]])))
    plot(umap, main=geneSetName,
         sub="Pink/red cells pass the threshold",
         col=cellColor[rownames(umap)], pch=16)
  }
}
par(mfrow=c(1,1))
AUCell_plotTSNE(tSNE=umap, exprMat=exprMatrix, 
                cellsAUC=cells_AUC[c(1),], thresholds=selectedThresholds[c(1)])
geneSet <- "META_ACTIVATE"
aucs <- as.numeric(getAUC(cells_AUC)[geneSet, ])
Mali$AUC  <- aucs
par(mfrow=c(1,1))
umap <- data.frame(Mali@meta.data, Mali@reductions$umap@cell.embeddings)

后面还有Cibersortx以及预后模型构建,药物预测后差异情况展现,这个数据挖掘作者把代码简单的整理到了,https://github.com/Mcdull8/METArisk/blob/main/METArisk_code.R

借花献佛给大家。

Git和GitHub在生物信息学中有许多优点,包括但不限于以下几点:

  1. 版本控制:Git允许你保存项目的不同版本,这样你就可以轻松地回溯到旧版本,或者比较不同版本之间的差异。这对于长期的生物信息学项目来说非常有用,因为你可能需要追踪代码和数据分析的变化。
  2. 协作:GitHub是一个在线平台,允许多人共享和协作项目。这对于团队工作非常有用,因为每个人都可以在自己的分支上工作,然后将更改合并到主分支。这也使得远程协作变得简单。
  3. 代码共享和复用:GitHub允许你公开分享你的代码和项目,这样其他人就可以使用和改进你的工作。这对于科学研究来说非常重要,因为它促进了开放科学和代码复用。
  4. 文档:GitHub支持Markdown,这是一种简单的标记语言,可以用来编写项目的文档和说明。这使得代码更易于理解和使用。
  5. 整合其他工具:GitHub可以与许多其他工具(如持续集成/持续部署工具)集成,以自动化测试和部署等工作流程。
  6. 学习和教学:通过查看他人在GitHub上的代码,你可以学习新的编程技巧和最佳实践。此外,GitHub也被用于教学,让学生在实践中学习编程和协作。
  7. 项目管理:GitHub提供了一些项目管理工具,如问题跟踪和项目板,可以帮助你组织和优先处理工作。

总的来说,Git和GitHub是生物信息学中不可或缺的工具,它们可以帮助你更有效地管理和共享你的工作。

GitHub在生物信息学领域中的重要性主要体现在以下几个方面:

  1. 代码共享和版本控制:GitHub是一个基于Git的版本控制系统,使得生物信息学家可以轻松地管理和跟踪代码的不同版本。这对于处理复杂的生物信息学项目至关重要,因为这些项目通常涉及大量的代码和数据处理步骤。
  2. 协作和透明度:GitHub允许多人共同在一个项目上工作,使得团队成员可以查看和修改他人的代码,从而增加了协作的效率。此外,通过公开项目,GitHub也提供了一种透明度,使得其他研究者可以查看、复制和验证你的工作。
  3. 软件发布和文档:GitHub不仅可以用于代码的版本控制,也常常被用来发布生物信息学软件和工具。许多生物信息学工具的开发者会在GitHub上发布他们的软件,并提供详细的使用说明和文档。
  4. 学习和教育资源:GitHub上有大量的教程和示例代码,这些资源对于学习新的生物信息学技术和方法非常有用。此外,教师也可以使用GitHub来分发课程材料和作业。
  5. 持续集成和自动化测试:GitHub可以与各种持续集成服务(如Travis CI)集成,这使得生物信息学家可以自动化他们的代码测试和构建过程,从而确保代码的质量和稳定性。




https://blog.sciencenet.cn/blog-2866696-1395414.html

上一篇:JAMA子刊:麻省理工&哈佛研究84万大样本发现,每天早睡早起1小时,患抑郁症风险降低23%
下一篇:How to become Elon Musk
收藏 IP: 98.118.105.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-27 08:04

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部