cell type classify
cell type classify
PeRl
2019/3/14
正好最近課題有些新東西,就做一下總結,以后估計都會用到吧.
單細胞測序中對細胞的分類
一般在單細胞測序數據的處理中,都會涉及到對細胞類型的分類,不管有用沒用都得統計一下做一個展示.
比較常見的方法是用聚類的方式將單細胞划分到最相似的細胞類型,通常這樣操作的時候細胞類型的數量都比較少.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中的細胞類型的,畢竟其中的細胞類型也只是人體內的一部分.
如何解決這個問題還要再考慮一下,就這樣.