使用Bioconductor 分析芯片数据(一)

1、下载安装R相关包

> source("http://bioconductor.org/biocLite.R")  # 由于我之前已经安装了,这里提示升级
# 网上找了下解决方法
> remove.packages("BiocInstaller") 
> install.packages("BiocInstaller")  # 更新安装包
# 安装、更新bioconductor核心安装包
> biocLite()
# 安装 GEO 包
> biocLite("GEOquery")
# 出现如下问题
installation path not writeable, unable to update packages: cluster, foreign, MASS, Matrix, nlme, survival
# 解决方法:windows以管理员身份打开,linux建议的解决方法为使用管理者权限启动R,即 sudo R

GEOquery 是 NCBI 存储标准化的转录组数据的基因表达综合数据库 GEO 的接口程序。

2、下载芯片数据

教程中我们使用 Dr Andrew Browning 发表的数据集 GSE20986。HUVECs(人脐静脉内皮细胞)是从人胎儿脐带血中提取出来的,通常用来研究内皮细胞的病理生理机制。这个实验设计中,从捐献者的眼组织中提取的虹膜、视网膜、脉络膜微血管内皮细胞用来和 HUVEC 细胞进行比对,以便考查 HUVEC 细胞能否替代其他细胞作为研究眼科疾病的样本。 GEO 页面同时也包含了关于本实验研究的其他信息。对于每组样本有三次测量,样品分成四组 iris, retina, HUVEC, choroidal 。

实验平台是 GPL570 -- GEO 数据库对人类转录组芯片 Affymetrix Human Genome U133 Plus 2.0 Array 的缩写。通过 GSM 链接 GSM524662,我们可以得到各个芯片的更多实验条件信息。同一个实验设计中的不同芯片的实验条件应该是相同的。不同细胞系的提取条件,细胞生长条件,RNA 提取程序,RNA 处理程序,RNA 与探针杂交条件,用哪种仪器扫描芯片,这些数据都以符合 MIAME 标准的形式存储着。

对于每一个芯片,数据表中存储着探针组和对应探针组标准化之后的基因表达量值。表头中提供了表达量值标准化所用的算法。本教程中使用 GC-RMA 算法进行数据标准化,关于 GC-RMA 算法的详细细节可以参考这篇文献

2.1 下载原始数据

首先,我们从 GEO 数据库下载原始数据,导入 GEOquery 包,用它下载原始数据,下载的原始数据约 53MB。

# 先设置我们的工作路径
> dir.create('D:/TCGA/microarray_analysis',recursive = T)
> setwd('D:/TCGA/microarray_analysis')
> getwd()
[1] "D:/TCGA/microarray_analysis"
# 下载数据
> library(GEOquery)
> getGEOSuppFiles("GSE20986")
# 查看下载好的文件
> list.files('GSE20986')
[1] "GSE20986_RAW.tar"     # 可以看到下载了一个打包文件
> setwd('GSE20986')
> getwd()
[1] "D:/TCGA/microarray_analysis/GSE20986" 
> untar('GSE20986_RAW.tar',exdir = 'data')  # 解包文件到data目录下
> setwd('data')
> getwd()
[1] "D:/TCGA/microarray_analysis/GSE20986/data"  # 当前的工作目录
# 查看解包后的文件,可以看到共12个压缩文件,每个样本一个
> list.files()
 [1] "GSM524662.CEL.gz" "GSM524663.CEL.gz" "GSM524664.CEL.gz" "GSM524665.CEL.gz" "GSM524666.CEL.gz" "GSM524667.CEL.gz"
 [7] "GSM524668.CEL.gz" "GSM524669.CEL.gz" "GSM524670.CEL.gz" "GSM524671.CEL.gz" "GSM524672.CEL.gz" "GSM524673.CEL.gz"
# 将这些文件进行解压缩
> cels <- list.files() ; sapply(cels, gunzip)
GSM524662.CEL.gz GSM524663.CEL.gz GSM524664.CEL.gz GSM524665.CEL.gz GSM524666.CEL.gz GSM524667.CEL.gz GSM524668.CEL.gz 
        13555726         13555055         13555639         13560122         13555663         13557614         13556090 
