SCI熱門的單細胞測序不會做?跟著Cell學單細胞!抄就對了

解螺旋 發佈 2022-08-23T14:43:56.144397+00:00

Bunis, D. G., Bronevetsky, Y., Krow-Lucal, E., Bhakta, N. R., Kim, C. C., Nerella, S., Jones, N., Mendoza, V. F., Bryson, Y. J., Gern, J. E., Rutishauser, R. L., Ye, C. J., Sirota, M., McCune, J. M., & Burt, T. D. . Single-Cell Mapping of Progressive Fetal-to-Adult Transition in Human Naive T Cells. Cell Reports, 34. 見原文連結。

Hi,大家好,我是晨曦

不知道大家有沒有這樣的煩惱,就是感覺有很多東西沒有學到,但是每當學的時候又會感覺無處可學,那麼這個時候可能提醒你需要進一步「鞭策」自己了

本期開啟一個全新的欄目——文章復現內容,其實也不是傳統意義上的全文復現了,晨曦找了一些有意思且質量較高的文獻,這些文獻往往提供了配套的代碼,所以允許我們可以下載下來進行學習,畢竟觀看大佬寫的代碼是一種快速進步的方式

那麼,我們就來看一下今天這期我們想要學習的Cell文章,如下:

文章的具體內容我們就不過多探討了,當然不愧是Cell,作者很貼心的在後面的method部分放上了自己的代碼以及數據連結,重點是作者整理的代碼邏輯非常的清晰!!(強烈好評)

那麼接下來先做一個簡單的預告,我們通過這篇推文可以學到什麼QAQ

第一:你可以學會下面的這組可視化結果

第二:你可以學到在Rstudio中使用python的一些簡單技巧

第三:你可以學到一些有意思的單細胞處理技巧

第四:你可以學到基於隨機森林計算評分的技巧

除此之外,我還為大家整理了許多單細胞測序的高分套路模板和文章復現資源,想要的小夥伴可以點擊了解詳情免費領取哦~

滴滴,如果你感興趣上面四點,那麼我們就開始吧

#準備工作
library(MAST)
# BiocManager::install("dtm2451/dittoSeq@a3bfe2b")
library(dittoSeq)
library(caret)
library(ranger)
# devtools::install_github("vqv/ggbiplot")
# devtools::install_github("enriquea/feser")
library(feseR)
library(pROC)
# install.packages("reticulate")
library(reticulate)
# use_python("/anaconda3/envs/r-reticulate/bin/python")
# # Run this in Terminal
use_condaenv("seurat", required = TRUE)
# # conda create -y -c conda-forge -n r-reticulate umap-learn=0.3.10
# devtools::install_version(package = "adehabitat", version = "1.8.20")
# devtools::install_version(package = "SDMTools", version = "1.1-221.1")
# devtools::install_version(package = "Seurat", version = "3.0.2")
library(Seurat)

作者很貼心的把需要下載的R包命令進行了注釋,同時因為我們後期可能會在Rstudio環境中使用Python,所以作者也把配置Python環境的相關操作進行了注釋

所以這裡,我們學到了一點:Rstudio中通過使用reticulate包可以調用Python環境,當然Rstudio進行更新後其實也是可以創建python腳本了(Ps:但是還是習慣Python使用Jupyternotebook)

#讀取輸入數據(標準的10×下機數據)
Tcells <- CreateSeuratObject(Read10X("文獻復現/GSE158492數據集/10×/"))#物種人

樣本信息簡單的介紹一下:

物種:人

細胞來源:來自10個獨立樣本的CD4、CD8、CD34+造血幹細胞和祖細胞

技術:10×genomic

Tcells[["percent.mito"]] <- PercentageFeatureSet(Tcells, pattern = "^MT-")#計算線粒體基因
Tcells[["percent.ribo"]] <- PercentageFeatureSet(Tcells, pattern = "^RPS|^RPL")#計算紅細胞

