当前位置:   article > 正文

手把手教你R语言CIBERSORT计算免疫浸润+Rproject的使用

cibersort

写在开头:

本文介绍了CIBERSORT两种使用方法,大家可以自行选择,方法二简单些,方法一原始些

本文顺便倡议大家使用Rproject来管理代码,感谢生信技能树jimmy老师让我知道了这么方便的玩意,再也不用拼命setwd()和getwd()了,不想看这部分可以直接下滑。

CIBERSORTx是原版网站,建议大家去学习,并且学习他们发的经典文章

鸣谢:生信技能树jimmy老师和 Biomamba 生信基地 BIOMAMBA老师


使用Rproject管理R项目

1.提前在你想要储存代码的地方建一个文件夹,然后打开Rstudio 中选择 NEW Project

2.选择Existing Directory,因为刚刚已经提前建好了文件夹。如果刚刚没有建,选NEW Directory就会给你建一个,属于个人习惯,都可以。

 3.建立Project,比如我在zhangming这个文件夹下建立,creat后即可建立

 4.在zhangming文件夹中出现了相关的project文件

 5.双击这个文件,就会直接定位在这个工作路径,而不需要切换setwd()

 6.再新建script,新建的code都会在同一个工作环境/工作文件夹内,非常方便,尤其是对于大量的代码学习,可以很好的节省时间。当然如果你不喜欢这样,也可以直接进入下面的CIBERSORT学习。具体不懂的地方还可以看其他人对project的解释,亲测很好上手。


下面进入CIBERSORT的学习

首先安装包

  1. # install packages 这三个安装不成功的话,就安后面的bseqsc包也行
  2. install.packages('e1071')
  3. install.pacakges('parallel')
  4. install.packages('preprocessCore')
  5. library(e1071)
  6. library(preprocessCore)
  7. library(parallel)
  8. install.packages('devtools')
  9. library(devtools)
  10. devtools::install_github('shenorrlab/bseqsc')
  11. library(bseqsc)#这个包携带大量CIBERSORT的依赖,前三个安装不好可以安装他

方法一:自行创造函数法,较复杂。新手建议方法二

此法使用Cibersort工具需要三个文件:
1、sourcecibersort.R
2、LM22.txt
3、genes_exp.txt

1.sourcecibersort.R

