原题目
题目代码
1. 安装R语言包
安装以下包:
|
|
代码如下所示:
|
|
2. ExpressionSet对象
注:补充ExpressionSet知识
CLL包中里面有一个sCLLex
数据,它是ExpressionSet格式的,如下所示:
|
|
现在查看一下这个对象,如下所示:
|
|
看一下这个数据的文档,可以得到这些信息:
这个数据集中有22个样本,12625个基因;使用exprs
可以查看这个数据集的表达水平;使用phenoData
可以查看这个数据集的分组信息,如下所示:
|
|
使用View(data_expression)
可以直观看出来这个表达矩阵,如下所示:
再来查看一个sCCLex
这个数据集的其它信息,如下所示:
|
|
上面的%>%
这个符号相当于Linux中的管道命令。
接着,提取表型信息,如下所示:
|
|
绘制芯片数据的质量值,如下所示:
|
|
3.了解str,head,help函数
略,第2题中已经有了。
4.了解并安装hgu95av2.db
注:补充db数据格式的相关知识
hgu95av2.db是一个注释包,它为hgu95av2平台的芯片提供注释,这个包中有很多注释文件,如下所示:
|
|
安装hgu95av2.db,如下所示:
|
|
5.理解toTable的用法
原是描述:理解 head(toTable(hgu95av2SYMBOL)) 的用法,找到 TP53 基因对应的探针ID。
先看一下hgu95av2SYMBOL
是什么,如下所示:
|
|
大致意思就是说,hgu95av2SYMBOL是一个R对象,它描述厂家的标记符(identifiers)与基因缩写之间的映射关系。
再看一下toTable
的用法,如下所示:
|
|
大致意思是说,toTable是一种能够以数据框的形式来操作一个Bimap对象的方法,也就是把Bimap对象转换为一个数据框,这些方法是Bimap interface方法的一部分。Bimap指的是一种映射关系,例如探针的编号与基因名称之间的映射,如下所示:
|
|
6.探针与基因的关系
原题目描述:
理解探针与基因的对应关系,总共多少个基因,基因最多对应多少个探针,是哪些基因,是不是因为这些基因很长,所以在其上面设计多个探针呢?
答:不管是Agilent芯片,还是Affymetrix芯片,上面设计的探针都非常短。最长的如Agilent芯片上的探针,往往都是60bp,但是往往一个基因的长度都好几Kb。因此一般多个探针对应一个基因,取最大表达值探针来作为基因的表达量。
7.提取目的基因
原题目描述:
第二步提取到的表达矩阵是12625个探针在22个样本的表达量矩阵,找到那些不在
hgu95av2.db
包收录的对应着SYMBOL的探针。
芯片表达的数据存放在data_expression
这个变量中,它有22个样本的12625个探针数据,如下所示:
|
|
现在要解决的一个问题是:在data_expression
中有一些基因没有收录在hug95av2.db
包中,现在要找到这些基因,把它们都去掉。
思路:找到hug95av2.db
包中能够与基因映射起来的探针,再找到这些探针对应的基因SYMBOL,然后在data_expression
中取出这些基因即可。此时要使用到hug95av2.db
包中的hug95av2SYMBOL
这个文件,如下所示:
|
|
查阅其文档,了解到如下信息:hug95av2SYMBOL是一个R对象,它提供的是芯片生产厂家与基因缩写之间的映射信息。这个映射的信息主要依据Entrez Gene数据库。现在我们通过mappedkeys()
这个函数,得到映射到基因上的探针信息,如下所示:
|
|
其中,gene_symbol就是有映射关系的基因,它里面的数据是探针的编码以及探针对应的基因,在data_expression中它们挑出来即可。这里使用到了mappedkeys()
函数,这个函数用于处理映射文件(bimap),它的参数就是一个Bimap对象,例如上面的hgu95av2SYMBOL
这个对象,关于Bimap对象,可以看这篇笔记《Bimap对象笔记》。
8. 过滤表达矩阵
原问题描述:过滤表达矩阵,删除那1165个没有对应基因名字的探针。这时再看一下原始数据,如下所示:
|
|
思路:在这个原始数据中,有12625个探针,下面通过isNA
函数可以得到一个逻辑向量,其中TRUE
表示没有映射关系的探针,FALSE
表示有映射关系的探针。然后使用seq
生成一个整数向量,并提取那些有映射关系的探针所在的列,提取原始数据即可,如下所示:data_filter <- data_expression[rownames(data_expression)%in%probe_info]
|
|
现在就得了过滤后的表达矩阵,即data_filter
。
9.整合表达矩阵
原问题描述:整合表达矩阵,多个探针对应一个基因的情况下,只保留在所有样本里面平均表达量最大的那个探针。
思路:基因芯片的的多个探针会针对同一个基因,因此会有重复,先看一下表达矩阵data_filter
的样子:
其中列是不同的样本,行是不同的探针,此时我们解决问题的思路应该是这个样子的:第一,把表达矩阵中的探针名称转换为基因名称;第二,计算每行的均值;第三,在相同基因的表达值中,取最大的那行。
第一步,要使用到的数据是gene_symbol
,它的内容是,去掉了无映射关系的探针编号后,剩余的探针与相应基因的映射关系,如下所示:
|
|
现在将表达矩阵data_filter
中的探针名称排序,如下所示:
|
|
排序的目的在于,将探针与基因名一一对应起来,排序后的表达矩阵如下所示:
第二步,计算每行的均值,使用apply函数即可,如下所示:
|
|
第三步,保留相同基因中表达值最高的那一行,如下所示:
|
|
10.更改矩阵名称
上题已经实现。
11.绘制基本图形
原题描述:对第10步得到的表达矩阵进行探索,先画第一个样本的所有基因的表达量的boxplot,hist,density , 然后画所有样本的 这些图
思路:使用ggplot2绘图,要把数据转换为ggplot2可识别的形式,也就是第1列是基因名,第2列是分组信息,第3列是表达值,如下所示:
|
|
箱线图
|
|
小提琴图
|
|
密度图
|
|
密度图
|
|
PCA图
|
|
聚类图
聚类的相关知识参考这篇笔记《聚类分析笔记》。
|
|
12.统计学指标
原题描述:理解统计学指标mean,median,max,min,sd,var,mad并计算出每个基因在所有样本的这些统计学指标,最后按照mad值排序,取top 50 mad值的基因,得到列表。
mean,median,max,min,sd,var,mad中除了mad外,其余的好理解,下面只介绍一下mad。
mad指的是绝对中位数差(median absolute deviation)
,在R中的函数是mad()
。它的用法如下所示:
其中,x
数值向量;center
可选,是中心点,默认是中位数;constant
是缩放因子(scale factor),na.rm
如果是TRUE,在计算前将x中的NA删除,low
如果是TRUE,计算lo-median
,也就是说,对于个数为偶数的样本,在最后计算中位数时不使用两个中间值的均值,而是采用其中较小的值。high
如果为TRUE,计算‘hi-median’,也就是对于偶数样本,采用两个中间值的较大者作为中位数。
在R中,mad的计算公式为constant * cMedian(abs(x - center))
,其中,center默认为median(x)
,cMedian
为“低”中位数或“高”中位数,constant默认值为1.4826
,它近似等于$1/\Phi^{-1}(3/4)=1/qnorm(3/4)$,这样就可以确保对于服从$N(\mu,\sigma^2)$分布的$X_{i}$和大的n值,存在以下一致性:
$E[mad(X_{1},…,X_{n})]=\sigma$
这里取3/4是因为MAD包含标准正态累积分布函数的50%,具体的推导过程可以看这个帖子《绝对中位差Median Absolute Deviation》。
如果na.rm为TRUE,在执行计算之前,将会删除x中的NA值;否则,只要x中存在任何NA值,mad函数将会返回NA
我们来看一个案例:
|
|
13.提取 TOP 50 mad值的基因列表
原是描述:根据第12步骤得到top 50 mad值的基因列表来取表达矩阵的子集,并且热图可视化子表达矩阵。试试看其它5种热图的包的不同效果,先看一下原表,如下所示:
从上面的这个表可以知道,行是基因名,列是样本名,现在进行计算,如下所示:
注:补充apply系列函数的相关知识
|
|
以下为提取后的数据集,这个数据集是一个矩阵,行是基因名,列是样本名,如下所示:
绘制这个数据集的热图,目前已经绘制热图的函数有:
heatmap
heatmap(stat)
这个是stat包中自带的热图工具,用法如下所示:
|
|
如下所示:
|
|
heatmap.2
heatmap.2
是gplots
包中的函数(文档太长,就不列了),绘制热图如下所示:
|
|
d3heatmap
d3heatmap包可用于生成交互式热图绘制,可通过以下代码生成:
|
|
Heatmap
这个函数是ComplexHeatmap
包中的函数。用法如下所示:
|
|
pheatmap
此函数是pheatmap
包中的函数,用法如下所示:
|
|
上述几种绘制热图的函数是比较常用的,还有很多参数,需要自己调一下。
14.不同统计指标的交集
原题描述:取不同统计学指标mean,median,max,mean,sd,var,mad的各top50基因列表,使用UpSetR包来看他们之间的overlap情况。先计算一下各个统计学指标,如下所示:
|
|
15.提取表型数据
已经在前面完成。
16. 聚类
已经在第11题中完成。
17.PCA
已经在第11题中完成。
18.批量t检验
注:这里要补充一下统计学的相关知识。
代码如下所示:
|
|
19.limma
原题描述:使用limma包对表达矩阵及样本分组信息进行差异分析,得到差异分析表格,重点看logFC和P值,画个火山图(就是logFC和-log10(P值)的散点图。)。
注:这里需要补充一下基因芯片原理的相关知识。
limma包是常用的分析芯片数据的R包,分析过程如下所示:
|
|
解释一下代码:design1=model.matrix(~factor(group_list))
这是一个设计矩阵,关于设计矩阵的一些知识,可以看这篇笔记《线性模型》。
注:这里需要补充一下线性代数的相关知识。
lmFit
函数是用于构建一个线性模型;它的参数一个是表达矩阵,一个是分组对象
eBays
函数是用于构建一个微阵列线性模型。
20.火山图
设定绘图数据的阈值,如下所示:
|
|
结论
与R语言有关的这20道题中涉及的知识不少,代码背后的数理统计与线性代数知识目前比较欠缺,需要补充。