這裡作者選擇的質控標準如下:

with at least 750 genes

with at least 1500 UMIs

with less than 5% mitochondrial UMIs

可以很清楚的看到,在線粒體基因的角度,質控標準是比較嚴格的

Tcells.cut <- subset(Tcells, subset = nFeature_RNA > 750)
Tcells.cut <- subset(Tcells.cut, subset = nCount_RNA > 1500)
Tcells.cut <- subset(Tcells.cut, subset = percent.mito < 5)

下面作者進行了雙細胞的去除,但是這裡晨曦說一下個人的觀點,因為我們平時也會接觸到scRNA-seq的分析,但是我們很少會進行雙細胞的去除,或者說這一步驟如果不進行其實對我們的結果應該也沒有太大的改變

因為我們的質控標準是選不完的,我們晨曦認為:我們在進行自己的單細胞測序的時候,只需要對線粒體和紅細胞以及細胞周期進行質控即可,個人理解,僅供參考

#去除雙細胞
Tcells.cut <- importDemux(
  Tcells.cut,
  demuxlet.best = c("文獻復現/GSE158492數據集/GSE158492_CD4.best.txt",
                    "文獻復現/GSE158492數據集/GSE158492_CD4-8.best.txt",
                    "文獻復現/GSE158492數據集/GSE158492_CD8.best.txt"),
  lane.names = c("CD4","CD4-8","CD8"))
Tcells.cut[["Sample"]] <- sapply(
  meta("Sample",Tcells.cut),
  function(X) strsplit(X, split = "CD4_")[[1]][2])
Tcells <- subset(Tcells.cut, subset = demux.doublet.call == "SNG")

這裡可能會有小夥伴疑問:importDemux函數有什麼作用?

這個函數其實就是把多個管道的樣本信息導入到我們的S4對象中,然後可以通過解卷積的方法幫助我們識別雙細胞狀態的油包水樣結構

參考教程:Instructional tutorial for using demuxlet (protocols.io)

#然後下面作者又進行了一些針對metadata的操作
#這一部分的操作在我們後續的分析中,我們不是必須要添加
Tcells@meta.data$age <- "unknown"
Tcells@meta.data$age[grep("FS",Tcells$Sample)] <- "fetal"
Tcells@meta.data$age[grep("UCB",Tcells$Sample)] <- "cord"
Tcells@meta.data$age[grep("APB",Tcells$Sample)] <- "adult"
# Add Tcelltype
# This is dependent on both sample-assignment and 10X-lane, so I will need to add how samples were added to each lane
samples.4 <- c("FS3", "FS4", "FS5", "UCB1", "UCB2", "UCB5", "APB1", "APB2", "APB4", "APB5")
samples.8 <- c("FS1", "FS5", "UCB2", "UCB3", "UCB4", "UCB5", "APB2", "APB3", "APB5")
samples.48.4 <- c("FS1", "FS2", "UCB4", "UCB3", "APB3") 
samples.48.8 <- c("FS3", "UCB1", "APB1", "APB4")
samples.48 <- c(samples.48.4,samples.48.8)
Tcells@meta.data$Tcelltype <- NA
Tcells@meta.data$Tcelltype[(Tcells$Sample%in%samples.4) & (Tcells$Lane=="CD4")] <- "CD4"
Tcells@meta.data$Tcelltype[(Tcells$Sample%in%samples.48.4) & (Tcells$Lane=="CD4-8")] <- "CD4"
Tcells@meta.data$Tcelltype[(Tcells$Sample%in%samples.8) & (Tcells$Lane=="CD8")] <- "CD8"
Tcells@meta.data$Tcelltype[(Tcells$Sample%in%samples.48.8) & (Tcells$Lane=="CD4-8")] <- "CD8"
Tcells@meta.data$Tage <- NA
Tcells@meta.data$Tage[Tcells$Tcelltype=="CD4"&!is.na(Tcells$Tcelltype)] <- paste0("4-",Tcells$age[Tcells$Tcelltype=="CD4"&!is.na(Tcells$Tcelltype)])
Tcells@meta.data$Tage[Tcells$Tcelltype=="CD8"&!is.na(Tcells$Tcelltype)] <- paste0("8-",Tcells$age[Tcells$Tcelltype=="CD8"&!is.na(Tcells$Tcelltype)])
sum(is.na(Tcells$Tage))
Tcells@meta.data$Tage[is.na(Tcells$Tage)] <- "0"
sum(Tcells$Tage=="0")
Tcells <- subset(Tcells, subset = Tage != "0")

進行完上述的步驟,我們可以保證每一個細胞ID都有一個標籤,也就是說上面的內容其實就是進行了數據質控的部分

#細胞周期
s.genes <- cc.genes$s.genes
g2m.genes <- cc.genes$g2m.genes
Tcells <- CellCycleScoring(Tcells, s.features = s.genes, g2m.features = g2m.genes, 
    set.ident = TRUE)
#細胞周期信息儲存在CellCycle
Tcells@meta.data$CellCycle <- Idents(Tcells)
Idents(Tcells) <- "Lane" #idents函數可以直接支持賦值metadata內的變量信息,然後就可以調用該變量內的信息內容
#idents函數展示的結果其實就是Barcode ID和某lab的對應關係,如果進行完細胞注釋,默認就是與細胞注釋的對應關係

然後下面我們就可以進行數據標準化、尋找高可變、數據歸一化、PCA等標準常規操作,我們這裡就加快的步伐~

Tcells <- NormalizeData(
  object = Tcells,
  normalization.method = "LogNormalize",
  scale.factor = 10000,
  verbose = F)
Tcells <- FindVariableFeatures(object = Tcells, verbose = F, nfeatures = 2000)
Tcells <- ScaleData(
  object = Tcells,
  vars.to.regress = c("CellCycle", "percent.mito", "nCount_RNA"),
  verbose = F)
Tcells <- RunPCA(
  object = Tcells,
  verbose = T,
  npcs = 50)
Tcells <- RunTSNE(
  object = Tcells,
  reduction.use = "pca",
  dims = 1:9,
  seed.use = 1)
Tcells <- FindNeighbors(Tcells,
                        reduction = "pca",
                        k.param = 20,
                        dims = 1:9)
Tcells <- FindClusters(Tcells,
                       modularity.fxn = 1,
                       algorithm = 1,
                       resolution = 0.1)
Tcells <- RunUMAP(
  object = Tcells,
  reduction = "pca",
  dims = 1:9,
  seed.use = 1)

然後我們進行可視化的部分

dittoDimPlot(Tcells, "Tage", size = 1, reduction.use = "umap",
          colors = c(1:3,9:11), main = "T cells Lineage and Stage",
          rename.var.groups = c("Adult-CD4", "Fetal-CD4", "UCB-CD4",
                            "Adult-CD8", "Fetal-CD8", "UCB-CD8"))

可以很清楚的看到我們其實是把不同的label繪製在了一張可視化上,然後我們想要像Cell上在周邊展示不同label分別的可視化,在R中我們可以這麼運行代碼

