單細胞中的細胞類型划分


cell type classify

正好最近課題有些新東西,就做一下總結,以后估計都會用到吧.

單細胞測序中對細胞的分類

一般在單細胞測序數據的處理中,都會涉及到對細胞類型的分類,不管有用沒用都得統計一下做一個展示.
比較常見的方法是用聚類的方式將單細胞划分到最相似的細胞類型,通常這樣操作的時候細胞類型的數量都比較少.HPCA項目的數據帶來了更加豐富的細胞類型,利用該數據進行細胞類型的划分可能會更有幫助(也許吧).

HPCA

HPCA項目收集了不同類型的細胞表達數據,並公開發表在GEO上: GSE49910.
UCSF可是好人啊,把整理后的數據公開發布了他們的singleR項目中,那么自然是盜亦有道,把下載鏈接分享一下,嘻嘻.

細胞類型划分

接下去就開始正式處理數據,導入hpca.rda以及需要進行細胞類型划分的單細胞數據.

setwd("/home/wang/Documents/subclone_anlysis/GSE118389/data/")
library(dplyr)
load("hpca.rda")
GSE118389 <- read.table(
  "GSE118389_norm_data.txt",
  header = T, 
  row.names = 1, 
  sep = "\t", stringsAsFactors = F, quote = "\"")

簡單說明一下hpca.rda中的數據存儲方式:

變量 含義
data 存儲HPCA項目中所有的細胞的表達數據,行名為基因名,列名為GSM樣本號
type GSM樣本的細胞具體類型
main_types 相對於type更為寬泛
de.gene 與type對應,存儲了每兩種細胞之間的差異基因
de.gene.main 與de.gene類似,其中的細胞為main_type

以type為例,我們將未知細胞划分到具體的細胞類型中去

cell_list <- names(hpca$de.genes)

構建計算細胞樣本之間距離的函數:

cell_dist <- function(cell_1_exp, cell_2_exp){
  cell_1_exp - cell_2_exp
}

然后構建細胞划分類型函數,其中需要一個未知細胞,兩個已知細胞類型,通過與該兩種細胞之間的距離,來確定未知細胞與哪一類更為接近:

type_compare <- function(unknow_cell, cell_type_1, cell_type_2){
  de_gene = eval(parse(text = paste0("hpca$de.genes$`", cell_type_1, "`$`", cell_type_2, "`")))
  de_gene_index = which(de_gene %in% tolower(rownames(hpca$data)))
  need_gene = intersect(rownames(hpca$data)[de_gene_index], rownames(GSE118389))
  cell_1_exp = hpca$data[need_gene, which(hpca$types == cell_type_1)] 
  if(class(cell_1_exp)== "matrix"){
    cell_1_exp = apply(cell_1_exp, 1, mean) %>% scale() %>% as.vector()
  }else {
    cell_1_exp = unlist(cell_1_exp) %>% scale() %>% as.vector()
  }
  cell_2_exp = hpca$data[need_gene, which(hpca$types == cell_type_2)]
  if(class(cell_2_exp) == "matrix"){
    cell_2_exp = apply(cell_2_exp, 1, mean) %>% scale() %>% as.vector()
  }else {
    cell_2_exp = unlist(cell_2_exp)  %>% scale() %>% as.vector()
  }
  unknow_cell_exp = unlist(GSE118389[need_gene, unknow_cell])
  dist = as.matrix(dist(rbind(unknow_cell_exp, cell_1_exp, cell_2_exp)))[-1,1]
  return(dist)
}

利用冒泡法迭代尋找未知細胞最相似的細胞類型:

cell_type_classify <- function(unknow_cell){
  temp = cell_list[1]
  for(i in 2: length(cell_list)){
    cell_type_2 = cell_list[i]
    need_dist = type_compare(unknow_cell, temp, cell_type_2)
    if(need_dist[1] > need_dist[2]){
      temp = cell_type_2
    }
  }
  return(temp)
}

最后就是循環的過程了:

GSE118389_cell_type <- apply(
  matrix(colnames(GSE118389), ncol = 1),
  1,
  cell_type_classify
)

雖然可以把每個未知細胞都划分到具體的細胞類型,但是還是有些問題,應該還是會有些細胞是無法划分到HPCA中的細胞類型的,畢竟其中的細胞類型也只是人體內的一部分.
如何解決這個問題還要再考慮一下,就這樣.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM