Affymetrix芯片分析:获取差异表达基因系列一

library(affy)

library(tcltk)

filters<-matrix(c("CEL file", ".[Cc][Ee][Ll]", "All",".*"), ncol = 2,byrow = T)
cel.files <-tk_choose.files(caption = "Select CELs", multi =TRUE,filters= filters, index = 1)

data.raw<-ReadAffy(filenames = cel.files)

 
n.cel <-length(cel.files)
sampleNames(data.raw)


==============================================
sampleNames(data.raw)<-paste("S",1:n.cel,sep='')
pData(data.raw)$treatment <-rep(c("0h", "1h","24h", "7d"),each=2)

#生成0h,1h,24h,7d四个值依次重复两次所组成的数列,数列命名为treatment

pData(data.raw)

#指针pData函数读取文件
==============================================

1、计算基因表达量
eset.rma <-rma(data.raw)

eset.mas5<-mas5(data.raw)

%%注意rma的eset结果是经过对数变换的,而mas5的eset结果是原始信号强度。虽然表达量是用对数变换的信号值表示的,但是有些计算过程要用到未经变换的原始值,应该把它们都计算出来:

emat.rma.log2<-exprs(eset.rma)
emat.mas5.nologs <-exprs(eset.mas5)

emat.rma.nologs<-2^emat.rma.log2
emat.mas5.log2 <-log2(emat.mas5.nologs)

 

results.rma<-data.frame((emat.rma.log2[,c(1,3,5,7)] + emat.rma.log2[,c(2,4,6,8)])/2)

#计算平均值,并转换为数据框格式#计算表达量差异倍数

results.rma$fc.1h<- results.rma[,2]-results.rma[,1]
results.rma$fc.24h <- results.rma[,3]-results.rma[,1]
results.rma$fc.7d <- results.rma[,4]-results.rma[,1]

subset.logic <-results.rma$fc.7d>0
subset.data <- results.rma[subset.logic,]

#要注意的是逻辑向量的长度要和相应维度的数据长度一致,逻辑向量中为TRUE的就保留,FALSE的就丢弃。
head(subset.logic)

 

 

2、选取表达基因

%选取“表达”基因的方法常见的有两种,一是使用genefilter软件包,另外一种是调用affy包的mas5calls()函数。使用 genefilter需要设定筛选阈值,不同的人可能有不同的标准。mas5calls方法使用探针水平数据(AffyBatch类型数据)进行处理,一般使用没经过预处理的芯片数据通用性强些,其他参数用默认就可以。

data.mas5calls <-mas5calls(data.raw)

eset.mas5calls<-exprs(data.mas5calls)

#继续用exprs计算“表达”量,得到的数据只有三个值P/M/A。对于这三个值的具体解释可以用?mas5calls查看帮助。P为present,A为absent,M为marginal(临界值)。

AP<-apply(eset.mas5calls, 1, function(x) any(x=="P"))

#把至少一个芯片中有表达的基因选出来!!!!
present.probes <-names(AP[AP])
paste(length(present.probes),"/",length(AP))
results.present <- results.rma[present.probes,]

#present.probes是名称向量,用它进行数据子集提取。


3、获取差异表达基因
%生物学数据分析时的"差异"应该有两个意思,一是统计学上的差异,另外一个是生物学上的差异。一个基因在两个条件下的表达量分别有3个测量值:99,100,101 和 102,103,104。统计上两种条件下的基因表达数值是有差异的,后者比前者表达量要大。但生物学上有意义吗?未必。按平均值计算表达变化上升了3%,能产生什么样的生物学效应?这得看是什么基因了。所以差异表达基因的选取一般设置至少两个阈值:基因表达变化量和统计显著性量度(p值、q值等)。

3.1、t-测验

%经常使用的筛选阈值是表达量变化超过2倍,即|log2(fc)|>=log(2)。

==================================================

apply(abs(results.present[,5:7]),2, max)
%apply是一个很有用的函数,它对数据按某个维度批量应用一个函数进行计算。第一个参数为向量或矩阵(或者是能转成向量或矩阵的数据,如数据框),第三个参数表示要使用的函数,第二个参数为应用的维度。上面语句的意思是对数据 abs(results.present[,5:7]) 按列(第二维)使用统计函数max(计算最大值)。表达变化超过2倍的基因共有842个:
===========================================
sum(abs(results.present[,"fc.7d"])>=log2(2))
## [1] 842, 选出这842个基因:

results.st <- results.present[abs(results.present$fc.7d)>=log2(2),]
sel.genes <- row.names(results.st)

