这次详细讲讲Seurat v4.0里降维的事儿,主要说下数据存哪儿、怎么拿、还有咋自己做。 01降维结果都被塞到对象的一个位置里,直接用[[就能调用。比如PCA和MDS这些常用的算法一跑,结果就直接进了@reductions列表,随时可以用。如果觉得默认的不行,也能自己写个流程,结果随便扔到你想命名的位置,想用的时候直接调出来。 02每个标准降维结果都带着一堆固定的位置,方便后续操作。比如cell.embeddings里存的是每个细胞在低维空间的坐标,直接拿来画t-SNE或UMAP就行。feature.loadings记录了每个基因在降维空间里的权重,能看出哪些基因是起大作用的。还有feature.loadings.projected,这是专门给那些只对高变基因做降维用的,把结果投影回所有基因,方便以后标注。stdev就是每个维度上的标准差,用来归一化。key是基因坐标和表达矩阵列名的对照,方便找回去。jackstraw只有PCA支持,提供校正后的P值信息。misc就是留给用户放自定义元数据的自由空间。 03不需要再跑一遍耗时的算法了,用Embeddings()、Loadings()、Stdev()这些封装好的函数就能直接拿数据。下面拿PCA来举例,看看怎么取前5个细胞坐标:先把数据Load进来,然后用Embeddings函数指定"pca"这个降维方法,取前5列就行了。输出的每一行代表一个细胞的坐标,列名从PC1排到PC5。如果想看基因的加载量也是一样的操作,用Loadings函数取前5个就行。 04要是标准方法不够用,自己写个R函数也能搞定。这里用cmdscale举个例子做MDS。先算个距离矩阵,数据用scale.data里的就行。然后跑cmdscale取前2维结果,再给列名起个"MDS_1"、"MDS_2"。最后把结果存到对象的"mds"这个位置里。 05做完降维后想找跟某维度关系最密切的基因也很简单,用ProjectDim函数就能把第一维度的坐标投影回所有细胞。下面这段代码能直接把第一个MDS坐标投影回去并抓出前20个最相关的基因:执行ProjectDim后取前20个结果看看,可能会有LINC00926、HLA-DQB1、HLA-DQA1这些名字。 06总结来说就是把每次降维都做成了一个模块,能回溯、能复用、能扩展。这样省得来回跑重复的计算流程,数据的流向也更清楚了。掌握了这些位置和函数的用法,就能在中间随便插自己的算法步骤或者快速提取结果做后续分析——这就是“即存即用”。