GSM524669.CEL.gz GSM524670.CEL.gz GSM524671.CEL.gz GSM524672.CEL.gz GSM524673.CEL.gz 
        13560054         13555971         13554926         13555042         13555290 
# 查看解压后的文件
> list.files()
 [1] "GSM524662.CEL" "GSM524663.CEL" "GSM524664.CEL" "GSM524665.CEL" "GSM524666.CEL" "GSM524667.CEL" "GSM524668.CEL"
 [8] "GSM524669.CEL" "GSM524670.CEL" "GSM524671.CEL" "GSM524672.CEL" "GSM524673.CEL"

Affymetrix的探针(proble)一般是长为25碱基的寡聚核苷酸;探针总是以perfect match 和mismatch成对出现,其信号值称为PM和MM,成对的perfect match 和mismatch有一个共同的affyID。
CEL文件:信号值和定位信息。
CDF文件:探针对在芯片上的定位信息。

当然,如果没有特殊要求,也可直接使用GEOquery包中的getGEO方法直接下载处理好的表达矩阵:

> gse20986 <- getGEO("GSE20986", destdir=".")   # 会下载处理好的表达矩阵 

3、芯片实验信息整理

在对数据进行分析之前,我们需要先整理好实验设计信息。这其实就是一个文本文件,包含芯片名字、此芯片上杂交的样本名字。为了方便在 R 中 使用 simpleaffy 包读取实验信息文本文件,需要先编辑好格式:

# windows下Rstudio里面自带的terminal具有部分linux的终端功能,可以借用一下
sxuan@DESKTOP-GNA2EAF  /d/TCGA/microarray_analysis/GSE20986/data
$ ls -1 *.CEL > finame
sxuan@DESKTOP-GNA2EAF  /d/TCGA/microarray_analysis/GSE20986/data
$ awk 'BEGIN{OFS="\t";print "Name","Filename","Target"}{print $1,$1}' finame > phenodata.txt
sxuan@DESKTOP-GNA2EAF  /d/TCGA/microarray_analysis/GSE20986/data
$ cat phenodata.txt
Name    Filename        Target
GSM524662.CEL   GSM524662.CEL
GSM524663.CEL   GSM524663.CEL
GSM524664.CEL   GSM524664.CEL
GSM524665.CEL   GSM524665.CEL
GSM524666.CEL   GSM524666.CEL
GSM524667.CEL   GSM524667.CEL
GSM524668.CEL   GSM524668.CEL
GSM524669.CEL   GSM524669.CEL
GSM524670.CEL   GSM524670.CEL
GSM524671.CEL   GSM524671.CEL
GSM524672.CEL   GSM524672.CEL
GSM524673.CEL   GSM524673.CEL

最终的实验信息文本需要包含三列数据(用 tab 分隔),分别是 Name, FileName, Target。本教程中 Name 和 FileName 这两栏是相同的,当然 Name 这一栏可以用更加容易理解的名字代替。
Target 这一栏数据是芯片上的样本标签,例如 iris, retina, HUVEC, choroidal,这些标签定义了那些数据是生物学重复以便后面的分析。具体的信息可以在GEO数据库样本信息中找到,如下图。

image.png

最后的实验信息文本文件如下:

sxuan@DESKTOP-GNA2EAF  /d/TCGA/microarray_analysis/GSE20986/data
$ cat phenodata.txt
Name    Filename        Target
GSM524662.CEL   GSM524662.CEL   iris
GSM524663.CEL   GSM524663.CEL   retina
GSM524664.CEL   GSM524664.CEL   retina
GSM524665.CEL   GSM524665.CEL   iris
GSM524666.CEL   GSM524666.CEL   retina
GSM524667.CEL   GSM524667.CEL   iris
GSM524668.CEL   GSM524668.CEL   choroid
GSM524669.CEL   GSM524669.CEL   choroid
GSM524670.CEL   GSM524670.CEL   choroid
GSM524671.CEL   GSM524671.CEL   huvec
GSM524672.CEL   GSM524672.CEL   huvec
GSM524673.CEL   GSM524673.CEL   huvec

4、载入数据并对其进行标准化

需要先安装 simpleaffy 包,simpleaffy 包提供了处理 CEL 数据的程序,可以对 CEL 数据进行标准化同时导入实验信息(即前一步中整理好的实验信息文本文件内容),导入数据到 R 变量 celfiles 中:

# 中间可能会有报错,按照报错提示解决即可
> biocLite("simpleaffy")
> library(simpleaffy)
> celfiles <- read.affy(covdesc='phenodata.txt', path='.')

你可以通过输入 ‘celfiles’ 来确定数据导入成功并添加芯片注释(第一次输入 ‘celfiles’ 的时候会进行注释):

> celfiles
installing the source package ‘hgu133plus2cdf’

trying URL 'https://bioconductor.org/packages/3.6/data/annotation/src/contrib/hgu133plus2cdf_2.18.0.tar.gz'
Content type 'application/x-gzip' length 4353300 bytes (4.2 MB)
downloaded 4.2 MB

* installing *source* package 'hgu133plus2cdf' ...
** R
** data
** preparing package for lazy loading
Warning: replacing previous import 'AnnotationDbi::tail' by 'utils::tail' when loading 'hgu133plus2cdf'
Warning: replacing previous import 'AnnotationDbi::head' by 'utils::head' when loading 'hgu133plus2cdf'
** help
*** installing help indices
  converting help for package 'hgu133plus2cdf'
    finding HTML links ... 好了
    geometry                                html  
    hgu133plus2cdf                          html  
    hgu133plus2dim                          html  
** building package indices
** testing if installed package can be loaded
*** arch - i386
Warning: replacing previous import 'AnnotationDbi::head' by 'utils::head' when loading 'hgu133plus2cdf'
Warning: replacing previous import 'AnnotationDbi::tail' by 'utils::tail' when loading 'hgu133plus2cdf'
*** arch - x64
Warning: replacing previous import 'AnnotationDbi::tail' by 'utils::tail' when loading 'hgu133plus2cdf'
Warning: replacing previous import 'AnnotationDbi::head' by 'utils::head' when loading 'hgu133plus2cdf'
* DONE (hgu133plus2cdf)
In R CMD INSTALL

The downloaded source packages are in
    ‘C:\Users\sxuan\AppData\Local\Temp\RtmpItQIXU\downloaded_packages’

AffyBatch object
size of arrays=1164x1164 features (21 kb)
cdf=HG-U133_Plus_2 (54675 affyids)
number of samples=12
number of genes=54675
annotation=hgu133plus2
notes=
Warning messages:
1: replacing previous import ‘AnnotationDbi::tail’ by ‘utils::tail’ when loading ‘hgu133plus2cdf’ 
2: replacing previous import ‘AnnotationDbi::head’ by ‘utils::head’ when loading ‘hgu133plus2cdf’ 

现在我们需要对数据进行标准化,使用 GC-RMA 算法对 GEO 数据库中的数据进行标准化,第一次运行的时候需要下载一些其他的必要文件:

> celfiles.gcrma <- gcrma(celfiles)
Adjusting for optical effect............Done.
Computing affinities[1] "Checking to see if your internet connection works..."
installing the source package ‘hgu133plus2probe’

trying URL 'https://bioconductor.org/packages/3.6/data/annotation/src/contrib/hgu133plus2probe_2.18.0.tar.gz'
... ... # 这里省略了一些下载信息

.Done.
Adjusting for non-specific binding............Done.
Normalizing
Calculating Expression

如果你想看标准化之后的数据,输入 celfiles.gcrma, 你会发现提示已经不是 AffyBatch object 了,而是 ExpressionSet object,是已经标准化了的数据:

> celfiles.gcrma
ExpressionSet (storageMode: lockedEnvironment)
assayData: 54675 features, 12 samples 
  element names: exprs 
protocolData
  sampleNames: GSM524662.CEL GSM524663.CEL ... GSM524673.CEL (12 total)
  varLabels: ScanDate
  varMetadata: labelDescription
