跟着生信技能树,学习 CIBERSORT

您所在的位置:网站首页 cibersort作图 跟着生信技能树,学习 CIBERSORT

跟着生信技能树,学习 CIBERSORT

2023-12-11 16:18| 来源: 网络整理| 查看: 265

后起之秀奔涌而至,欢迎大家在《生信技能树》的舞台分享自己的心得体会!

下面是优秀学徒的稿件

Jimmy老师去年解析了CIBERSORT使用SVM算法实现去卷积,我决定亦步亦趋的跟着Jimmy老师的代码学习

背景知识

首先有一些背景知识需要了解(特别是一些算法),但是我的理解方法特别粗暴,不知道Jimmy老师会不会打我。当然了,如果是原始的CIBERSORT R脚本 https://rdrr.io/github/singha53/amritr/src/R/supportFunc_cibersort.R 其实懂得使用即可。

最开始接触非负矩阵分解其实是在碱基突变的signature知识点:

碱基突变类型

先说6种碱基组合与96种组合:

以下解释来源自wiki百科https://en.wikipedia.org/wiki/Mutational_signatures

首先要明白,碱基突变共有六类碱基取代:C> A,C> G,C> T,T> A,T> C,T> G。为什么只有6种呢?因为G> T取代被认为等同于C> A取代,因为不可能区分最初发生在哪条DNA链(正向或反向)上。因此,C> A和G> T替换都计为“ C> A”类的一部分。出于相同的原因,G> C,G> A,A> T,A> G和A> C突变被计为“ C> G”,“ C> T”,“ T> A”,“ T> C”和“ T> G”类。

从5'和3'相邻碱基(也称为侧翼碱基对或三核苷酸上下文)中获取信息会导致96种可能的突变类型(例如A [C> A] A,A [C> A] T等)。肿瘤的突变目录是通过将96种突变类型之一中的每个单核苷酸变体(SNV)分类(同义词:碱基对取代或置换点突变)并计算这96种突变类型中每种突变的总数来创建的(见图)。

非负矩阵分解(NMF)

image-20200418230635129

以下解释来源自知乎专题https://zhuanlan.zhihu.com/p/27460660

NMF的基本思想可以简单描述为:对于任意给定的一个非负矩阵V,NMF算法能够寻找到一个非负矩阵W和一个非负矩阵H,使得满足 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。如下图所示,其中要求分解后的矩阵H和W都必须是非负矩阵。

img

矩阵V分解为左矩阵W和右矩阵H,可理解为原始矩阵V的列向量是H中的所有列向量的加权和,对应的权重系数则是W的列向量的元素,所有H称为基矩阵,W称为系数矩阵。

NMF在人脸识别的应用中和PCA还有VQ分解不同。VQ分解是用一张完整的图像直接代表源脸部图像;PCA是将几个完整人脸加减压成一张脸;而NMF是取甲的眼睛,乙的鼻子,丙的嘴巴直接拼成一张脸,也就是说NMF分解后的基矩阵H是每张人脸的一个特征部分,例如眼睛,鼻子,嘴巴等,然后权重矩阵对这些特征进行加权处理从而得到一张完整的人脸。如下图所示3种矩阵分解方式的区别。

img

img

**个人理解:**通过这2副图粗略的讲解,30个signatures就是第一幅图的左边的五官,第二幅图右边的数字,也就是基矩阵H,通过权重矩阵W对这些特征进行加权处理从而得到一张完整的人脸,一个非负矩阵。

ssGSEA

GSEA分析,jimmy老师在《生信技能树》公众号多次讲解:

GSEA分析一文就够(单机版+R语言版)GSEA的统计学原理试讲GSVA或者GSEA各种算法都是可以自定义基因集的

但实际上,绝大部分读者并没有去细看这个统计学原理,也不需要知道gsea分析的nes值如何计算 、

去卷积算法

这个就更麻烦了,见这位仁兄的“打屁股理论”https://www.zhihu.com/question/48279880

image-20200418235612174

通俗易懂,而CIBERSORT的反卷积算法就是,你的mrna就是信号系统的输出(一个基因在样本中的表达量),而lm22就是冲击响应(细胞分数权重),可以反推信号系统的输入(该基因在不同细胞亚群表达水平),也就是Jimmy老师文中所说的一个细胞在样本中的表达量是该基因在不同细胞亚群表达水平与细胞分数权重的线性组合,

SVM

释义来源自https://www.jiqizhixin.com/articles/2018-10-17-20与https://tangshusen.me/2018/10/27/SVM/,SVM就是一种二类分类模型,他的基本模型是的定义在特征空间上的间隔最大的线性分类器,SVM的学习策略就是间隔最大化。

我们凭直观感受应该觉得答案是H3。首先H1不能把类别分开,这个分类器肯定是不行的;H2可以,但分割线与最近的数据点只有很小的间隔,如果测试数据有一些噪声的话可能就会被H2错误分类(即对噪声敏感、泛化能力弱)。H3以较大间隔将它们分开,这样就能容忍测试数据的一些噪声而正确分类,是一个泛化能力不错的分类器。

但是很多情况是线性不可分,这时候就需要引入罚分机制C与松弛变量ξ;

如果是非线性,则需要通过kerenel将数据变化成高维空间,在新空间里用线性方法从训练数据中学习得到模型

还是不懂就看后面的函数输出结果进行结合理解吧,反正绝大部分情况下,不懂原理似乎是并不会影响使用

R包e1071

这里用e1071的SVM函数进行运算,需要对其参数进行一些了解,这里用详细的中文解释这个函数算法https://rpubs.com/skydome20/R-Note14-SVM-SVR http://blog.fukuball.com/lin-xuan-tian-jiao-shou-ji-qi-xue-xi-ji-fa-machine-learning-techniques-di-3-jiang-xue-xi-bi-ji/

svm(... type = 決定svm是要用來classification(類別)、還是regression(連續)。 scale = 將資料正規化成(平均值, 標準差) = (0,1) 的分佈。 kernel = 將資料映射到特徵空間的kernel-fun,用來處理「非線性可分」的問題。 *cost = 在Lagrange formulation中的大C,決定給被誤差/分錯的資料「多少」懲罰值。 *epsilon = margin of tolerance。越大,表示在容忍範圍內的誤差/分錯的資料,不會被懲罰;反之,越接近0,每一個誤差/分錯的資料都會被懲罰。 *gamma = 在kernel-fun裡面的參數(linear-fun除外)。 ... ) # 更多詳情請參考R的官方Help文件

以及原始的CIBERSORT R脚本 https://rdrr.io/github/singha53/amritr/src/R/supportFunc_cibersort.R

函数分解step1.载入数据

这里就直接使用Jimmy老师的第一步了,我觉得有困难的再加注释

rm(list = ls()) options(stringsAsFactors = F) # 首先读取两个文件 sig_matrix


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3