ixxmu / mp_duty

抓取网络文章到github issues保存
https://archives.duty-machine.now.sh/
107 stars 30 forks source link

SCENIC单细胞转录因子预测|6.Step3 利用AUCell对Regulon评分 #3668

Closed ixxmu closed 1 year ago

ixxmu commented 1 year ago

https://mp.weixin.qq.com/s/DgifZl6Pk8eSrRsbNFVxYA

ixxmu commented 1 year ago

SCENIC单细胞转录因子预测|6.Step3 利用AUCell对Regulon评分 by Biomamba 生信基地

写在前面
SCENIC封装的过好(4.精简版流程),可能不利于大家理解每一步的含义,所以我们做一下分解动作。这个过程可能有些枯燥,但对于大家理解程序的执行过程、了解输出结果的含义非常有帮助。本次拆解的函数为runSCENIC_3_scoreCells()主要是使用AUCell将每个regulons作为一个基因集、以细胞为单位进行打分,判断regulon的激活情况(单细胞基因集评分之AUCell)。
我们之前介绍过单细胞基因集评分:
一文搞定单细胞基因集评分。硬件配置不足的同学可以看这里:生信分析为什么要使用服务器?
学习手册测试文件不断更新,可在这里获取(SCENIC.学习手册)或联系客服微信Biomamba领取。
学习手册:


当然更推荐大家去作者的Github学习:
https://github.com/aertslab/SCENIC

视频教程

B站同步播出:

https://www.bilibili.com/video/BV1Mg4y1c7wU?p=7



图文教程

#一步法,这里大家不要运行,我们下面要做拆解动作
scenicOptions <- runSCENIC_3_scoreCells(scenicOptions, exprMat_log)
vignette("detailedStep_3_scoreCells", package="SCENIC")#step3的完整官方教程

4.3.1 准备工作


library(SingleCellExperiment)
## Loading required package: SummarizedExperiment
## Loading required package: MatrixGenerics
## Loading required package: matrixStats
## 
## Attaching package: 'matrixStats'
## The following objects are masked from 'package:Biobase':
##
## anyMissing, rowMedians
## 
## Attaching package: 'MatrixGenerics'
## The following objects are masked from 'package:matrixStats':
##
## colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
## colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
## colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
## colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
## colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
## colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
## colWeightedMeans, colWeightedMedians, colWeightedSds,
## colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
## rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
## rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
## rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
## rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
## rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
## rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
## rowWeightedSds, rowWeightedVars
## The following object is masked from 'package:Biobase':
##
## rowMedians
## Loading required package: GenomicRanges
## Loading required package: stats4
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## The following objects are masked from 'package:data.table':
##
## first, second
## The following objects are masked from 'package:base':
##
## expand.grid, I, unname
## Loading required package: IRanges
## 
## Attaching package: 'IRanges'
## The following object is masked from 'package:data.table':
##
## shift
## Loading required package: GenomeInfoDb


#load("data/sceMouseBrain.RData")
#exprMat <- counts(sceMouseBrain)

#读入并设置一些参数选项
scenicOptions <- readRDS("int/scenicOptions.Rds")
skipBinaryThresholds=FALSE #是否跳过二元化步骤
skipHeatmap=FALSE #是否绘制AUCell score热图
skipTsne=FALSE #是否跳过tsne环节

4.3.2 调整regulon结构

step2中的结果载入,保留包含至少10个基因的regulon,并将TF名称与调控基因数量paste在一起


regulons <- loadInt(scenicOptions, "regulons")
regulons <- regulons[order(lengths(regulons), decreasing=TRUE)]#按照regulon包含的基因数量排序
regulons <- regulons[lengths(regulons)>=10]#保留调控基因数大于10的regulon
if(length(regulons) <2) stop("Not enough regulons with at least 10 genes.")#如果regulon数量小于2,则终止runSCENIC_3_scoreCells()的运行

# 将TF名称加入regulon并重命名
regulons <- setNames(lapply(names(regulons), function(tf) sort(unique(c(gsub("_extended", "", tf), regulons[[tf]])))), names(regulons))
names(regulons) <- paste(names(regulons), " (",lengths(regulons), "g)", sep="")
names(regulons)[1:5]
## [1] "Tef_extended (448g)"  "Tef (406g)"           "Dlx5_extended (222g)"
## [4] "Sox9_extended (196g)" "Sox9 (155g)"