p.value<- apply(emat.rma.log2[sel.genes,], 1,function(x){t.test(x[1:2], x[7:8])$p.value})
results.st$p.value <- p.value
results.st <- results.st[, c(1,4,7,8)]
results.st <- results.st[p.value<0.05,]
head(results.st, 2)
##              S1    S7 fc.7d p.value
## 245042_at 8.153 7.021 -1.133 0.01004
## 245088_at 7.041 5.419 -1.622 0.03381
## t测验,并选出p<0.05的差异表达基因:

 

3.2 SAM(Significance Analysis of Microarrays)
library(BiocInstaller)
biocLite("samr")
library(samr)
samfit <- SAM(emat.rma.nologs[present.probes,c(1,2,7,8)],c(1,1,2,2), resp.type="Twoclass unpaired", genenames=present.probes)
SAM函数返回值一个列表结构,可以自己用?SAM看看。差异表达基因的数据在siggenes.table中,也是一个列表结构:
str(samfit$siggenes.table)

%上调基因在siggenes.table的genes.up中,下调基因在genes.lo中。从上面的数据结构显示还可以看到差异表达基因的数量: ngenes.up和ngenes.lo。提取差异表达基因数据:

results.sam<-data.frame(rbind(samfit$siggenes.table$genes.up,samfit$siggenes.table$genes.lo),
 row.names=1, stringsAsFactors=FALSE)
for(i in 1:ncol(results.sam)) results.sam[,i] <- as.numeric(results.sam[,i])
head(results.sam, 2)

3.3、Wilcoxon's signed-rank test
%这个方法发表在 Liu, W.-m. etal, Analysis of high density expression microarrays with signed-rank callalgorithms. Bioinformatics, 2002, 18, 1593-1599。R软件包simpleaffy的detection.p.val函数有实现,可以通过pairwise.comparison函数调用:

library(simpleaffy)
#注意下面语句中的数据顺序
sa.fit <- pairwise.comparison(eset.rma, "treatment",c("7d", "0h"))
%pairwise.comparison返回的数据为simpleaffy自定义的"PairComp"类型,提取数据要用它专门的函数:平均值用means函数获得,变化倍数(log2)用fc函数获得,t测验的p值用tt函数获得:

results.sa <- data.frame(means(sa.fit), fc(sa.fit), tt(sa.fit))
#选择有表达的基因
results.sa <- results.sa[present.probes,]
head(results.sa, 2)
##             X7d   X0h fc.sa.fit.tt.sa.fit.
## 244901_at 4.047 4.203    -0.1562    0.43982
## 244902_at 3.938 4.295    -0.3570    0.05824

应用表达倍数筛选得到表达倍数超过2倍的基因数量有862个,应用p值筛选后得到562个差异表达基因:
results.sa <- results.sa[abs(results.sa$fold.change)>=log2(2), ];nrow(results.sa)
## [1] 862
results.sa <- results.sa[results.sa$p.val<0.05,]; nrow(results.sa)
## [1] 562


3.4、Moderated Tstatistic——经验贝叶斯
%这种方法在R软件包limma里面实现得最好。limma最初主要用于双色(双通道)芯片的处理,现在不仅支持单色芯片处理,新版还添加了对RNAseq数据的支持,很值得学习使用。安装方法同前面其他Bioconductor软件包的安装。载入limm软件包后可以用limmaUsersGuide()函数获取pdf格式的帮助文档。limma需要先产生一个design矩阵,用于描述RNA样品:


library(limma)
treatment<- factor(pData(eset.rma)$treatment)
design <- model.matrix(~ 0 + treatment)
colnames(design) <- c("C0h", "T1h", "T24h","T7d")
##   C0h T1h T24h T7d
## 1   1   0    0   0
## 2   1   0    0   0
## 3   0   1    0   0
## 4   0   1    0   0
## 5   0   0    1   0
## 6   0   0    1   0
## 7   0   0    0   1
## 8   0   0    0   1
##可以看到:矩阵的每一行代表一张芯片,每一列代表一种RNA来源(或处理)。此外,你可能还需要另外一个矩阵,用来说明你要进行哪些样品间的对比分析:
contrast.matrix <- makeContrasts(T1h-C0h, T24h-C0h, T7d-C0h, levels=design)
contrast.matrix
##       Contrasts
## Levels T1h - C0h T24h - C0h T7d - C0h
##   C0h         -1         -1       -1
##   T1h          1         0         0
##   T24h         0         1         0
##   T7d          0         0         1

