源代码:https://rdrr.io/bioc/MetaNeighbor/src/R/MetaNeighborUS.R
reference paper:https://www.nature.com/articles/s41467-018-03282-0#Sec10
Github:https://github.com/maggiecrow/MetaNeighbor/blob/master/README.md
在MetaNeighborUs函数中,输入表达矩阵,高变基因的列表,每个细胞对应的类型标签以及细胞所属的样本。
假设共有n个细胞,共有两个样本,共有m个高变基因。每个样本中都有三个细胞类型,且是互相对应的。
原函数工作流程
计算每个细胞与不同细胞类型之间的连接度
根据输入的信息创建一个指示每个细胞类型的零一矩阵。(cell_labels)(n*6)
过滤掉表达矩阵中的非高变基因,用高变基因计算所有细胞(无论所属的样本与细胞类型)两两之间的Spearmann Correlation。得到一个对称的相关性矩阵(cor_data)。(n*n)此时对角线上的值为1,其余位置的值在0~1之间。
根据相关系数矩阵对矩阵中的所有项进行秩的计算,由于共有nn项,所以理论上最大值应为nn,最小值应为1,但是由于排序时tie.method设置不同,可能不符合。得到一个包含n*n的包含正整数的对称矩阵(rank_data)。此时对角线上的值相同,且为矩阵中的最大值。
rank_data矩阵中的所有项均除以最大rank值。此时矩阵对角线上的值最大,为1,其余的值在0~1之间。
将rank_data每一列的值加和,得到的是一个细胞与其他所有细胞之间的相关性排序之和。(sum_all)一个细胞的值越大,说明这个细胞与其他细胞之间的总相关性越强。
用rank_data矩阵乘以指示细胞类型的矩阵cell_labels,就会得到每个细胞对于不同细胞类型之间的连接度矩阵。(sum_in)(n*6)
将sum_in的每一行除以对应细胞的sum_all值,使得每一行的和为1,即每个细胞与所有细胞类型之间的连接度之和为1。该矩阵称为predicts。(n*6)
分别计算每种细胞类型与各种细胞类型之间的AUROC值
对每种细胞类型,从predicts中取出其所属样本中所有细胞与所有类型之间的连接度组成矩阵。
对每一列分别进行排序。
将属于该类型的细胞的在所有类型的排序保留,其余行的项均为0。
对于每一列进行求和,得到该细胞类型在不同细胞类型的排序的总和。
最终计算公式:cell_NV[i,]= (p/np - (np+1)/2)/nn
其中:p-排序的总和;np-属于该细胞类型的细胞数;nn-在该样本中不属于该细胞类型的细胞数
AUC计算公式:https://www.plob.org/article/22899.html
可以推断的是:
当p最大时,所有不属于该类型的细胞的排序都低于属于该类型的细胞,即nn个不属于该类型的细胞完全被过滤掉了,保留下来的秩应该都是大于nn的。所以pmax = [1+2+…+(np+nn)]-(1+2+…+nn)=(np+nn+1)(np+nn)/2 - (nn+1)nn/2=(np^2+2np)/2,根据该计算公式,如果p=pmax,cell_NV[i,j]=1。
关于最终AUROC矩阵为何是对称的
在计算完所有类型之间的AUROC之后,默认参数设置symmetric_output = TRUE。会进行一步计算使得矩阵强行对称cell_NV <- (cell_NV + t(cell_NV))/2。
经过测试,如果设置symmetric_output = F,则矩阵不是对称的。