基因相关性的计算

在单细胞转录组解析肥厚性心肌病发病机制里面看到计算某基因与其它基因的相关性

方法里写的是这样做的

之前没做过单细胞数据某个基因与其它基因的相关性,来试一试吧。

1. 读入数据

以pbmc3k为例

pbmc <- readRDS("pbmc.rds")
exprSet <- pbmc@assays[["RNA"]]@data  
exprSet<-as.data.frame(t(exprSet)) #转置

插曲:
在这里应该是使用@data还是@scale.data的数据纠结了一下

  • 小范同学认为:前面文献里写的做的是Pearson correlation,pearson要符合正态分布,要用Log后的数据做。
    另外,seurat里面有个GroupCorrelation函数,就是用的Log后数据去做pearson。他们认为Log后的数据,比较接近正态分布。scale这个过程可以看成把数据转换成更接近正态。
    在GroupCorrelation函数源代码里面,有个GetFeatureGroups函数

我们打开GetFeatureGroups函数的源代码,就可以看见明显的Log化

题外话:牵扯到整合多个样本来源不同测序手段或者测序深度不同的样本数据,去做某几个基因表达量的相关性,是不是最好用spearman比pearson更好?
对此专业人士表示:

额,好的,那就还是用pearson

扯远了...扯回来

  • 追风少年说:做correlation还是需要用标准化的矩阵,因为和普通转录组一样的测序深度保持一致,scale缩放成同一比例了,是用来做pca的

  • 但是jimmy老师

好吧...所以我这里用的还是@data (@scale.data的槽子是专门拿来做PCA的?)@data和@scale.data的区别见单细胞数据处理小细节汇总

2. 计算某个基因和其它基因的相关性(以S100A8为例)
y <- as.numeric(exprSet[,"ISG15"])
colnames <- colnames(exprSet)
cor_data_df <- data.frame(colnames)
for (i in 1:length(colnames)){
  test <- cor.test(as.numeric(exprSet[,i]),y,type="spearman")
  cor_data_df[i,2] <- test$estimate
  cor_data_df[i,3] <- test$p.value
}
names(cor_data_df) <- c("symbol","correlation","pvalue")
View(cor_data_df)
3. 筛选有意义的正相关和负相关的基因
library(dplyr)
library(tidyr)
cor_data_sig_pos <- cor_data_df %>%
  filter(pvalue < 0.01) %>% filter(correlation > 0)%>%
  arrange(desc(correlation))
cor_data_sig_neg <- cor_data_df %>%
  filter(pvalue < 0.01) %>% filter(correlation < 0)%>%
  arrange(desc(abs(correlation)))

得到1664个正相关基因和1615个负相关基因

4. 随机选取正相关和负相关基因,分别作图验证

正相关选S100A9

library(ggstatsplot)
ggscatterstats(data = exprSet,
               y = S100A8,
               x = S100A9,
               centrality.para = "mean",
               margins = "both",
               xfill = "#CC79A7",
               yfill = "#009E73",
               marginal.type = "densigram", # #类型可以换成density,boxplot,violin,densigram
               title = "Relationship between S100A8 and S100A9")

负相关选MALAT1

library(ggstatsplot)
ggscatterstats(data = exprSet,
               y = S100A8,
               x = MALAT1,
               centrality.para = "mean",
               margins = "both",
               xfill = "#CC79A7",
               yfill = "#009E73",
               marginal.type = "densigram", # #类型可以换成density,boxplot,violin,densigram
               title = "Relationship between S100A8 and MALAT1")

这两个图的更简单画法(SeuratFeatureScatter函数):

p1=FeatureScatter(pbmc, feature1 = "S100A8", feature2 = "S100A9")
p2=FeatureScatter(pbmc, feature1 = "S100A8", feature2 = "MALAT1")
p1|p2
最上面的系数就是Pearson相关系数
5. 其它分析
  • 第三部分得到了正相关和负相关基因以后,就可以画开头那张火山图了。
    画法参考:单细胞亚群差异基因火山图
  • 对正相关和负相关基因做富集,推断目的基因功能。

你可能感兴趣的:(基因相关性的计算)