fit <- lmFit(eset.rma[present.probes,], design)
fit1 <- contrasts.fit(fit, contrast.matrix)
fit2 <- eBayes(fit1)
#首先进行线性模型拟合,根据对比模型进行差值计算,最后是贝叶斯检验

先统计一下数量。可以看到:对于T7d-C0h比较组(coef=3),表达变化超过2倍(lfc参数)的基因数为842个,而变化超过2倍、p<0.05的基因总数为740个:


nrow(topTable(fit2, coef=3, adjust.method="fdr", lfc=1,number=30000))
## [1] 842
nrow(topTable(fit2, coef=3, adjust.method="fdr", p.value=0.05, lfc=1,number=30000))
## [1] 740
##把toTable函数的返回结果存到其他变量就可以了,它是数据框类型数据,可以用write或write.csv函数保存到文件:

results.lim <- topTable(fit2, coef=3, adjust.method="fdr",p.value=0.05, lfc=1, number=30000)

 

%为什么以上几种方法仅用表达倍数(2倍)筛选得到的数字不大一样?limma和直接计算的结果都是842个,而simpleaffy和SAM为862/861个。这是对eset信号值取对数和求平均值的先后导致的,limma先取对数再求平均值,而simpleaffy和SAM是先求平均值再取对数。


3.5 其他方法:


如Rank products方法,在R软件包RankProd里实现,方法文献为:Breitling R, Armengaud P, Amtmann A, etal. Rank products: a simple, yet powerful, new method to detect differentiallyregulated genes in replicated microarray experiments[J]. FEBS letters, 2004,573(1): 83-92.


最后我们保存部分数据备下次使用:
#所有表达基因的名称
write(present.probes, "genes.expressed.txt")
#处理7天的差异表达基因
write.csv(results.lim, "results.lim.7d.csv")
#emat.rma.log2
write.csv(emat.rma.log2[present.probes,], "emat.rma.log2.csv")
如果要全部结果:
results.lim.all <- topTable(fit2, coef=1:3, adjust.method="fdr",p.value=1, lfc=0, number=30000)
## 仅保存logFC供后面的分析使用
results.lim.all <- results.lim.all[, 1:3]
colnames(results.lim.all) <- c('T1h', 'T24h', 'T7d')
head(results.lim.all, 3)
##                T1h  T24h  T7d
## 254818_at  0.34085 6.024 6.215
## 245998_at -0.13675 3.676 2.778
## 265119_at -0.02536 6.061 4.380
write.csv(results.lim.all, 'results.lim.all.csv')


4、Session Info

sessionInfo()
## R version 3.1.0 (2014-04-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## 
## locale:
##  [1] LC_CTYPE=zh_CN.UTF-8       LC_NUMERIC=C             
##  [3] LC_TIME=zh_CN.UTF-8       LC_COLLATE=zh_CN.UTF-8    
##  [5] LC_MONETARY=zh_CN.UTF-8    LC_MESSAGES=zh_CN.UTF-8  
##  [7] LC_PAPER=zh_CN.UTF-8       LC_NAME=C                
##  [9] LC_ADDRESS=C              LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=zh_CN.UTF-8 LC_IDENTIFICATION=C      
## 
## attached base packages:
## [1] parallel  tcltk     stats     graphics  grDevicesutils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] limma_3.21.1         simpleaffy_2.41.0   gcrma_2.37.0        
##  [4] genefilter_1.47.0    samr_2.0            matrixStats_0.8.14  
##  [7] impute_1.39.0        ath1121501cdf_2.14.0affy_1.43.0         
## [10] Biobase_2.25.0       BiocGenerics_0.11.0 zblog_0.1.0         
## [13] knitr_1.5           
## 
## loaded via a namespace (and not attached):
##  [1] affyio_1.33.0         annotate_1.43.2      AnnotationDbi_1.27.3 
##  [4] BiocInstaller_1.15.2  Biostrings_2.33.3    DBI_0.2-7            
##  [7] evaluate_0.5.3        formatR_0.10         GenomeInfoDb_1.1.2   
## [10] highr_0.3             IRanges_1.99.2       preprocessCore_1.27.0
## [13] R.methodsS3_1.6.1     RSQLite_0.11.4       S4Vectors_0.0.2      
## [16] splines_3.1.0         stats4_3.1.0         stringr_0.6.2        
## [19] survival_2.37-7       tools_3.1.0          XML_3.98-1.1         
## [22] xtable_1.7-3          XVector_0.5.3        zlibbioc_1.11.1实验思路:





你可能感兴趣的:(科研笔记)