一、舉例介紹
本節下載GSE1009數據集,使用limma包進行差異分析舉例。
GSE1009??
樣本量:共6個樣本,其中3個為糖尿病腎病(DN)腎小球樣本,另3個為正常腎小球樣本。
使用芯片:Affymetrix Human Genome U95 Version 2 Array。
平臺:GPL8300。
二、差異分析舉例:
###第一步:GEO數據下載
>setwd("D:\\Rfile")??
#設置工作目錄為D 盤的Rfile文件夾,大家可根據自己需要設置工作目錄。
>rm(list = ls())?
#清除所有變量
>options(stringsAsFactors=F)
#R導入數據時不自動轉換為因子變量
##下面需要安裝GEOquery包,用于下載GEO數據庫的文件,已經安裝GEOquery包不需要重復安裝,直接調用GEOquery包。
#安裝命令如下(本人已經安裝了,所以只給出安裝命令,去掉前面的注釋符號即可安裝):
#if (!requireNamespace("BiocManager", quietly = TRUE))
#install.packages("BiocManager")
#BiocManager::install("GEOquery")
#bioconductor中的包的安裝命令經常更新,如果大家怕安裝命令已經更新了,現在的命令不能運行,可以百度“GEOquerybioconductor”進入主頁,下拉到安裝命令處,將網站上的最新安裝命令復制即可,這就是最新的安裝命令,其他bioconductor中的包的安裝是一樣的道理。具體如下:
##下面是用GEOquery包下載數據
>library(GEOquery)?
#加載GEOquery包
>gset <- getGEO("GSE1009",destdir = ".",AnnotGPL = F,getGPL = F) ???????????????
#下載GSE1009表達矩陣文件并賦值給gset變量,destdir = "."表示下載后的文件放在什么地方,默認為當前工作目錄。AnnotGPL = F表示不下載注釋文件,getGPL = F表示不下載平臺文件。我們這里為了下載速度,就設置成不下載平臺文件和注釋文件。
#下載好后打開D盤,可看到Rfile中有一個“GSE1009_series_matrix.txt.gz”文件。
>save(gset,file = 'GSE1009.gset.Rdata')
#將gset(也就是下載后的GSE1009矩陣文件)保存為R文件,文件名為“GSE1009.gset”方便以后調用。
>gset[["GSE1009_series_matrix.txt.gz"]]@annotation
#查看GSE1009_series_matrix矩陣的平臺文件
>gpl <- getGEO('GPL8300', destdir=".")
#下載這個平臺文件。用于后面基因symbol注釋。
總體先看看上面數據下載代碼:
代碼運行過程及結果:
運行代碼后Rfile中的文件:
###第二步:數據整理(將探針ID給為基因symbol)
>a=gset[[1]]
#提取gset中第一個元素(包含基因表達矩陣和注釋信息),并賦值給變量a
>dat=exprs(a)
#提取a中的表達矩陣并賦值給dat,這時的表達矩陣的基因名字為探針ID
>head(dat)
#展示表達矩陣的前6行,看下數據是否經過log轉換,一般數據在20以內,是經過log轉換的,若有成百上千的數據,表示這個數據還需要進一步log處理。
>ex <- dat
qx <- as.numeric(quantile(ex, c(0., 0.25, 0.5, 0.75, 0.99, 1.0), na.rm=T))
LogC <- (qx[5] > 100) ||
??(qx[6]-qx[1] > 50 && qx[2] > 0) ||
??(qx[2] > 0 && qx[2] < 1 && qx[4] > 1 && qx[4] < 2)
if (LogC) { ex[which(ex <= 0)] <- NA
dat <- log2(ex)
print("log2 transform finished")}else{print("log2 transform not needed")}
#也可以輸入上面這段代碼,如果數據已經經log后,顯示log2 transform not needed;如果數據沒有盡行log,需要log程序按照代碼盡行log轉換,完成后顯示log2 transform finished。
再看看轉換后的數據:
>pd=pData(a)
#查看a的臨床信息,為后面選擇用于分組的變量做準備
>View(pd)
#查看pd
本例中pd共有26個變量(未完全展示),我們可以看到只有title下的字段可以分為正常、疾病,其余變量下的字段都是一樣的,所以我們選擇title字段用于后續分組。
Title變量中的記錄為control 1a....Diabetes 1a.......,中間用空格分割,我們需要提取出Control和Diabetes作為分組,所以需要用字符分割包來實現。
##安裝字符分割包stringr包,命令如下,已經安裝過的可以直接調用,不用重復安裝。
#install.packages("stringr")
>library(stringr)
#調用stringr包
>group_list=str_split(pd$title,' ',simplify = T)[,1]
#把pd中title變量的字段,按照空格分割,為了給大家展示,我們先運行分割代碼,分割后如下圖所示,所以我們選擇分割后的第一列即為分組狀態
>table(group_list)
#計數每一組個數
>gpl1<-Table(gpl)
>save(gpl1,file = 'gpl1.Rdata')
#我們將平臺文件轉為list格式,并賦值給gpl1,將gpl1保存為R文件,方便以后調用。
>colnames(Table(gpl))
#查看平臺文件的列名,我們看到有ID和gene symbol,記住gene symbol在第幾列,我們這里在第11列。
>View(gpl1)
#再了解一下平臺文件的數據,當然這里大家可以直接選擇gene symbol字段也行,主要了解一下symbol中基因symbol值是否只有一個。
我們這里的gene symbol字段中的symbol,有的基因就不止一個名稱,///后面有重名,我們需要第一個名字,所以需要用字符分割包再處理一下,原理同上面處理title一樣。
>gpl1$`Gene Symbol`=str_split(gpl1[,11],'///',simplify = T)[,1]
>probe2symbol_df<-gpl1[,c(1,11)]
#提取平臺文件gpl1中的ID和gene symbol,并賦值給probe2symbol_df
>colnames(probe2symbol_df)=c('probe_id','symbol')
#將列名改為probe_id和symbol
#這兩步是因為我懶,不想再調整代碼,為了方便后面代碼運行,我改的,大家也可以不改。
>length(unique(probe2symbol_df$symbol))
#查看symbol為唯一值的個數
>table(sort(table(probe2symbol_df$symbol)))
#查看每個基因出現n次的個數,我們可以看到,symbol出現一次的基因有7050個,出現2次有1493個。。。
>ids=probe2symbol_df[probe2symbol_df$symbol != '',]
#去掉沒有注釋symbol的探針(其實這里沒有注釋的探針數量即為上面出現次數最多的基因440,也就是說有440個探針沒有symbol)
>ids=probe2symbol_df[probe2symbol_df$probe_id %in% ?rownames(dat),] ??
##%in%用于判斷是否匹配,
#注意這里dat是gset表達矩陣的數據,這一步就是把平臺文件的ID和矩陣中的ID匹配。
>dat=dat[ids$probe_id,]
#取表達矩陣中可以與探針名匹配的那些,去掉無法匹配的表達數據
>ids$mean=apply(dat,1,mean) ?
#ids新建mean這一列,列名為mean,同時對dat這個矩陣按行操作,取每一行(即每個樣本在這個探針上的)的均值,將結果給到mean這一列的每一行,這里也可以改為中位值,median.
>ids=ids[order(ids$symbol,ids$mean,decreasing = T),] ???
#即先按symbol排序,相同的symbol再按照均值從大到小排列,方便后續保留第一個值。
>ids=ids[!duplicated(ids$symbol),] ?
#將symbol這一列取出重復項,'!'為否,即取出不重復的項,去除重復的gene
#取median的話,這樣就保留每個基因最大表達量結果.最后得到n個基因。
>dat=dat[ids$probe_id,]
#新的ids取出probe_id這一列,將dat按照取出的這一列,用他們的每一行組成一個新的dat
>rownames(dat)=ids$symbol ?
#把ids的symbol這一列中的每一行給dat作為dat的行名
>View(dat)
>dat<-dat[-9173,]
但是我們看到矩陣最后一行,是沒有symbol名字的,我們把他去掉,數字自己更改。
>save(dat,group_list,file = 'GSE1009.Rdata')
>write.csv(dat,file="GSE1009expressionmetrix_GSE.csv")
#最后我們把結果保存。下一節會講解差異分析。
現在看看,整體代碼如下:
運行后的Rfile中的文件如下:
整理好的數據如下: