CIBERSORT是主流计算免疫浸润的两种主流方法之一(另一种是ssGSEA)。
在进行CIBERSORT分析的时候,关键的一步是根据内置的22种免疫细胞基因表达特征数据结合自己的表达矩阵文件计算每一个样本中的免疫细胞浸润情况。
其中在这一步的时候经常会出现很多报错,比如连接问题,数据格式问题等等。
这次就遇到了如下的这个报错。
这个错误 ERROR; return code from pthread_create() is 22 表示在调用 pthread_create() 函数时,线程创建失败。返回代码 22 对应的错误是 EINVAL,即无效参数。
这个问题通常与系统资源、R 的并行处理配置或运行环境有关。
可能的原因有如下几点
1. 系统资源不足:
系统可能没有足够的资源来创建新线程,例如内存或 CPU 资源。
2. 线程限制:
系统可能达到了允许的最大线程数。
3. RStudio 环境的限制:
RStudio 对并行处理有一些限制,可能导致无法创建新线程。
4. 无效参数:
传递给 pthread_create() 的参数无效。
采用下边的代码就可以解决问题
# 加载包
library(parallel)
library(CIBERSORT)
# 设置文件路径
lm22f = system.file("extdata", "LM22.txt", package = "CIBERSORT")
# 定义多线程集群
num_cores <- detectCores() - 1 # 使用所有核心减去一个,保留一个核心给系统
cl <- makeCluster(num_cores)
# 将必要的数据和函数传递给集群中的每个节点
clusterEvalQ(cl, {
library(CIBERSORT)
lm22f <- system.file("extdata", "LM22.txt", package = "CIBERSORT")
})
# 定义一个函数来运行 cibersort
run_cibersort <- function(exp_file) {
TME.results <- cibersort(lm22f, exp_file, perm = 1000, QN = TRUE)
return(TME.results)
}
# 使用 parLapply 在多个核心上并行运行
exp_files <- list("exp.txt") # 如果有多个文件,可以将它们放在这个列表中
TME.results_list <- parLapply(cl, exp_files, run_cibersort)
# 停止集群
stopCluster(cl)
# 保存结果
TME.results <- TME.results_list[[1]]
save(TME.results, file = "ciber_LIHC.Rdata")
当然除了这个方法以外可能还有其他更好的解决方法, 求指点~
注:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。
- END -