phenoData
  sampleNames: GSM524662.CEL GSM524663.CEL ... GSM524673.CEL (12 total)
  varLabels: sample Filename Target
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
Annotation: hgu133plus2 

5、芯片数据可视化

再进行下一步的数据分析之前,我们有必要对数据质量进行检查,确保没有其他的问题。首先,可以通过对标准化之前和之后的数据画箱线图来检查 GC-RMA 标准化的效果:

> # 载入色彩包
> library(RColorBrewer)
> # 设置调色板
> cols <- brewer.pal(8, "Set1")
> # 对标准化之前的探针信号强度做箱线图
> boxplot(celfiles, col=cols)
> # 对标准化之后的探针信号强度做箱线图,需要先安装 affyPLM 包,以便解析 celfiles.gcrma 数据
> biocLite("affyPLM")
> library(affyPLM)
> boxplot(celfiles.gcrma, col=cols)
> # 标准化前后的箱线图会有些变化
> # 但是密度曲线图看起来更直观一些
> # 对标准化之前的数据做密度曲线图
> hist(celfiles, col=cols)
> # 对标准化之后的数据做密度曲线图
> hist(celfiles.gcrma, col=cols)

数据标准化之前的箱线图

数据标准化之后的箱线图

数据标准化之前的密度图

数据标准化之后的密度图

通过这些图我们可以看出这12张芯片数据之间差异不大,标准化处理将所有芯片信号强度标准化到具有类似分布特征的区间内。为了更详细地了解芯片探针信号强度,我们可以使用 affyPLM 对单个芯片 CEL 数据进行可视化。

> # 从 CEL 文件读取探针信号强度:
> celfiles.qc <- fitPLM(celfiles)
> # 对芯片 GSM24662.CEL 信号进行可视化:
> image(celfiles.qc, which=1, add.legend=TRUE)
> # 对芯片 GSM524665.CEL 进行可视化
> # 这张芯片数据有些人为误差
> image(celfiles.qc, which=4, add.legend=TRUE)
> # affyPLM 包还可以画箱线图
> # RLE (Relative Log Expression 相对表达量取对数) 图中
> # 所有的值都应该接近于零。 GSM524665.CEL 芯片数据由于有人为误差而例外。
> RLE(celfiles.qc, main="RLE")
> # 也可以用 NUSE (Normalised Unscaled Standard Errors)作图比较.
> # 对于绝大部分基因,标准差的中位数应该是1。
> # 芯片 GSM524665.CEL 在这个图中,同样是一个例外
> NUSE(celfiles.qc, main="NUSE")
单个芯片AffyPLM信号图

存在人为误差的单个芯片AffyPLM信号图

affyPLM包画箱线图

cel数据的NUSE图

我们还可以通过层次聚类来查看样本之间的关系:

> eset <- exprs(celfiles.gcrma)
> distance <- dist(t(eset),method="maximum")
> clusters <- hclust(distance)
> plot(clusters)
CEL数据的层次聚类图

图形显示,与其他眼组织相比 HUVEC 样品是单独的一组,表现出组织类型聚集的一些特征,另外 GSM524665.CEL 数据在此图中并不显示为异常值。

6、数据质量控制

现在我们可以对数据进行分析了,分析的第一步就是要过滤掉数据中的无用数据,例如作为内参的探针数据,基因表达无明显变化的数据(在差异表达统计时也会被过滤掉),信号值与背景信号差不多的探针数据。
下面的 nsFilter 参数是为了不删除没有 Entrez Gene ID 的位点,保留有重复 Entrez Gene ID 的位点:

> celfiles.filtered <- nsFilter(celfiles.gcrma, require.entrez=FALSE, remove.dupEntrez=FALSE)
> # 哪些位点被过滤掉了?为什么?
> celfiles.filtered$filter.log
$numLowVar
[1] 27307

$feature.exclude
[1] 62

我们可以看出有 27307 个探针位点因为无明显表达差异(LowVar)被过滤掉,有 62 个探针位点因为是内参而被过滤掉。

7、查找有表达差异的探针位点

现在有了过滤之后的数据,我们就可以用 limma 包进行差异表达分析了。首先,我们要提取样本的信息:

> samples <- celfiles.gcrma$Target
> # 检查数据的分组信息
> samples
[1] "iris" "retina" "retina" "iris" "retina" "iris" "choroid"
[8] "choroid" "choroid" "huvec" "huvec" "huvec"
> # 将分组数据转换为因子类型变量
> samples <- as.factor(samples)
> # 检查转换的因子变量
> samples
[1] iris retina retina iris retina iris choroid choroid choroid
[10] huvec huvec huvec
Levels: choroid huvec iris retina
> # 设置实验分组
> design <- model.matrix(~0 + samples)
> colnames(design) <- c("choroid", "huvec", "iris", "retina")
> # 检查实验分组
> design
choroid huvec iris retina
1 0 0 1 0
2 0 0 0 1
3 0 0 0 1
4 0 0 1 0
5 0 0 0 1
6 0 0 1 0
7 1 0 0 0
8 1 0 0 0
9 1 0 0 0
10 0 1 0 0
11 0 1 0 0
12 0 1 0 0
attr(,"assign")
[1] 1 1 1 1
attr(,"contrasts")
attr(,"contrasts")$samples
[1] "contr.treatment"

现在我们将芯片数据进行了标准化和过滤,也有样品分组和实验分组信息,可以将数据导入 limma 包进行差异表达分析了:

> library(limma)
> # 将线性模型拟合到过滤之后的表达数据集上
> fit <- lmFit(exprs(celfiles.filtered$eset), design)
> # 建立对比矩阵以比较组织和细胞系
> contrast.matrix <- makeContrasts(huvec_choroid = huvec - choroid, huvec_retina = huvec - retina, huvec_iris <- huvec - iris, levels=design)
> # 检查对比矩阵
> contrast.matrix
Contrasts
Levels huvec_choroid huvec_retina huvec_iris
choroid -1 0 0
huvec 1 1 1
iris 0 0 -1
retina 0 -1 0
> # 现在将对比矩阵与线性模型拟合,比较不同细胞系的表达数据
> huvec_fits <- contrasts.fit(fit, contrast.matrix)
> # 使用经验贝叶斯算法计算差异表达基因的显著性
> huvec_ebFit <- eBayes(huvec_fits)
> # 返回对应比对矩阵 top 10 的结果
> # coef=1 是 huvec_choroid 比对矩阵, coef=2 是 huvec_retina 比对矩阵
> topTable(huvec_ebFit, number=10, coef=1)
ID logFC AveExpr t P.Value adj.P.Val
6147 204779_s_at 7.367947 4.171874 72.77016 3.290669e-15 8.985500e-11
7292 207016_s_at 6.934796 4.027229 57.37259 3.712060e-14 5.068076e-10
8741 209631_s_at 5.193313 4.003541 51.22423 1.177337e-13 1.071612e-09
26309 242809_at 6.433514 4.167462 48.52518 2.042404e-13 1.394247e-09
6828 205893_at 4.480463 3.544350 40.59376 1.253534e-12 6.845801e-09
20232 227377_at 3.670688 3.209217 36.03427 4.200854e-12 1.911809e-08
6222 204882_at -5.351976 6.512018 -34.70239 6.154318e-12 2.400711e-08
27051 38149_at -5.051906 6.482418 -31.44098 1.672263e-11 5.282592e-08
6663 205576_at 6.586372 4.139236 31.31584 1.741131e-11 5.282592e-08
6589 205453_at 3.623706 3.210306 30.72793 2.109110e-11 5.759136e-08
B
6147 20.25563
7292 19.44681
8741 18.96282
26309 18.70767
6828 17.75331
20232 17.01960
6222 16.77196
27051 16.08854
6663 16.05990
6589 15.92277

分析结果的各列数据含义:
第一列是探针组在表达矩阵中的行号; # 有的没有此列
第二列“ID” 是探针组的 AffymatrixID;
第三列“logFC”是两组表达值之间以2为底对数化的的变化倍数(Fold change, FC),由于基因表达矩阵本身已经取了对数,这里实际上只是两组基因表达值均值之差;
第四列“AveExpr”是该探针组所在所有样品中的平均表达值;
第五列“t”是贝叶斯调整后的两组表达值间 T 检验中的 t 值;
第六列“P.Value”是贝叶斯检验得到的 P 值;
第七列“adj.P.Val”是调整后的 P 值;
第八列“B”是经验贝叶斯得到的标准差的对数化值。

如果要设置一个倍数变化阈值,并查看不同阈值返回了多少基因,可以使用 topTable 的 lfc 参数,参数设置为 5,4,3,2 时返回的基因个数:

> nrow(topTable(huvec_ebFit,coef=1, number=10000, lfc=5))
[1] 88
> nrow(topTable(huvec_ebFit,coef=1, number=10000, lfc=4))
[1] 194
> nrow(topTable(huvec_ebFit,coef=1, number=10000, lfc=3))
[1] 386
> nrow(topTable(huvec_ebFit,coef=1, number=10000, lfc=2))
[1] 1016
> nrow(topTable(huvec_ebFit,coef=1, number=10000, lfc=1))
[1] 4025
> probeset.list <- topTable(huvec_ebFit, coef=1, number=10000, lfc=4)
> head(probeset.list)
                logFC  AveExpr         t      P.Value    adj.P.Val        B
204779_s_at  7.367790 4.171707  72.77347 3.284937e-15 8.969850e-11 20.25762
207016_s_at  6.936667 4.027733  57.39252 3.694641e-14 5.044293e-10 19.44987
209631_s_at  5.192949 4.003992  51.24892 1.170273e-13 1.065182e-09 18.96660
242809_at    6.433238 4.168870  48.51842 2.043082e-13 1.394710e-09 18.70852
205893_at    4.480331 3.543714  40.56477 1.261400e-12 6.888757e-09 17.75050
204882_at   -5.353547 6.513690 -34.70646 6.141288e-12 2.395629e-08 16.77396

9、注释差异分析结果的基因ID

为了将探针集注释上基因 ID (转换为geneID)我们需要先安装一些数据库的包和注释的包,之后可以提取 topTable 中的探针 ID 并注释上基因 ID:

> biocLite("hgu133plus2.db")
> library(hgu133plus2.db)
> library(annotate)
> gene.symbols <- getSYMBOL(rownames(probeset.list), "hgu133plus2")
> results <- cbind(gene.symbols, probeset.list)
> head(results)
            gene.symbols     logFC  AveExpr         t      P.Value    adj.P.Val        B
204779_s_at        HOXB7  7.367790 4.171707  72.77347 3.284937e-15 8.969850e-11 20.25762
207016_s_at         <NA>  6.936667 4.027733  57.39252 3.694641e-14 5.044293e-10 19.44987
209631_s_at         <NA>  5.192949 4.003992  51.24892 1.170273e-13 1.065182e-09 18.96660
242809_at         IL1RL1  6.433238 4.168870  48.51842 2.043082e-13 1.394710e-09 18.70852
205893_at          NLGN1  4.480331 3.543714  40.56477 1.261400e-12 6.888757e-09 17.75050
204882_at       ARHGAP25 -5.353547 6.513690 -34.70646 6.141288e-12 2.395629e-08 16.77396
# 可以看到这里有一些芯片ID已经找不到对应的基因ID了,我们将这些失败的提出来先
> trans.failed <- results[is.na(results$gene.symbols),]
> head(trans.failed)
             gene.symbols     logFC  AveExpr         t      P.Value    adj.P.Val         B
207016_s_at          <NA>  6.936667 4.027733  57.39252 3.694641e-14 5.044293e-10 19.449872
209631_s_at          <NA>  5.192949 4.003992  51.24892 1.170273e-13 1.065182e-09 18.966602
243154_at            <NA>  4.213968 3.476199  28.24818 4.932212e-11 1.035992e-07 15.294507
209994_s_at          <NA> -5.949092 7.766907 -19.86274 1.695876e-09 1.403261e-06 12.349999
1556314_a_at         <NA> -6.200352 7.680901 -18.81114 2.916279e-09 2.041844e-06 11.859483
240466_at            <NA>  4.671497 4.946474  14.78163 3.156679e-08 1.134161e-05  9.610741
# 看下有多少行失败的
> nrow(trans.failed)
[1] 16