直接把下列代码新建一个script,然后保存,保存名字为sourcecibersort.R

  1. #' CIBERSORT R script v1.03 (last updated 07-10-2015)
  2. #' Note: Signature matrix construction is not currently available; use java version for full functionality.
  3. #' Author: Aaron M. Newman, Stanford University (amnewman@stanford.edu)
  4. #' Requirements:
  5. #' R v3.0 or later. (dependencies below might not work properly with earlier versions)
  6. #' install.packages('e1071')
  7. #' install.pacakges('parallel')
  8. #' install.packages('preprocessCore')
  9. #' if preprocessCore is not available in the repositories you have selected, run the following:
  10. #' source("http://bioconductor.org/biocLite.R")
  11. #' biocLite("preprocessCore")
  12. #' Windows users using the R GUI may need to Run as Administrator to install or update packages.
  13. #' This script uses 3 parallel processes. Since Windows does not support forking, this script will run
  14. #' single-threaded in Windows.
  15. #'
  16. #' Usage:
  17. #' Navigate to directory containing R script
  18. #'
  19. #' In R:
  20. #' source('CIBERSORT.R')
  21. #' results <- CIBERSORT('sig_matrix_file.txt','mixture_file.txt', perm, QN)
  22. #'
  23. #' Options:
  24. #' i) perm = No. permutations; set to >=100 to calculate p-values (default = 0)
  25. #' ii) QN = Quantile normalization of input mixture (default = TRUE)
  26. #'
  27. #' Input: signature matrix and mixture file, formatted as specified at http://cibersort.stanford.edu/tutorial.php
  28. #' Output: matrix object containing all results and tabular data written to disk 'CIBERSORT-Results.txt'
  29. #' License: http://cibersort.stanford.edu/CIBERSORT_License.txt
  30. #' Core algorithm
  31. #' @param X cell-specific gene expression
  32. #' @param y mixed expression per sample
  33. #' @export
  34. CoreAlg <- function(X, y){
  35. #try different values of nu
  36. svn_itor <- 3
  37. res <- function(i){
  38. if(i==1){nus <- 0.25}
  39. if(i==2){nus <- 0.5}
  40. if(i==3){nus <- 0.75}
  41. model<-e1071::svm(X,y,type="nu-regression",kernel="linear",nu=nus,scale=F)
  42. model
  43. }
  44. if(Sys.info()['sysname'] == 'Windows') out <- parallel::mclapply(1:svn_itor, res, mc.cores=1) else
  45. out <- parallel::mclapply(1:svn_itor, res, mc.cores=svn_itor)
  46. nusvm <- rep(0,svn_itor)
  47. corrv <- rep(0,svn_itor)
  48. #do cibersort
  49. t <- 1
  50. while(t <= svn_itor) {
  51. weights = t(out[[t]]$coefs) %*% out[[t]]$SV
  52. weights[which(weights<0)]<-0
  53. w<-weights/sum(weights)
  54. u <- sweep(X,MARGIN=2,w,'*')
  55. k <- apply(u, 1, sum)
  56. nusvm[t] <- sqrt((mean((k - y)^2)))
  57. corrv[t] <- cor(k, y)
  58. t <- t + 1
  59. }
  60. #pick best model
  61. rmses <- nusvm
  62. mn <- which.min(rmses)
  63. model <- out[[mn]]
  64. #get and normalize coefficients
  65. q <- t(model$coefs) %*% model$SV
  66. q[which(q<0)]<-0
  67. w <- (q/sum(q))
  68. mix_rmse <- rmses[mn]
  69. mix_r <- corrv[mn]
  70. newList <- list("w" = w, "mix_rmse" = mix_rmse, "mix_r" = mix_r)
  71. }
  72. #' do permutations
  73. #' @param perm Number of permutations
  74. #' @param X cell-specific gene expression
  75. #' @param y mixed expression per sample
  76. #' @export
  77. doPerm <- function(perm, X, Y){
  78. itor <- 1
  79. Ylist <- as.list(data.matrix(Y))
  80. dist <- matrix()
  81. while(itor <= perm){
  82. #print(itor)
  83. #random mixture
  84. yr <- as.numeric(Ylist[sample(length(Ylist),dim(X)[1])])
  85. #standardize mixture
  86. yr <- (yr - mean(yr)) / sd(yr)
  87. #run CIBERSORT core algorithm
  88. result <- CoreAlg(X, yr)
  89. mix_r <- result$mix_r
  90. #store correlation
  91. if(itor == 1) {dist <- mix_r}
  92. else {dist <- rbind(dist, mix_r)}
  93. itor <- itor + 1
  94. }
  95. newList <- list("dist" = dist)
  96. }
  97. #' Main functions
  98. #' @param sig_matrix file path to gene expression from isolated cells
  99. #' @param mixture_file heterogenous mixed expression
  100. #' @param perm Number of permutations
  101. #' @param QN Perform quantile normalization or not (TRUE/FALSE)
  102. #' @export
  103. CIBERSORT <- function(sig_matrix, mixture_file, perm=0, QN=TRUE){
  104. #read in data
  105. X <- read.table(sig_matrix,header=T,sep="\t",row.names=1,check.names=F)
  106. Y <- read.table(mixture_file, header=T, sep="\t", row.names=1,check.names=F)
  107. X <- data.matrix(X)
  108. Y <- data.matrix(Y)
  109. #order
  110. X <- X[order(rownames(X)),]
  111. Y <- Y[order(rownames(Y)),]
  112. P <- perm #number of permutations
  113. #anti-log if max < 50 in mixture file
  114. if(max(Y) < 50) {Y <- 2^Y}
  115. #quantile normalization of mixture file
  116. if(QN == TRUE){
  117. tmpc <- colnames(Y)
  118. tmpr <- rownames(Y)
  119. Y <- preprocessCore::normalize.quantiles(Y)
  120. colnames(Y) <- tmpc
  121. rownames(Y) <- tmpr
  122. }
  123. #intersect genes
  124. Xgns <- row.names(X)
  125. Ygns <- row.names(Y)
  126. YintX <- Ygns %in% Xgns
  127. Y <- Y[YintX,]
  128. XintY <- Xgns %in% row.names(Y)
  129. X <- X[XintY,]
  130. #standardize sig matrix
  131. X <- (X - mean(X)) / sd(as.vector(X))
  132. #empirical null distribution of correlation coefficients
  133. if(P > 0) {nulldist <- sort(doPerm(P, X, Y)$dist)}
  134. #print(nulldist)
  135. header <- c('Mixture',colnames(X),"P-value","Correlation","RMSE")
  136. #print(header)
  137. output <- matrix()
  138. itor <- 1
  139. mixtures <- dim(Y)[2]
  140. pval <- 9999
  141. #iterate through mixtures
  142. while(itor <= mixtures){
  143. y <- Y[,itor]
  144. #standardize mixture
  145. y <- (y - mean(y)) / sd(y)
  146. #run SVR core algorithm
  147. result <- CoreAlg(X, y)
  148. #get results
  149. w <- result$w
  150. mix_r <- result$mix_r
  151. mix_rmse <- result$mix_rmse
  152. #calculate p-value
  153. if(P > 0) {pval <- 1 - (which.min(abs(nulldist - mix_r)) / length(nulldist))}
  154. #print output
  155. out <- c(colnames(Y)[itor],w,pval,mix_r,mix_rmse)
  156. if(itor == 1) {output <- out}
  157. else {output <- rbind(output, out)}
  158. itor <- itor + 1
  159. }
  160. #save results
  161. write.table(rbind(header,output), file="CIBERSORT-Results.txt", sep="\t", row.names=F, col.names=F, quote=F)
  162. #return matrix object containing all results
  163. obj <- rbind(header,output)
  164. obj <- obj[,-1]
  165. obj <- obj[-1,]
  166. obj <- matrix(as.numeric(unlist(obj)),nrow=nrow(obj))
  167. rownames(obj) <- colnames(Y)
  168. colnames(obj) <- c(colnames(X),"P-value","Correlation","RMSE")
  169. obj
  170. }