saveRDS(regulons, file=getIntName(scenicOptions, "aucell_regulons"))#将以TF名+调控基因数量为名称、填充值为regulon调控基因的list存入"int/3.1_regulons_forAUCell.Rds"

msg <- paste0(format(Sys.time(), "%H:%M"), "\tStep 3. Analyzing the network activity in each individual cell")
if(getSettings(scenicOptions, "verbose")) message(msg)
## 12:52    Step 3. Analyzing the network activity in each individual cell


msg <- paste0("\nNumber of regulons to evaluate on cells: ", length(regulons),
"\nBiggest (non-extended) regulons: \n",
paste("\t", grep("_extended",names(regulons),invert = T, value = T)[1:10], collapse="\n"))#汇报分析进度
if(getSettings(scenicOptions, "verbose")) message(msg)
## 
## Number of regulons to evaluate on cells: 16
## Biggest (non-extended) regulons:
## Tef (406g)
## Sox9 (155g)
## Sox8 (112g)
## Irf1 (107g)
## Sox10 (107g)
## Dlx1 (100g)
## Dlx5 (51g)
## Stat6 (41g)
## NA
## NA

4.3.3 调用AUCell判断regulon激活情况

AUCell是一个很好的工具,我们专门用一篇推送介绍过流程:单细胞基因集评分之AUCell
(1)以细胞为单位给基因降序排序(ranking)


if(is.data.frame(exprMat)) 
{
supportedClasses <- paste(gsub("AUCell_buildRankings,", "", methods("AUCell_buildRankings")), collapse=", ")
supportedClasses <- gsub("-method", "", supportedClasses)
supportedClasses#取出几种method的名称
stop("'exprMat' should be one of the following classes: ", supportedClasses,
"\n(data.frames are not supported. Please, convert the expression matrix to one of these classes.)")
#若exprMat不存在则报错
}
getSettings(scenicOptions,"seed")#随机数种子为123
## [1] 123


set.seed(getSettings(scenicOptions,"seed"))#设定随机数种子保证AUCell计算的可重复性
tryCatch({
pdf(file = paste0(getIntName(scenicOptions, "aucell_genesStatsPlot"),'.my.pdf')
)#这里原文是.openDev,便于理解我将其改为pdf()函数
aucellRankings <- AUCell_buildRankings(exprMat,
plotStats=TRUE, verbose=getSettings(scenicOptions, "verbose"))#这里由于版本原因nCores可能不再适用
abline(v=aucellRankings@nGenesDetected["1%"], col="skyblue3", lwd=5, lty=3)
dev.off()
},error = function(e) {
message("Catched error in AUCell_buildRankings() or in the histogram plot: ", e$message)
})
## Quantiles for the number of genes detected by cell: 
## (Non-detected genes are shuffled at the end of the ranking. Keep it in mind when choosing the threshold for calculating the AUC).
##    min     1%     5%    10%    50%   100% 
## 46.00 58.99 77.00 84.80 154.00 342.00
## Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or
## useNames = TRUE.
## png 
## 2


#在画布里画出来给大家看一下

saveRDS(aucellRankings, file=getIntName(scenicOptions, "aucell_rankings"))#将ranking存于"int/3.3_aucellRankings.Rds"
  1. 计算Regulon活性(通过AUCell score)


library(AUCell)
nCores <- getSettings(scenicOptions, "nCores")
regulonAUC <- AUCell_calcAUC(regulons,#这里相当于输入一个getset
aucellRankings, #输入ranking的同时也等于输入了表达矩阵
aucMaxRank=aucellRankings@nGenesDetected["5%"], #取rank处于前5%的基因用于计算,可以大大加快计算速度
nCores=nCores)
## Warning in .AUCell_calcAUC(geneSets = geneSets, rankings = rankings, nCores =
## nCores, : Using only the first 77 genes (aucMaxRank) to calculate the AUC.
## Using 8 cores with doMC.


regulonOrder <- orderAUC(regulonAUC) #这是一个在AUCell 1.5.1新加的功能,利用各modules的相似性对regulon排序
regulonAUC <- regulonAUC[regulonOrder,]#将AUCell结果进行排序
saveRDS(regulonAUC, file=getIntName(scenicOptions, "aucell_regulonAUC"))#将AUCell的regulon结果存放在 "int/3.4_regulonAUC.Rds"

(3)通过AUCell阈值判定regulon是否激活
regulon的活性通常呈双峰分布偏态分布,通过绘制AUCell score的柱状图可以初步判断它们的分布方式。


cells_AUCellThresholds <- NULL
skipBinaryThresholds <- F
if(!skipBinaryThresholds)
{
cells_AUCellThresholds <- AUCell_exploreThresholds(regulonAUC,
smallestPopPercent=getSettings(scenicOptions,"aucell/smallestPopPercent"),
assignCells=TRUE, plotHist=FALSE,
verbose=FALSE, nCores=nCores)
#自动绘制直方图,并自动计算数个阈值,可以用来考虑一个基因集是on或off“(在cells_AUCellThresholds$aucThr中返回)。对应的阈值用匹配颜色的竖条表示,较粗的竖线表示软件默认选择的阈值(cells_AUCellThresholds$aucThr$selected),这一阈值能够最大限度的减少假阳性。
saveRDS(cells_AUCellThresholds, file=getIntName(scenicOptions, "aucell_thresholds"))#将AUCell score判定阈值存放在"int/3.5_AUCellThresholds.Rds"

#以Sox9为例的最佳阈值
cells_AUCellThresholds$`Sox9_extended (193g)`[['aucThr']]$selected
}
## NULL

整理阈值信息


  regulonsCells <- getAssignments(cells_AUCellThresholds)#获取每种细胞的regulon通过阈值检验的信息
trhAssignment <- getThresholdSelected(cells_AUCellThresholds)#一键提取最佳阈值,不用写循环
trhAssignment <- signif(trhAssignment, 3)#取三位有效数字

commentsThresholds <- sapply(cells_AUCellThresholds, function(x) unname(x$aucThr$comment))
commentsThresholds#如果符合双峰分布或者偏态分布,comment为空
##                                              Dlx1_extended (126g) 
## "The AUC might follow a normal distribution (random gene-set?). "
## Dlx1 (100g)
## ""
## Tef_extended (448g)
## ""
## Tef (406g)
## ""
## Dlx5_extended (222g)
## "The AUC might follow a normal distribution (random gene-set?). "
## Dlx5 (51g)
## "The AUC might follow a normal distribution (random gene-set?). "
## Sox9_extended (196g)
## "The AUC might follow a normal distribution (random gene-set?). "
## Sox9 (155g)
## "The AUC might follow a normal distribution (random gene-set?). "
## Sox10_extended (131g)
## ""
## Sox10 (107g)
## ""
## Sox8_extended (153g)
## ""
## Sox8 (112g)
## ""
## Irf1_extended (154g)
## ""
## Irf1 (107g)
## ""
## Stat6_extended (83g)
## ""
## Stat6 (41g)
## ""


  #将上述信息整合  
table2edit <- cbind(regulon=names(cells_AUCellThresholds),
threshold=trhAssignment[names(cells_AUCellThresholds)],
nCellsAssigned=lengths(regulonsCells)[names(cells_AUCellThresholds)],
AUCellComment=commentsThresholds[names(cells_AUCellThresholds)],
nGenes=gsub("[\\(g\\)]", "", regmatches(names(cells_AUCellThresholds), gregexpr("\\(.*?\\)", names(cells_AUCellThresholds)))),
clusteringOrder=1:length(cells_AUCellThresholds),
# clusterGroup=regulonClusters[names(cells_AUCellThresholds)],#这一行的regulonClusters在全文中没有出现过
onlyNonDuplicatedExtended=(names(cells_AUCellThresholds) %in% onlyNonDuplicatedExtended(names(cells_AUCellThresholds))),
personalNotes="")
head(table2edit)
##                      regulon                threshold nCellsAssigned
## Dlx1_extended (126g) "Dlx1_extended (126g)" "0.273" "45"
## Dlx1 (100g) "Dlx1 (100g)" "0.179" "47"
## Tef_extended (448g) "Tef_extended (448g)" "0.666" "105"
## Tef (406g) "Tef (406g)" "0.619" "102"
## Dlx5_extended (222g) "Dlx5_extended (222g)" "0.796" "0"
## Dlx5 (51g) "Dlx5 (51g)" "0.289" "0"
## AUCellComment
## Dlx1_extended (126g) "The AUC might follow a normal distribution (random gene-set?). "
## Dlx1 (100g) ""
## Tef_extended (448g) ""
## Tef (406g) ""
## Dlx5_extended (222g) "The AUC might follow a normal distribution (random gene-set?). "
## Dlx5 (51g) "The AUC might follow a normal distribution (random gene-set?). "
## nGenes clusteringOrder onlyNonDuplicatedExtended
## Dlx1_extended (126g) "126" "1" "FALSE"
## Dlx1 (100g) "100" "2" "TRUE"
## Tef_extended (448g) "448" "3" "FALSE"
## Tef (406g) "406" "4" "TRUE"
## Dlx5_extended (222g) "222" "5" "FALSE"
## Dlx5 (51g) "51" "6" "TRUE"
## personalNotes
## Dlx1_extended (126g) ""
## Dlx1 (100g) ""
## Tef_extended (448g) ""
## Tef (406g) ""
## Dlx5_extended (222g) ""
## Dlx5 (51g) ""


  write.table(table2edit, file=getIntName(scenicOptions, "aucell_thresholdsTxt"), row.names=F, quote=F, sep="\t")

绘制热图


if(!skipHeatmap){
nCellsHeatmap <- min(500, ncol(regulonAUC))#若细胞数超过500则只画五百个细胞,否则画出全部细胞
cells2plot <- sample(colnames(regulonAUC), nCellsHeatmap)#随机抽出对应个数的细胞
cellInfo <- loadFile(scenicOptions, getDatasetInfo(scenicOptions, "cellInfo"), ifNotExists="null") #TODO check if exists, if not... create/ignore?
if(!is.null(cellInfo)) cellInfo <- data.frame(cellInfo)[cells2plot,,drop=F]#注释信息
colVars <- loadFile(scenicOptions, getDatasetInfo(scenicOptions, "colVars"), ifNotExists="null")

fileName <- getOutName(scenicOptions, "s3_AUCheatmap")#热图输出的图片在"output/Step3_RegulonActivity_heatmap"中


NMF::aheatmap(getAUC(regulonAUC)[,cells2plot],
annCol=cellInfo,
annColor=colVars,
main="AUC",
sub=paste("Subset of",nCellsHeatmap," random cells"),
filename=paste0(fileName,'.pdf'))#这个热图我们后面还会调整
}

在tSNE图上绘制出regulon活性,相当于Seurat::FeaturePlot()


if(!skipTsne){
tSNE_fileName <- tsneAUC(scenicOptions, aucType="AUC", onlyHighConf=FALSE) #"int/tSNE_AUC_50pcs_30perpl.Rds",即tSNE的默认参数为50pcs,perplexity为30
tSNE <- readRDS(tSNE_fileName)
fileName <- getOutName(scenicOptions, "s3_AUCtSNE_colAct")#tsne的regulon活性以html的格式存在"output/Step3_RegulonActivity_tSNE_colByActivity"
# plotTsne_AUCellHtml(scenicOptions, exprMat, fileName, tSNE)#这里可以将上述output/Step3_RegulonActivity_tSNE_colByActivity中的图片输入到html文件之中,这里由于拆解运行报了一些错误无法实现

sub <- ""; if("type" %in% names(tSNE)) sub <- paste0("t-SNE on ", tSNE$type)
sub#汇报一下分析情况
cellInfo <- loadFile(scenicOptions, getDatasetInfo(scenicOptions, "cellInfo"), ifNotExists="null")
colVars <- loadFile(scenicOptions, getDatasetInfo(scenicOptions, "colVars"), ifNotExists="null")
pdf(paste0(getOutName(scenicOptions, "s3_AUCtSNE_colProps"),".pdf"))
plotTsne_cellProps(tSNE$Y, cellInfo=cellInfo, colVars=colVars, cex=1, sub=sub)
dev.off()#将tSNE结果(无任何着色方式)输出到"output/Step3_RegulonActivity_tSNE_colByCellProps.pdf"
}
## png 
## 2