下面我们使用另一种方法来进行注释探针ID,虽然也是使用annotate包,这里虽然探针都注释到的比上面多,但有的一个探针注释到了多个ID:

# 下载芯片平台对应的数据包
 > biocLite("hgu133plus2.db")
> library("annotate")
> probes <- as.character(rownames(probeset.list))
> out <- select(hgu133plus2.db, probes,"SYMBOL")  
'select()' returned 1:many mapping between keys and columns   # 表示有的探针注释到了多个基因ID
> head(out)
      PROBEID       SYMBOL
1 204779_s_at        HOXB7
2 207016_s_at      ALDH1A2
3 207016_s_at LOC101928635
4 209631_s_at        GPR37
5 209631_s_at       SEL1L2
6   242809_at       IL1RL1
> probeset.list$PROBEID <- rownames(probeset.list)
> results.final <- merge(out, probeset.list, by="PROBEID", sort=F) 
> head(results.final)
      PROBEID       SYMBOL    logFC  AveExpr        t      P.Value    adj.P.Val        B
1 204779_s_at        HOXB7 7.367790 4.171707 72.77347 3.284937e-15 8.969850e-11 20.25762
2 207016_s_at      ALDH1A2 6.936667 4.027733 57.39252 3.694641e-14 5.044293e-10 19.44987
3 207016_s_at LOC101928635 6.936667 4.027733 57.39252 3.694641e-14 5.044293e-10 19.44987
4 209631_s_at        GPR37 5.192949 4.003992 51.24892 1.170273e-13 1.065182e-09 18.96660
5 209631_s_at       SEL1L2 5.192949 4.003992 51.24892 1.170273e-13 1.065182e-09 18.96660
6   242809_at       IL1RL1 6.433238 4.168870 48.51842 2.043082e-13 1.394710e-09 18.70852

> nrow(probeset.list);nrow(results.final)
[1] 194
[1] 222

查看一下两种方法注释到结果的区别:

>  dupID <- results.final[duplicated(results.final$PROBEID),]; nrow(dupID)
[1] 28
> b<- results.final[is.na(results.final$SYMBOL),]; b
        PROBEID SYMBOL     logFC  AveExpr         t      P.Value    adj.P.Val         B
13    243154_at   <NA>  4.213968 3.476199  28.24818 4.932212e-11 1.035992e-07 15.294507
32 1556314_a_at   <NA> -6.200352 7.680901 -18.81114 2.916279e-09 2.041844e-06 11.859483
49    240466_at   <NA>  4.671497 4.946474  14.78163 3.156679e-08 1.134161e-05  9.610741
# 从上面可以看到仍然是有三个探针没有注释到
# 将第二种方法一对多注释的和未注释到的合并起来
> a<-as.factor(dupID$PROBEID);  f <- as.factor(dupID$PROBEID)
> c <- c(f, as.character(b$PROBEID))
> d<-data.frame(c);d
              c
1   204670_x_at
2   207016_s_at
3   208306_x_at
4   209312_x_at
5   209631_s_at
6   209994_s_at
7   211796_s_at
8   215193_x_at
9     218805_at
10    221974_at
11    226558_at
12  229748_x_at
13     64064_at
14    243154_at
15 1556314_a_at
16    240466_at

比较后发现这两种方法出现问题的16个探针是相同的,因此直接使用第一种方法getSYMBOL()更加简单。
最后,将注释好的差异表达基因写入文件进行后续分析。

# 将为注释到的探针移除
> nrow(results);results<-na.omit(results);nrow(results)
[1] 194
[1] 178
> write.table(results, file="resluts.txt", sep="\t",row.names = F)

参考:
http://bioinformatics.knowledgeblog.org/2011/06/20/analysing-microarray-data-in-bioconductor/
Bioconductor 分析芯片数据教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容