2.LM22.txt(文末网盘),用来作参考的免疫浸润数据集,也可以官网下载,是一样的。

3.genes_exp.txt(文末网盘),实际上就是你要处理的自己的数据或者TCGA的数据

4.启动

  1. source("sourcecibersort.R") #启动这个函数,必须在哦那个一个文件夹内才可哟
  2. results <- CIBERSORT(sig_matrix ="LM22.txt", mixture_file ="genes_exp.txt", perm = 1000, QN = T)
  3. # perm置换次数=1000,QN分位数归一化=TRUE
  4. # 文件名可以自定义
  5. # 得到的结果可以用来绘制热图等等

5.之后的分析和方法二一样,都是对results进行绘图


方法二:使用打包的函数法,这个需要下载R包,但不需要自己创造函数了

1.还是运行以下代码,多安了个包

  1. # install packages 这三个安装不成功的话,就安后面的bseqsc包也行
  2. install.packages('e1071')
  3. install.pacakges('parallel')
  4. install.packages('preprocessCore')
  5. library(e1071)
  6. library(preprocessCore)
  7. library(parallel)
  8. install.packages('devtools')
  9. library(devtools)
  10. devtools::install_github('shenorrlab/bseqsc')
  11. library(bseqsc)#这个包携带大量CIBERSORT的依赖,前三个安装不好可以安装他
  12. ################安装CIBERSORT包##########################################################
  13. if(!require(CIBERSORT))devtools::install_github("Moonerss/CIBERSORT")
  14. library(CIBERSORT)
  15. # 包全部安装完成
  16. # 画热图的包
  17. install.packages("pheatmap")
  18. install.packages("ComplexHeatmap")
  19. library(ggplot2)
  20. library(pheatmap)
  21. library(ComplexHeatmap)

安装好以后就可以使用cibersort函数