#更新分析进度
scenicOptions@status$current <- 3
saveRDS(scenicOptions, file="int/scenicOptions.Rds")

往期回顾

SCENIC单细胞转录因子预测|1.绪论

SCENIC单细胞转录因子预测|2.学习手册

SCENIC单细胞转录因子预测|3.软件安装与数据准备

SCENIC单细胞转录因子预测|4.精简版流程

SCENIC单细胞转录因子预测|5.step1+step2构建共表达网络与regulon


参考

[1]Aibar S, González-Blas CB, Moerman T, Huynh-Thu VA, Imrichova H, Hulselmans G, Rambow F, Marine JC, Geurts P, Aerts J, van den Oord J, Atak ZK, Wouters J, Aerts S. SCENIC: single-cell regulatory network inference and clustering. Nat Methods. 2017 Nov;14(11):1083-1086. doi: 10.1038/nmeth.4463. Epub 2017 Oct 9.

[2]https://github.com/aertslab/SCENIC



单细胞系列教程目录

单细胞数据分析系列教程:
B站视频,先看一遍视频再去看推送操作,建议至少看三遍:
https://www.bilibili.com/video/BV1S44y1b76Z/
本公众号单细胞相关资料都可以在这里订阅:
scRNA-Seq学习手册2023_R语言版

单细胞测序基础数据分析保姆级教程,代码部分整理在往期推送之中:
手把手教你做单细胞测序数据分析|1.绪论
手把手教你做单细胞测序数据分析|2.各类数据结构与读取方法
手把手教你做单细胞测序数据分析|3.单样本分析
手把手教你做单细胞测序数据分析|4.多样本整合
手把手教你做单细胞测序数据分析|5.细胞类型注释,从入门到入土
手把手教你做单细胞测序数据分析|6组间差异分析
手把手教你做单细胞测序数据分析|7基因集富集分析
Seurat中分类变量处理技巧
沉浸式统计细胞比例

单细胞图片改造计划:
改造单细胞降维图| 1.DimPlot的探索
改造单细胞降维图| 2.ggplot2中的DIY
改造单细胞降维图| 3.3D降维图与动图绘制

SCENIC转录因子分析
SCENIC单细胞转录因子预测|1.绪论
SCENIC单细胞转录因子预测|2.学习手册
SCENIC单细胞转录因子预测|3.软件安装与数据准备
SCENIC单细胞转录因子预测|4.精简版流程
SCENIC单细胞转录因子预测|5.step1+step2构建共表达网络与regulon

上游fastq文件处理
单细胞分析的最上游——处理Fastq文件:cellranger
单细胞分析的最上游——处理Fastq文件:dropseqRunner

细胞通讯
B站连续播放起来比较方便:
https://www.bilibili.com/video/BV1Ab4y1W7qx?p=1
往期推送
《细胞通讯》1.概论
《细胞通讯》2.1CellChat基础分析教程
《细胞通讯》2.2CellChat多组别分析
《细胞通讯》CellChat学习手册

拟时序分析
B站连续播放起来比较方便:
https://www.bilibili.com/video/BV1br4y1x7Hf?p=1
往期推送
《拟时序分析》1.概论
《拟时序分析》2.monocle概论
《拟时序分析》3.monocle2实操:精简版拟时序
《拟时序分析》4.monocle2实操:完整版
单细胞测序数据进阶分析—《拟时序分析》5.初识monocle3
单细胞测序数据进阶分析—《拟时序分析》6.monocle3的降维、分群、聚类
单细胞测序数据进阶分析—《拟时序分析》7.monocle3的拟时序分析
解决monocle2的orderCells报错的两种方法
一文搞定拟时序分析的下游可视化探索

其他单细胞相关技术贴也在这里:
细胞的数量由誰决定?
单细胞中应该如何做GSVA?
答读者问(三):单细胞测序前景
答读者问(四):如何分析细胞亚群
答读者问(八):为什么Read10X也会报错?
答读者问(十)整合后的表达矩阵,如何拆分出分组信息?
答读者问(十一)如何一次性读取一个目录下的cellranger输出文件?
给你安排一个懂生信的工具人(十):不学编程 零代码完成单细胞测序数据分析:Loupe Browser
什么?不做单细胞也能分析细胞类群和免疫浸润?
答读者问 (十三)查看Seurat对象时的ERROR:type='text'
各类单细胞对象(数据格式)转换大全(一)
批量整理好GEO中下载的单细胞数据
答读者问 (十五)稀疏矩阵转matrix, as.matrix函数是下下策
答读者问 (十六)做单细胞测序到底需要多少内存
答读者问 (十七)调用的线程越多就算的越快嘛?
答读者问(十八)、一个我至少被问过30遍的monocle报错
没有barcode文件的单细胞数据要怎么读取
单细胞基因集评分之AUCell
粉丝来稿|1. Seurat4相较于Seurat3的几点改动
如何加快Seurat的计算速度
一文搞定单细胞基因集评分
答读者问(二十)四个单细胞样本只给了一套文件怎么读
人类单细胞测序数据中有哪些以"**-"开头的基因
为什么总把分辨率调的很高
Seurat中如何让细胞听你指挥
答读者问| 22.object 'CsparseMatrix_validate' not found
单细胞数据在R中的读取及存储速度太慢怎么办?这个神包来帮你!
单细胞分群分辨率选择困难症

单细胞文献阅读:
测序技术的发展与应用
Biomamba助推的第二篇文章!发表了!
又来了!Biomamba生信基地助推的第四篇文章!
单细胞测序解析糖尿病肾病中肾小球的动态变化
Cell metabolism| 单细胞测序技术解析健康人与T2D患者的胰岛差异
Science| 小鼠全肾单细胞测序开篇之作
一篇不花钱就能白嫖的文章
不会吧不会吧,Nature都能白嫖?
高氧下小鼠肺发育损伤的ScRNA图谱
IgAN & STRT-Seq
老树开新花—EGFR、肿瘤、免疫+scRNA-Seq
癌前基质细胞驱动BRCA1肿瘤发生
紧跟生信"钱"沿,胰腺癌&免疫多模态图谱
原发头颈癌和肿瘤转移微生态
《Cell Metabolism》:肾脏疾病&代谢&核受体ESRRA
《Nature communication》:PD-1&急性髓细胞性白血病&T Cell
单细胞测序揭示鼻咽癌微环境的基质动力学和肿瘤特异性特征
《Nature》:MYB调控衰竭性T细胞对检查点抑制的响应
单细胞都能活检测序了?
文献阅读(二十九)、单细胞测序做到什么程度能毕业|硕士篇
文献阅读(三十)、单细胞测序做到什么程度能毕业|博士篇
2022年了,都有哪些器官/组织有scRNA-Seq数据|小鼠篇
2022年了,都有哪些器官/组织有scRNA-Seq数据|人类篇
2023年了, 都哪些物种有scRNA-Seq数据
终于读到一篇用monocle3做拟时序的文章
单细胞转录组+亚细胞空间代谢组=25分文章
酸了,六个样本的scRNA-Seq+差异分析=9分文章
自测scRNA-Seq+scWGBS=3分三区文章?
百万级单细胞多组学数据集成
空间转录组与单细胞转录组整合分析工具大比拼



单细胞注释复写
单细胞注释复写(一):Human Fetal Kidney
单细胞注释复写(二): human colorectal
单细胞复写|3.急性心肌梗塞(AMI)外周血scRNA-Seq分析实战(链接重置)

硬件准备:
生信分析为什么要使用服务器?
有root权限的共享服务器,注册即送200¥
独享服务器,满足你对生信分析的所有幻想
为实验室准备一份生物信息学不动产


如何联系我们


公众号后台消息更新不及时,超过48h便不允许回复读者消息,这里给大家留一下领取资料、免费服务器(有root权限的共享服务器,注册即送200¥)的微信号[Biomamba],方便各位随时交流、提建议(科研任务繁重,回复不及时请见谅,备注来意会优先通过)。此外呼声一直很高的交流群也建好了,欢迎大家入群讨论:
永久免费的千人生信、科研交流群

大家可以阅读完这几篇之后添加
给生信入门初学者的小贴士
如何搜索公众号过往发布内容

您点的每个赞和在看,我都认真当成了喜欢