if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("KEGG.db",ask = F,update = F)
BiocManager::install(c("GSEABase","GSVA","clusterProfiler" ),ask = F,update = F)
BiocManager::install(c("GEOquery","limma","impute" ),ask = F,update = F)
BiocManager::install(c("genefu","org.Hs.eg.db","hgu133plus2.db" ),ask = F,update = F)
install.packages('WGCNA')
install.packages(c("FactoMineR", "factoextra"))
install.packages(c("ggplot2", "pheatmap","ggpubr"))
library("FactoMineR")
library("factoextra")
library(GSEABase)
library(GSVA)
library(clusterProfiler)
library(genefu)
library(ggplot2)
library(ggpubr)
library(hgu133plus2.db)
library(limma)
library(org.Hs.eg.db)
library(pheatmap)
setwd("E:/GitHub/Bioinformatics-1000days/day11-GEO/")
f='E:/GitHub/Bioinformatics-1000days/day11-GEO/GSE42872_eSet.Rdata'
library(GEOquery)
if(!file.exists(f)){
gset <- getGEO('GSE42872', destdir=".",
AnnotGPL = F, ## 注释文件
getGPL = F) ## 平台文件
save(gset,file=f) ## 保存到本地
}
下载后加载数据
load('E:/GitHub/Bioinformatics-1000days/day11-GEO/GSE42872_eSet.Rdata') ## 载入数据
class(gset) #查看数据类型
length(gset) #
class(gset[[1]])
gset
获取gset中的表达矩阵数据和临床表型数据
a=gset[[1]] #
dat=exprs(a) # 使用exprs函数取出表达矩阵
boxplot(dat,las=2) # 看一下数据分布的箱线图
pd=pData(a) # 使用pData函数取出表型数据
head(pd) # 看一下表型数据情况
可以看到pd
表型数据的title
中显示了表型的处理情况
title geo_accession status
GSM1052615 A375 cells 24h Control rep1 GSM1052615 Public on May 20 2014
GSM1052616 A375 cells 24h Control rep2 GSM1052616 Public on May 20 2014
GSM1052617 A375 cells 24h Control rep3 GSM1052617 Public on May 20 2014
GSM1052618 A375 cells 24h Vemurafenib rep1 GSM1052618 Public on May 20 2014
GSM1052619 A375 cells 24h Vemurafenib rep2 GSM1052619 Public on May 20 2014
GSM1052620 A375 cells 24h Vemurafenib rep3 GSM1052620 Public on May 20 2014
所以我们就把title中的这个处理分组提取出来
library(stringr)
group_list=str_split(pd$title,' ',simplify = T)[,4] ## title中由于是空格号隔开的,所以分割后,取第四列就是表型处理分组的信息:Control 和 Vemurafenib
table(group_list) ## table()函数 以因子表格的方式,用于计数每个元素出现的次数
#>group_list
#> Control Vemurafenib
#> 3 3
探针注释数据有三种获取方法,法1:直接通过getGEO函数下载GEO上准备好的soft文件注释,法2:各大芯片厂商有的会将芯片注释封装成R包,所以可以下载R注释包来注释芯片,法3:直接去芯片厂商官网下载芯片注释。(比较麻烦)
此处我们直接下载GEO上的soft注释,来作为我们芯片探针的注释
library(GEOquery)
library(tidyverse)
#Download GPL file, put it in the current directory, and load it:
gpl <- getGEO('GPL6244', destdir="E:/GitHub/Bioinformatics-1000days/day11-GEO/")
colnames(Table(gpl)) ## Table函数用于提取soft文件
head(Table(gpl)[,c(1,1:11)]) ## you need to check this , which column do you need
tmp <- Table(gpl) ## gene name is in "//",we should separate them
tmp <- separate(tmp,gene_assignment,into = c("ensembl_id","geneSymbol","other"),sep = "//")
probe2gene=tmp[,c(1,11)]
head(probe2gene)
# library(stringr)
save(probe2gene,file='probe2gene.Rdata') ## 保存芯片探针注释
# load(file='probe2gene.Rdata')
# ids=probe2gene
下载完表达矩阵后,要仔细check一下表达矩阵是否正确,id转换有没有出错(基因和probe_id对应的是对的)
所以就要画一系列的图来看数据的整齐性等等
首先,对所有样本画boxplot 查看样本数据的整齐性
样本数据只要基本都在同一条线上,那么就说明样本之间是可以比较的
PCA图
看PCA图 可以使用ggfortify画图
使用limma包对表达矩阵进行差异基因分析
rm(list = ls())
options(stringsAsFactors = F)
load(file = 'step1-output.Rdata') # 加载上一步处理好的表达矩阵数据和分组信息
library(limma) ## 关于limma的使用 可以参考limmaUsersGuide()来查看使用指南
limma包的说明书里给出过很详细的关于实验设计分组的方法(limmaUsersGuide(),查看P35-P40页)
我们的数据是6个样本,3个是用了药的黑色素瘤细胞,另外3个是未用药的细胞样本
因此这样来设计我们的分组信息
design <- model.matrix(~0+factor(group_list)) # group_list是一个向量的分组信息
# 使用model.matrix来构建分组
colnames(design)=levels(factor(group_list)) # 设置分组的colname
head(design) # 查看分组情况
# Control Vemurafenib
#1 1 0
#2 1 0
#3 1 0
#4 0 1
#5 0 1
#6 0 1
exprSet=dat # 将表达数据赋给exprSet
rownames(design)=colnames(exprSet) # 用样本名给分组信息添加行名
design # 查看分组信息
# Control Vemurafenib
#GSM1052615 1 0
#GSM1052616 1 0
#GSM1052617 1 0
#GSM1052618 0 1
#GSM1052619 0 1
#GSM1052620 0 1
contrast.matrix<-makeContrasts("Vemurafenib-Control", levels = design) # 使用makeContrasts函数构建比对的矩阵分组
contrast.matrix #这个矩阵声明,我们要把 Tumor 组跟 Normal 进行差异分析比较
##step1
fit <- lmFit(exprSet,design)
##step2
fit2 <- contrasts.fit(fit, contrast.matrix)
fit2 <- eBayes(fit2) ## default no trend !!!
##eBayes() with trend=TRUE
##step3
tempOutput = topTable(fit2, coef=1, n=Inf)
nrDEG = na.omit(tempOutput)
#write.csv(nrDEG2,"limma_notrend.results.csv",quote = F)
head(nrDEG)
deg = nrDEG
save(deg,file = 'deg.Rdata')