2.它的好处在于自带了LM22文件和测试文件,你不需要额外去下载和整理了。我本人已经测试过这个LM22和自己读取的LM22完全一样。直接运行下列code即可出图

  1. # 同时准备好LM22的TXT文件,注意自己以后的文件要和这个TXT的格式一样
  2. # 加载CIBERSORT包成功后,系统内部会自带data(LM22)
  3. data(LM22)
  4. data(mixed_expr)#TCGA的演示数据,正式情况下就用自己的数据
  5. # 正式开始探索
  6. # 看5*5的数据
  7. LM22[1:5,1:5]
  8. mixed_expr[1:5,1:5]
  9. # 分别定义signature矩阵LM22和我的数据(演示)矩阵mixed_expr
  10. results <- cibersort(sig_matrix = LM22, mixture_file = mixed_expr)
  11. # 理解一下results的结果
  12. # 你可以理解为返回了一个列名为细胞类型、行名为样本名的细胞浸润程度(占比)的矩阵
  13. # 此外result中还会多出三列:
  14. # P-value: 用来展示去卷积的结果在所有细胞类群中是否具有差异
  15. # Correlation:参考矩阵与输入矩阵的特征基因相关性
  16. # RMSE: Root mean squared error,参考矩阵与输入矩阵的特征基因标准差
  17. # heatmap
  18. # 按行(样本内部)标准化可以看出在各类样本内部,M2浸润程度(占比)最高
  19. rowscale <- results[,1:ncol(LM22)]#只是相当于备份了一下results
  20. rowscale <- rowscale[,apply(rowscale, 2, function(x){sum(x)>0})]#删除全是0的列
  21. pheatmap(rowscale,
  22. scale = 'row',#按行标准化,不标准化就会按绝对值显示,很诡异
  23. cluster_col=T,#是否对列聚类,不聚类,坐标轴就按照原来的顺序显示
  24. cluster_row=F,#是否对行聚类
  25. angle_col = "315")#调整X轴坐标的倾斜角度
  26. # 各类样本之间也具有自己占比高的特异性免疫细胞
  27. columnscale <- results[,1:ncol(LM22)]
  28. columnscale <- columnscale[,apply(columnscale, 2, function(x){sum(x)>0})]#删除全是0的列
  29. pheatmap(columnscale,
  30. scale = 'column',
  31. cluster_col=F,
  32. cluster_row=T,
  33. angle_col = "315")
  34. # 堆积比例图
  35. my36colors <-c('#E5D2DD', '#53A85F', '#F1BB72', '#F3B1A0', '#D6E7A3', '#57C3F3', '#476D87','#E95C59', '#E59CC4', '#AB3282', '#23452F', '#BD956A', '#8C549C', '#585658','#9FA3A8', '#E0D4CA', '#5F3D69', '#C5DEBA', '#58A4C3', '#E4C755', '#F7F398','#AA9A59', '#E63863', '#E39A35', '#C1E6F3', '#6778AE', '#91D0BE', '#B53E2B', '#712820', '#DCC1DD', '#CCE0F5', '#CCC9E6', '#625D9E', '#68A180', '#3A6963','#968175'
  36. )
  37. cellnum <- results[,1:ncol(LM22)]
  38. cell.prop<- apply(cellnum, 1, function(x){x/sum(x)})
  39. data4plot <- data.frame()
  40. for (i in 1:ncol(cell.prop)) {
  41. data4plot <- rbind(
  42. data4plot,
  43. cbind(cell.prop[,i],rownames(cell.prop),
  44. rep(colnames(cell.prop)[i],nrow(cell.prop)
  45. )
  46. )
  47. )
  48. }
  49. colnames(data4plot)<-c('proportion','celltype','sample')
  50. data4plot$proportion <- as.numeric(data4plot$proportion)
  51. ggplot(data4plot,aes(sample,proportion,fill=celltype))+
  52. geom_bar(stat="identity",position="fill")+
  53. scale_fill_manual(values=my36colors)+#自定义fill的颜色
  54. ggtitle("cell portation")+
  55. theme_bw()+
  56. theme(axis.ticks.length=unit(0.5,'cm'),axis.title.x=element_text(size=1))+
  57. theme(axis.text.x = element_text(angle = 45, hjust = 0.5, vjust = 0.5))+#把x坐标轴横过来
  58. guides(fill=guide_legend(title=NULL))

 

LM22:

#########链接:https://pan.baidu.com/s/1eQSEekekozS5osgydwzk1w
#@####提取码:fk88
 

  1. LM22read <- read.csv("LM22.csv",header = T)
  2. gene <- LM22read[,1]
  3. rownames(LM22read) <- gene
  4. LM22read <- LM22read[,-1]
  5. data(LM22)
  6. all(LM22==LM22read)#可以看到TURE,说明两个文件完全一样了;LM22是上文提到的安装CIBERSORT包之后自带的data

鸣谢:生信技能树jimmy老师和 Biomamba 生信基地 BIOMAMBA老师

有疑问可以邮件联系我,会尽力帮忙:yunbk@mail2.sysu.edu.cn


2023.03.05更新

结合不少小伙伴的私信和邮件更新几个点

1.自己的表达矩阵格式:按照作者的文档和示例数据,应该是不取log的,也不能做其他的normalizie处理。当然如果是log处理过的,cibersort会自己去log,所以也不必担心。数据应该是标准化后的数据比如FPKM TPM CPM这样,不应该用count。

2.在数据量比较大,样本多的时候,请下载R包使用cibersort,因为source函数的读取速度会变得很慢。

3.计算前需要排除空值(NA)值,不然会报错

4.最新的版本是cibersortX,但是好像现在维护有点问题,大家可以自行搜索一下这个方法

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/221978
推荐阅读