#創建一個list列表,把所有的可視化裝進去
plots <- list(
    dittoDimPlot(Tcells,
        "Tage", size = 0.5, reduction.use = "umap", cells.use = Tcells$Tage=="4-adult",
        colors = 1, legend.show = FALSE, ylab = NULL, xlab = NULL, main = NULL,
        show.axes.numbers = FALSE),
    dittoDimPlot(Tcells,
        "Tage", size = 0.5, reduction.use = "umap", cells.use = Tcells$Tage=="4-cord",
        colors = 2, legend.show = FALSE, ylab = NULL, xlab = NULL, main = NULL,
        show.axes.numbers = FALSE),
    dittoDimPlot(Tcells,
        "Tage", size = 0.5, reduction.use = "umap", cells.use = Tcells$Tage=="4-fetal",
        colors = 3, legend.show = FALSE, ylab = NULL, xlab = NULL, main = NULL,
        show.axes.numbers = FALSE),
    dittoDimPlot(Tcells,
        "Tage", size = 0.5, reduction.use = "umap", cells.use = Tcells$Tage=="8-adult",
        colors = 9, legend.show = FALSE, ylab = NULL, xlab = NULL, main = NULL,
        show.axes.numbers = FALSE),
    dittoDimPlot(Tcells,
        "Tage", size = 0.5, reduction.use = "umap", cells.use = Tcells$Tage=="8-cord",
        colors = 10, legend.show = FALSE, ylab = NULL, xlab = NULL, main = NULL,
        show.axes.numbers = FALSE),
    dittoDimPlot(Tcells,
        "Tage", size = 0.5, reduction.use = "umap", cells.use = Tcells$Tage=="8-fetal",
        colors = 11, legend.show = FALSE, ylab = NULL, xlab = NULL, main = NULL,
        show.axes.numbers = FALSE),
    dittoDimPlot(Tcells,
        "Tage", size = 1, reduction.use = "umap", legend.show = FALSE,
        color.panel = dittoColors()[c(1:3,9:11)], main = NULL),
    dittoSeq:::.grab_legend(dittoDimPlot(Tcells,
        "Tage", size = 1, reduction.use = "umap",
        color.panel = dittoColors()[c(1:3,9:11)],
        rename.var.groups = c("Adult-CD4", "UCB-CD4", "Fetal-CD4", 
                              "Adult-CD8", "UCB-CD8", "Fetal-CD8")))
)
pdf("Tcells-Figs/Tcell_umap_surround.pdf", w=6, h=6)
gridExtra::grid.arrange(grobs = plots,
    layout_matrix = matrix(c(
        7,7,7,4,
        7,7,7,5,
        7,7,7,6,
        1,2,3,8), ncol = 4))
dev.off()

dittoDimPlot函數繪製細胞聚類圖中裡面有一個參數是cells.use可以選擇細胞ID進行可視化

grid.arrange函數可以幫助我們進行排版,這裡重點解釋一下矩陣對於圖形擺放的問題

我們都知道如果layout_matrix這麼寫:matrix(c(1,1,2,3),2,2,代表了繪製一個兩行兩列,一共三張圖,第一張圖占據一行,後面兩張圖加起來占據一行

那麼如果是這種矩陣的形式其實也是很好理解的,就是一個占位的問題

layout_matrix = matrix(c(
       7,7,7,4,
       7,7,7,5,
       7,7,7,6,
       1,2,3,8), ncol = 4))
#我們list裡面一共有8個plot,那麼我們將用很大一部分去繪製第七張圖,然後右邊從上到下分別繪製第4、5、6、8張圖,然後下面從左到右繪製1、2、3圖,所以就是下面這個樣子

至此,我們成功完成了Figure3-A的復現,那麼我們接下來繼續

#繪製樣本細胞百分率
dittoBarPlot(Tcells, "ident", group.by = "Sample",
          x.reorder = c(6:8,9:13,1:5),
          main = NULL,
          cells.use = Tcells$Tcelltype=="CD8",
          ylab = "Fraction of CD8\nin each cluster",
          legend.show = FALSE, legend.title = "Clusters",
          x.labels = c(paste0("F",1:5),paste0("U",1:5),paste0("A",1:5))[c(1,3,5:15)],
          x.labels.rotate = T,
          xlab = NULL)

那麼到這裡主要的兩張可視化技巧我們就學到這裡,我們看文獻的時候,還比較感興趣的就是通過機器學習算法構建評分,也就是方法學中下面這部分的內容

那麼通過閱讀方法學部分,我們可以了解到大概分以下幾個步驟:

with at least 750 genes

