美文网首页
CellChat系列10:一个奇怪的Bug的修复,我们再次理解数

CellChat系列10:一个奇怪的Bug的修复,我们再次理解数

作者: 沧浪之水v | 来源:发表于2023-10-12 10:21 被阅读0次

    一个奇怪的Bug的修复,我们再次理解数据

    如上图所示,我本来输入数据做了一个exp,指数变化算得好好的。但是我用原始的data slot,反而出问题了。没办法只能排查。

    当我把 warnings打印出来,原来底层原因是因为log之后产生了 NaNs


    下面我们就具体去看看,哪里产生了这些wanings。

    顺着这个NaN

    在运算中出错的原因就在于:
    sum(c(1:10,NaN)) == 0 这个结果返回NaN而不是它需要的T/F,下面我们要顺藤摸瓜,找到是哪里产生了NaN。

    那么什么时候log会产生NAN呢?


    这里,当我们输入的值小于0的时候就产生了。

    那么为什么会有负值呢?

    因为你的输入数据有负值,重磅发现 v1.6.1版本是有这个限制的。

    一定要所有值都大于0。怪不得我取 exp变换之后,就可以运算了,原来是需要所有值都为正值。

    那么这个具体是在哪个地方做了log变换呢?

    关键的地方就在这里,这个geometricMean这函数,几何平均数必须要是正值才行。

    #' 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))
      }
    }
    

    所以作者才会在创建CellChat对象的时候检查一下,data中的最小值是否大于0,否则是不能参与运算的。
    但是你为什么输入的时候是matrix类型的就不检查呢?奇怪。一连串的黑人问号。

    好,现在我们清楚了问题所在,我们再重申一下问题:

    1. 计算通讯概率需要用到几何平均数,但是几何平均数要求所有输入的值为正值
    2. 但是一般不是归一化之后的数据,他是有负值的
    3. 如何将包含负值的归一化数据转变成没有负值的数据

    怎么破

    不要紧,统计总有简单的方法

    1. shift data,就是每个值都加上一个 min(data) + offset, offset可以取1或者一个极小的数
    2. 进行exp变换,因为一般归一化之后出现负值也是因为取了Log变换,所以可以再变回去。

    但是,不对啊,标准流程又怎么会产生负数

    难道是我们的调用姿势不对?

    标准流程有两个,当你的数据是一个dataset的时候,这个dataset没有批次效应。因此你可以用RNA中的data slot或者用SCT的 data slot。这个时候你把data放进来,它是不是有负值的,因为它log变化的时候取的是 log1p,所以最小值不会小于0.

    第二个流程就是有两个 dataset,他们有批次性效应。官方的标准流程是先在一个dataset中把结果算好。然后再将单个dataset中的结果读进来做下游的整合分析。也就是说计算通讯概率等都是在原来dataset中进行的,后面只是可视化一下。

    这里的dataset可以是不同的condition下的数据。例如你选取了三个时间点,t1,t2和t3。每个时间点养一窝小鼠。这样就会产生批次效应。每窝小鼠待得环境可能不一样。

    其实还可以有第三个方案:
    这个方案就是把不同conditon下的dataset,整合到一块,形成一个大的dataset。这个dataset,只包含了几千个高变基因,这个时候你再根据cell的标签,将其根据condition,来做不同condition下面的通讯分析。

    这个方案与上面的标准流程有两个重要的不同,1.这里的基因少了,是几千个高变基因。2.这里的归一化后输入到CellChat的数据是有负值的。

    所以知道了这些区别之后,你可以权衡。

    相关文章

      网友评论

          本文标题:CellChat系列10:一个奇怪的Bug的修复,我们再次理解数

          本文链接:https://www.haomeiwen.com/subject/ylanbdtx.html