ROGUE計(jì)算cell cluster的純度

前言

近期匿醒,張澤民教授團(tuán)隊(duì)開發(fā)了一種在cell cluster里面計(jì)算純度的算法ROGUE邪意,什么意思呢骨望?經(jīng)過傳統(tǒng)的降維方式(t-SNE粪牲,UMAP)降維聚類后的cell cluster,其每一個(gè)cell cluster里面并不會(huì)是100%的同一類型的細(xì)胞赢织,里面可能含有一些其他類型的細(xì)胞也分到同一個(gè)cell cluster里面亮靴,因此有必要計(jì)算每一個(gè)cell cluster的純度
文章鏈接:An entropy-based metric for assessing the purity of single cell populations

測(cè)試算法

首先,我們模擬創(chuàng)建一個(gè)單細(xì)胞數(shù)據(jù)中某cell cluster的表達(dá)矩陣

exper = data.frame(abs(matrix(rnorm(10000),nrow=100)))
row.names(exper) = paste(rep('gene'),1:100,sep = '_')
colnames(exper) = paste(rep('cell'),1:100,sep = '_')

然后計(jì)算該矩陣的平均表達(dá)量和香濃熵敌厘,文章是這么定義每個(gè)基因的香濃熵的:


那么從代碼中台猴,我們可以看到,其香濃熵即為每行的均值俱两,我們稱之為真實(shí)entropy饱狂,實(shí)現(xiàn)由函數(shù):Entropy:

library(tibble)

Entropy <- function(expr, r = 1){
  tmp <- log(expr+1)
  entropy <- Matrix::rowMeans(tmp) #計(jì)算香濃熵
  mean.expr <- log(Matrix::rowMeans(expr)+r) #計(jì)算表達(dá)均值的log值

  ent_res <- tibble(
    Gene = rownames(expr),
    mean.expr = mean.expr,
    entropy = entropy
  )

  return(ent_res)
}

結(jié)果為:


函數(shù)Entropy()

計(jì)算好每個(gè)基因表達(dá)量均值的log值和每個(gè)基因的香濃熵以后,作者利用loess來擬合基因表達(dá)量均值的log值和每個(gè)基因的香濃熵之間的關(guān)系宪彩,實(shí)現(xiàn)由函數(shù):entropy_fit

entropy_fit <- function(.x, span = 0.5, mt.method = "fdr"){
  .x <- .x %>% dplyr::filter(is.finite(mean.expr)) %>% dplyr::filter(entropy > 0)
  fit <- loess(entropy~mean.expr, data = .x, span=span)
  prd <- predict(fit, .x$mean.expr)
  .x %>%
    dplyr::mutate(fit = prd) %>%
    dplyr::mutate(ds = fit - entropy) %>%
    dplyr::mutate(pv = 1-pnorm(.$ds, mean = mean(.$ds), sd = sd(.$ds))) %>%
    dplyr::filter(pv > 0.1) -> tmp

  fit <- loess(entropy~mean.expr, data = tmp, span=span)
  prd <- predict(fit, .x$mean.expr)
  .x %>%
    dplyr::mutate(fit = prd) %>%
    dplyr::mutate(ds = fit - entropy) %>%
    dplyr::filter(is.finite(ds)) %>%
    dplyr::mutate(pv = 1-pnorm(.$ds, mean = mean(.$ds), sd = sd(.$ds))) %>%
    dplyr::filter(pv > 0.1) -> tmp

  fit <- loess(entropy~mean.expr, data = tmp, span=span)
  prd <- predict(fit, .x$mean.expr)

  .x %>%
    dplyr::mutate(fit = prd) %>%
    dplyr::mutate(ds = fit - entropy) %>%
    dplyr::filter(is.finite(ds)) -> .x

  .x <- .x %>% dplyr::mutate(p.value = 1-pnorm(.x$ds, mean = mean(.x$ds), sd = sd(.x$ds)))
  p.adj <- p.adjust(.x$p.value, method = mt.method)
  .x <- .x %>% dplyr::mutate(p.adj = p.adj) %>% dplyr::arrange(desc(ds))
}

結(jié)果為:


函數(shù)entropy_fit()

這里用loess(局部加權(quán)回歸)來預(yù)測(cè)基因平均表達(dá)量的log值與熵的關(guān)系休讳,預(yù)測(cè)的模型為fit,而后者需要利用基因表達(dá)量均值的log值作為決策變量尿孔,來根據(jù)模型fit預(yù)測(cè)響應(yīng)變量的值俊柔,我們稱之為預(yù)測(cè)entropy
并且作者定義ds如下:


由代碼可知

dplyr::mutate(fit = prd) %>%
dplyr::mutate(ds = fit - entropy)

ds預(yù)測(cè)entropy減去真實(shí)entropyds越大說明該cluster內(nèi)某基因的熵變很大活合,即真實(shí)表達(dá)水平與預(yù)測(cè)的(與cluster內(nèi)部大部分基因不一樣)相差很大雏婶,說明很有可能是其他類型的細(xì)胞(雜質(zhì))

最后要計(jì)算的是Rogue值
該值定義如下:



其中而ROGUE介于0-1之間;當(dāng)平臺(tái)是UMI的白指,那么K=45留晚,若平臺(tái)為full-length,則K=500

SE_fun <- function(expr, span = 0.5, r = 1, mt.method = "fdr", if.adj = T){
  ent_res <- ROGUE::Entropy(expr, r = r)
  ent_res <- ROGUE::entropy_fit(ent_res, span = span, mt.method = mt.method)
  if(!isTRUE(if.adj)){
    ent_res <- ent_res %>% dplyr::mutate(p.adj = p.value)
  }
  return(ent_res)
}

##  .x即為函數(shù)SE_fun()的返回值
CalculateRogue <- function(.x, platform = NULL, cutoff = 0.05, k = NULL, features = NULL){
  if(is.null(k)){
    if(is.null(platform)){
      warning("Please provide a \"platform\" argument or specify a k value")
    }else if(platform == "UMI"){
      k = 45
    }else if(platform == "full-length"){
      k = 500
    }else if(!is.null(platform) & !(platform %in% c("UMI","full-length"))){
      warning("Please provide valid \"platform\" argument")
    }
  }else if(!is.null(k)){
    k <- k
  }

  if(!is.null(features)){
    .x <- .x %>% dplyr::filter(Gene %in% features)
    sig_value <- sum(abs(.x$ds))
    Rogue <- 1-sig_value/(sig_value+k)
    return(Rogue)
  }else{
    sig_value <- abs(.x$ds[.x$p.adj < cutoff & .x$p.value < cutoff])
    sig_value <- sum(sig_value)
    Rogue <- 1-sig_value/(sig_value+k)
    return(Rogue)
  }
}

其中.x即為函數(shù)SE_fun()的返回值告嘲,在計(jì)算sig_value時(shí)错维,用的是該cell cluster中所有基因的ds值的總和;ROGUE值越高橄唬,說明該cell cluster細(xì)胞純度越高赋焕,反之越低;

Github:https://github.com/PaulingLiu/ROGUE/blob/master/R/ROGUE.R

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仰楚,一起剝皮案震驚了整個(gè)濱河市隆判,隨后出現(xiàn)的幾起案子犬庇,更是在濱河造成了極大的恐慌,老刑警劉巖蜜氨,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件械筛,死亡現(xiàn)場(chǎng)離奇詭異捎泻,居然都是意外死亡飒炎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門笆豁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郎汪,“玉大人,你說我怎么就攤上這事闯狱∩酚” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵哄孤,是天一觀的道長(zhǎng)照筑。 經(jīng)常有香客問我,道長(zhǎng)瘦陈,這世上最難降的妖魔是什么凝危? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮晨逝,結(jié)果婚禮上蛾默,老公的妹妹穿的比我還像新娘。我一直安慰自己捉貌,他們只是感情好支鸡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趁窃,像睡著了一般牧挣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上醒陆,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天瀑构,我揣著相機(jī)與錄音,去河邊找鬼统求。 笑死检碗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的码邻。 我是一名探鬼主播折剃,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼像屋!你這毒婦竟也來了怕犁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奏甫,沒想到半個(gè)月后戈轿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阵子,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年思杯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠进。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡色乾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出领突,到底是詐尸還是另有隱情暖璧,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布君旦,位于F島的核電站澎办,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏金砍。R本人自食惡果不足惜局蚀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捞魁。 院中可真熱鬧至会,春花似錦、人聲如沸谱俭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆著。三九已至县貌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凑懂,已是汗流浹背煤痕。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留接谨,地道東北人摆碉。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像脓豪,于是被迫代替她去往敵國(guó)和親巷帝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容