with at least 1500 UMIs

with less than 5% mitochondrial UMIs

1. Pick out a 10% of fetal and adult cells training set(選出10%細胞數量作為訓練集

2. Calculate the FvA markers for that set(計算差異基因

3. Run correlation and random-forest feseR to narrow down the genelist.(使用機器學習算法縮小預測變量範圍

4. Generate RFmodels based on feseR-restricted genesets(產生隨機森林模型

5. Check accuracy in fetal vs adult cells that were not in the training set(檢驗模型的性能,並不是在訓練集上,而是測試集

Score UCB (refered to as "cord" within the object)(因為這個模型構建的時候我們選擇的是兩種狀態的細胞,然後我們進行測試評分的時候其實會有第三種細胞,這個時候我們可視化可以得到一種連續的狀態,說明了第三種細胞很有可能就是第一種細胞和第二種細胞的中間過渡態)

set.seed(1909)
Idents(Tcells) <- "age"
#fetal-cluster   UCB-cluster adult-cluster 
#        14542         10921         14689 
inTraining <- createDataPartition(Idents(Tcells), p=0.1, list = FALSE)#選擇10%的細胞作為訓練集
inTraining <- inTraining[Idents(Tcells)[inTraining]%in%c("fetal","adult")]#構建訓練集的時候我們只需要兩種狀態的細胞
age.inTrain <- Tcells$age#提取細胞ID和label的對應信息
age.inTrain[-inTraining] <- 0 #所有沒有被我們選中的把label清空
Idents(Tcells) <- age.inTrain#訓練集作用載數據集上
#這個時候我們的數據集應該是包含了一部分有label和很大一部分沒有label
#尋找差異基因並進行篩選
FvA <- FindMarkers(Tcells,
                       ident.1 = "fetal",
                       ident.2 = "adult",
                       test.use = "MAST")
FvA_padjFC <- FvA[abs(FvA$avg_log2FC)>=0.585 &
                            FvA$p_val_adj<0.05 &
                            !(is.na(FvA$p_val_adj)),]
markers <- rownames(FvA_padjFC)
#獲取我們真正的訓練集合
training <- as.matrix(t(GetAssayData(Tcells)[markers,inTraining]))

這裡我們需要注意GetAssayData函數的書寫方式,以前我們都是直接添加對象就可以提取S4對象內的表達矩陣或者說是我們最常提取的counts矩陣,但是我們也可以提供一個觀測為基因,變量為細胞ID或者數值,然後我們能做到就是提取觀測和變量範圍內的表達矩陣

training[1:10,1:5]
#                     JUNB    RPS24  ZFP36L2   TMSB4X    DUSP1
#AAACCTGAGATAGGAG-1 2.191085 4.319520 1.840011 4.354152 1.294263
#AAACCTGCAAGCGTAG-1 1.707412 4.262362 0.000000 4.754660 2.050529
#AAAGATGAGAGGGCTT-1 4.418952 3.535619 3.458002 4.664140 2.420471
#AAAGATGCAAGCTGTT-1 4.481459 3.564488 3.256595 4.149503 2.601244
#AAAGATGCATGTCCTC-1 4.064382 3.222724 2.776347 3.614818 1.949347
#AAAGATGCATTCACTT-1 4.153450 3.432844 2.999145 4.195355 2.682409
#AAAGATGTCATCGGAT-1 4.610814 3.064502 3.531894 4.660339 3.064502
#AAAGCAAAGAAACGAG-1 3.924906 4.003429 2.227292 3.251311 2.227292
#AAAGCAACAGATCCAT-1 2.850958 4.107304 1.313022 5.066440 1.313022
#AAAGCAACATGTCCTC-1 1.286435 3.759285 0.000000 5.258795 1.286435
#創建結局變量
Train_val <- array(1, length(inTraining))
Train_val[Tcells$age[inTraining]=="fetal"] <- 0
#去除具有相關性的預測變量
training.trim <- filter.corr(scale(training), Train_val, mincorr = 0.3)
#通過遞歸隨機森林篩選預測變量
feser <- rfeRF(
  features = training.trim,
  class = Train_val,
  number.cv = 3,
  group.sizes = seq_len(ncol(training.trim)),
  metric = "ROC",
  verbose = FALSE)
#文獻中使用的10折,但是運行速度會很慢,即使是3折也需要大概20min左右的時間
markers.feser <- feser$optVariables
length(markers.feser)
#[1] 84

我們的訓練集一共有104個預測變量,通過算法我們得到了84個預測變量,但是實際上我們並不可能把這84個全部納入到模型之中,所以我們需要結合生物學背景或者其它算法來幫助我們進一步篩選

feser$results#查看結果

這個時候我們可以通過結果理解了算法本身的過程,這個算法就是一開始是全部預測變量然後不斷消除預測變量的數量,然後計算出來ROC以及sensitivity和specificity等信息,這個時候按照作者的理解,作者發現在第17個預測變量納入的時候可以保證ROC、sensitivity和specificity均超過0.99,所以作者選擇了17個預測變量作為後續的分析內容

自動特徵選擇用於構建不同子集的許多模型,並篩選出有用特徵

從算法上來看,應該是三折每一次都選擇不同的特徵子集只不過是數量是一致的,但是如果選擇特徵子集是具有算法的,所以說基本上選擇並不會出現太大的偏差

vars17 <- unique(feser$variables$var[feser$variables$Variables==17])#提取選擇的17個預測變量
#[1] "RPS24"    "JUNB"     "TMSB4X"   "ZFP36L2"  "TXNIP"    "HSP90AA1"
#[7] "MT-CO1"   "MYL6"     "DUSP1"    "GAPDH"    "PFN1"     "SOX4"    
#[13] "CD52"     "TSC22D3"  "YBX1"     "KLF6"     "ACTB"     "CRIP1"   
#[19] "RGS1"

這裡之所以是19個預測變量就是晨曦前面說過,整體組合基本是固定的,因為固定數量下最可以代表數據集的形式是特定的,但是仍然會存在一些細微的偏差,這個隨著預測變量數量越多越明顯,就好像一個群體,你要選擇最優秀的人,那麼這個人其實很好選,但是如果你要選擇最優秀的十個人,那麼很顯然就會有比一個人更多的可能

(vars17.counts <- sapply(vars17, function(X) length(grep(X, feser$variables$var[feser$variables$Variables==17]))))#獲取每個預測變量被納入的次數
#因為我們是三折,所以如果在三個訓練集中均被納入那麼很顯然這個預測變量會更好

可以很清楚的看到,SOX4被納入兩次,那麼很有可能第三次的時候納入的就是CD52,CRIP1被納入2次,那麼第三次很有可能就是RGS1,那麼這四個預測變量可以劃歸為兩個,然後數量正好就是17,所以這個算法的運算邏輯就是這樣

#根據疊代次數選擇最合適的預測變量
(vars.use <- names(head(vars17.counts[order(vars17.counts, decreasing = TRUE)], 17)))
#[1] "RPS24"    "JUNB"     "TMSB4X"   "ZFP36L2"  "TXNIP"    "HSP90AA1"
#[7] "MT-CO1"   "MYL6"     "DUSP1"    "GAPDH"    "PFN1"     "TSC22D3" 
#[13] "YBX1"     "KLF6"     "ACTB"     "SOX4"     "CRIP1"

那麼,到這裡預測變量就選擇完畢了,然後我們繼續

markers.feser <- vars.use
training <- as.matrix(t(GetAssayData(Tcells)[markers.feser,inTraining]))#訓練集進行重整
#創建終點結局變量
Train_val <- array(1, length(inTraining))
Train_val[Tcells$age[inTraining]=="fetal"] <- 0
#擬合模型
rf_mod <- train(Train_val ~ .,
              set.seed(998),
              data= cbind(training,Train_val),
              method = "ranger",
              metric = "MAE",
              trControl = trainControl(method = "cv",
                                       number = 3,
                                       repeats = 3),
              tuneGrid = expand.grid(mtry = round(length(markers.feser)*.75,0),
                                     splitrule = c("extratrees"),
                                     min.node.size = 1)
              )
#獲得每一個細胞的打分並存儲在metadata中
Tcells@meta.data$RFScore <- as.double(predict(rf_mod,t(GetAssayData(Tcells)[markers.feser,])))
#標記終點結局標籤
Tcells@meta.data$inTraining <- FALSE
Tcells@meta.data$inTraining[inTraining] <- TRUE #我們選擇的訓練集則是TRUE
#驗證打分準確性
Idents(Tcells) <- "age"
roc_obj <- roc(response = as.numeric(meta("ident",Tcells)[!(Tcells$inTraining) &
                                                   meta("ident",Tcells)%in%c("fetal", "adult")]=="adult"),
               predictor = Tcells$RFScore[!(Tcells$inTraining) &
                                               meta("ident",Tcells)%in%c("fetal", "adult")],
               plot = T)
auc(roc_obj)
#Area under the curve: 0.9998

這塊我們學習到的技巧就是可以把細胞亞群的label作為我們的終點結局進而來構建模型,之所以構建隨機森林則是因為其對數據最為寬容

#可視化打分
dittoPlot(Tcells, "RFScore", cells.use = Tcells$inTraining,
       group.by = "Sample", color.by = "age",
       plots = c("jitter","vlnplot"),
       boxplot.color = "white", boxplot.fill = F,
       vlnplot.lineweight = 0.3, vlnplot.width = 3,
       sub = "in Training", colors = c(1,3))
### 7. Check the look for all T cells.
dittoPlot(Tcells, "RFScore", cells.use = !(Tcells$inTraining),
       group.by = "Sample", color.by = "age",
       plots = c("jitter","vlnplot"),
       boxplot.color = "white", boxplot.fill = F,
       vlnplot.lineweight = 0.3, vlnplot.width = 5,
       sub = "NOT in training")
dittoDimPlot(Tcells, "RFScore", cells.use = !(Tcells$inTraining),
             sub = "NOT in training", size = 2, reduction.use = "umap")

這塊圖片就不展示了,因為和文獻中是一樣的,這塊的技巧告訴我們,只需要把我們想要的信息添加到metadata中,那麼後續的可視化就可以直接調用

那麼至此,這篇文獻的一些關於單細胞可視化以及機器學習算法還有一些分析細節到這裡就結束了,感覺收穫滿滿,大家也快找到數據快速練習吧

那麼本期推文到這裡就結束了,感興趣這個專題的小夥伴也歡迎大家在評論區留言,然後以後會多多更新相似專題哦

我是晨曦,我們下次再見

參考教程:方便的小夥伴可以去github給作者點個星星哦,這麼優質的作者不多見哦~

除此之外,我還為大家整理了許多單細胞測序的高分套路模板和文章復現資源,想要的小夥伴可以點擊了解詳情免費領取哦~

1.GitHub - dtm2451/ProgressiveHematopoiesis: Code to go along with a manuscript: Bunis, et. al., Cell Reports, 2021.

2.Bunis, D. G., Bronevetsky, Y., Krow-Lucal, E., Bhakta, N. R., Kim, C. C., Nerella, S., Jones, N., Mendoza, V. F., Bryson, Y. J., Gern, J. E., Rutishauser, R. L., Ye, C. J., Sirota, M., McCune, J. M., & Burt, T. D. (2021). Single-Cell Mapping of Progressive Fetal-to-Adult Transition in Human Naive T Cells. Cell Reports, 34(1). https://doi.org/10.1016/j.celrep.2020.108573

關鍵字: