[关闭]
@agpwhy 2022-01-18T02:47:33.000000Z 字数 2599 阅读 399

王胖的生信笔记第34期:单细胞树型图

事情的起因

一周多前,小老板给我丢了这么一篇我之前丢给过他看的文章 Lineage tracking reveals dynamic relationships of T cells in colorectal cancer (doi:10.1038/s41586-018-0694-x)。里面当初比较感兴趣的是他关于T细胞的一些细节描述。但那天他在翻的时候,看到了这么一张图。

示范

问我能不能做一下类似的

对话

然后一研究就发现其实之前有做过类似的(详见我笔记第13期)。但是这篇文章用的计算各群之间距离的方法比较细:Similarities of the signature gene expressions of T cell clusters. Distance: (1-Pearson correlation coefficient)/2。解决这个问题就解决了一段时间。现无偿公布如下。

找个示范数据

原文的数据太大了,就找个替代的数据。

  1. library(SeuratData)
  2. library(Seurat)
  3. library(tidyverse)
  4. data("bmcite")
  5. bmcite$celltype.l2 <- as.factor(bmcite$celltype.l2)

这是一个30k Bone Marrow Cells的参考数据集。里面已经进行了细胞类型鉴定和注释,共分了27群,非常适合进行示范。不会搞这个参考数据集的话,下次我来搞个视频试试?

选出代表基因计算矩阵

对于计算相似性,拿所有基因去算太多,就挑选一些代表性的基因。

  1. df <- data.frame()
  2. for(i in 1:length(levels(bmcite$celltype.l2))) {
  3. df_i <-
  4. FindMarkers(
  5. bmcite,
  6. ident.1 = levels(bmcite$celltype.l2)[i],
  7. group.by = "celltype.l2",
  8. logfc.threshold = 0.25,
  9. only.pos = T,
  10. )
  11. df_i$cluster <- levels(bmcite$celltype.l2)[i]
  12. df_i$gene <- rownames(df_i)
  13. df <- rbind(df, df_i)
  14. }
  15. top=10
  16. TopMarker1 <- df %>% group_by(cluster) %>%
  17. top_n(n = top, wt = avg_log2FC)
  18. genelist <- unique(TopMarker1$gene)

然后根据筛选的的基因构建数据矩阵

  1. dat <- AverageExpression(bmcite,assay="RNA",features = genelist,group.by = "celltype.l2")

后面我的操作就有点丑陋了。

计算距离

Distance: (1-Pearson correlation coefficient)/2。就文中短短几句话,自己想要想破头。

最后反正我的这个实现方式挺丑陋的,就当抛砖引玉吧。

  1. mat <- dat[[1]]
  2. mat <- t(mat)
  3. df <- dat[[1]]
  4. df <- as.data.frame(df)
  5. dim(df)
  6. z <- matrix(NA,27,27)
  7. for (i in 1:27){
  8. for (j in 1:27){
  9. a = cor(df[,i],df[,j],method="pearson")
  10. z[i,j]=(1-a)/2
  11. }
  12. }
  13. colnames(z) <- colnames(df)
  14. rownames(z) <- colnames(df)
  15. test <- z
  16. test <- test[-1,]
  17. for (i in 1:26){
  18. for (j in (i+1):27){
  19. test[i,j]= NA
  20. }
  21. }
  22. sf <- dist(mat,method = "euclidean")
  23. number <- numeric()
  24. for (i in 1:26){
  25. number[i] <- (((26+27-i+1)*(i-1))/2)
  26. }
  27. for (i in 1:26){
  28. for (j in i:26){
  29. sf[(((26+27-i+1)*(i-1))/2)+j+1-i]= test[j,i]
  30. }
  31. }
  32. mydatatest<-hclust(sf)

最后就是作图了

  1. ggtree(mydatatest) + geom_tiplab(hjust = 0, size = 3) + xlim(0,.3) + ggtitle("Zhang's Paper") +
  2. theme(title = element_text(size = 24,face = "bold", hjust = .5))

ZhangTree

这就是最基本的树形图结构了。如果要改成他文章中的那种展示类型,可以看看ggtree的说明书(https://yulab-smu.top/treedata-book/chapter4.html)。

树形图类型选择

树形图类型选择2

看着张泽民老师那篇文章里用的是daylight这种分布方式。

  1. ggtree(mydatatest, layout = "daylight")+geom_tiplab(hjust=0,size=4)+ggtitle("Zhang's Paper")+
  2. theme(title = element_text(size = 24,face = "bold", hjust = .5))

Zhang

其他各种计算距离方式

公式

R里面还自带这些计算距离方式,对于数学我很外行。可能过要看哪种更符合你的预期了。

  1. mydata<-hclust(dist(mat,method = "euclidean"))
  2. ggtree(mydata)+geom_tiplab(hjust= 0,size=3)+xlim(0, 1500)+ggtitle("Euclidean")+
  3. theme(title = element_text(size = 24,face = "bold", hjust = .5))
  4. ggtree(mydata, layout = "daylight")+geom_tiplab(hjust = 0,size=4)+ggtitle("Euclidean")+
  5. theme(title = element_text(size = 24,face = "bold", hjust = .5))

这是欧几里得计算距离方式

euclideanTree

euclidean

很显然展示的结果不太一样。血小板,红细胞和其他骨髓细胞区别非常大,这可能反而是更贴近实际的情况吧。不知道张老师为什么选用了他那种方式。

其他的计算距离结果:

binary

canberra

maximum

minkowski

【minkowski方法结果和euclidean非常类似,不知道是不是什么数学上的原因】

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注