一個奇怪的Bug的修復(fù)挑庶,我們再次理解數(shù)據(jù)
如上圖所示言秸,我本來輸入數(shù)據(jù)做了一個exp,指數(shù)變化算得好好的迎捺。但是我用原始的data slot举畸,反而出問題了。沒辦法只能排查凳枝。
當(dāng)我把 warnings打印出來抄沮,原來底層原因是因為log之后產(chǎn)生了 NaNs
下面我們就具體去看看,哪里產(chǎn)生了這些wanings岖瑰。
順著這個NaN
在運算中出錯的原因就在于:
sum(c(1:10,NaN)) == 0
這個結(jié)果返回NaN而不是它需要的T/F叛买,下面我們要順藤摸瓜,找到是哪里產(chǎn)生了NaN蹋订。
那么什么時候log會產(chǎn)生NAN呢率挣?
這里,當(dāng)我們輸入的值小于0的時候就產(chǎn)生了辅辩。
那么為什么會有負值呢难礼?
因為你的輸入數(shù)據(jù)有負值,重磅發(fā)現(xiàn) v1.6.1版本是有這個限制的玫锋。
一定要所有值都大于0蛾茉。怪不得我取 exp變換之后,就可以運算了撩鹿,原來是需要所有值都為正值谦炬。
那么這個具體是在哪個地方做了log變換呢?
關(guān)鍵的地方就在這里节沦,這個geometricMean
這函數(shù)键思,幾何平均數(shù)必須要是正值才行。
#' Compute the geometric mean
#' @param x a numeric vector
#' @param na.rm whether remove na
#' @return
#' @export
geometricMean <- function(x,na.rm=TRUE){
if (is.null(nrow(x))) {
exp(mean(log(x),na.rm=na.rm))
} else {
exp(apply(log(x),2,mean,na.rm=na.rm))
}
}
所以作者才會在創(chuàng)建CellChat對象的時候檢查一下甫贯,data中的最小值是否大于0吼鳞,否則是不能參與運算的。
但是你為什么輸入的時候是matrix類型的就不檢查呢叫搁?奇怪赔桌。一連串的黑人問號供炎。
好,現(xiàn)在我們清楚了問題所在疾党,我們再重申一下問題:
- 計算通訊概率需要用到幾何平均數(shù)音诫,但是幾何平均數(shù)要求所有輸入的值為正值
- 但是一般不是歸一化之后的數(shù)據(jù),他是有負值的
- 如何將包含負值的歸一化數(shù)據(jù)轉(zhuǎn)變成沒有負值的數(shù)據(jù)
怎么破
不要緊雪位,統(tǒng)計總有簡單的方法
- shift data竭钝,就是每個值都加上一個 min(data) + offset, offset可以取1或者一個極小的數(shù)
- 進行exp變換雹洗,因為一般歸一化之后出現(xiàn)負值也是因為取了Log變換香罐,所以可以再變回去。
但是时肿,不對啊穴吹,標(biāo)準(zhǔn)流程又怎么會產(chǎn)生負數(shù)
難道是我們的調(diào)用姿勢不對?
標(biāo)準(zhǔn)流程有兩個嗜侮,當(dāng)你的數(shù)據(jù)是一個dataset的時候,這個dataset沒有批次效應(yīng)啥容。因此你可以用RNA中的data slot或者用SCT的 data slot锈颗。這個時候你把data放進來,它是不是有負值的咪惠,因為它log變化的時候取的是 log1p击吱,所以最小值不會小于0.
第二個流程就是有兩個 dataset,他們有批次性效應(yīng)遥昧。官方的標(biāo)準(zhǔn)流程是先在一個dataset中把結(jié)果算好覆醇。然后再將單個dataset中的結(jié)果讀進來做下游的整合分析。也就是說計算通訊概率等都是在原來dataset中進行的炭臭,后面只是可視化一下永脓。
這里的dataset可以是不同的condition下的數(shù)據(jù)。例如你選取了三個時間點鞋仍,t1,t2和t3常摧。每個時間點養(yǎng)一窩小鼠。這樣就會產(chǎn)生批次效應(yīng)威创。每窩小鼠待得環(huán)境可能不一樣落午。
其實還可以有第三個方案:
這個方案就是把不同conditon下的dataset,整合到一塊肚豺,形成一個大的dataset溃斋。這個dataset,只包含了幾千個高變基因吸申,這個時候你再根據(jù)cell的標(biāo)簽梗劫,將其根據(jù)condition享甸,來做不同condition下面的通訊分析。
這個方案與上面的標(biāo)準(zhǔn)流程有兩個重要的不同在跳,1.這里的基因少了枪萄,是幾千個高變基因。2.這里的歸一化后輸入到CellChat的數(shù)據(jù)是有負值的猫妙。
所以知道了這些區(qū)別之后瓷翻,你可以權(quán)衡。