GEO芯片数据基本分析

news2025/1/16 6:49:29

GEO数据挖掘,表达芯片分析

举例:王同学近期拟通过生物信息学相关软件与数据库来探讨女性非抽烟者非小细胞肺癌预后相关的显著性基因潜在的治疗靶点,他在NCBI上查询到了1套芯片数据GSE19804。请帮助他完成该项目的设计与分析。

一、一般流程

1、找数据,找到GSE编号

2、下载数据:包括表达矩阵、临床信息、分组信息

3、数据探索:分组之间是否有差异,PCA,热图

4、limma差异分析及可视化:P值、logFC、火山图、热图

5、富集分析KEGG、GO

二、安装R包

这是表达芯片分析需要用到的R包,其中有些包需要根据分析对象的不同而替换

options("repos"="https://mirrors.ustc.edu.cn/CRAN/")
if(!require("BiocManager")) install.packages("BiocManager",update = F,ask = F)
options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/")

cran_packages <- c('tidyr',
                   'tibble',
                   'dplyr',
                   'stringr',
                   'ggplot2',
                   'ggpubr',
                   'factoextra',
                   'FactoMineR',
                   'devtools',
                   'patchwork') 
Biocductor_packages <- c('GEOquery',
                         'hgu133plus2.db',#根据需要替换
                         'ggnewscale',
                         "KEGG.db",
                         "limma",
                         "impute",
                         "GSEABase",
                         "GSVA",
                         "clusterProfiler",
                         "org.Hs.eg.db",#根据需要替换
                         "preprocessCore",
                         "enrichplot",
                         "ggplotify")

for (pkg in cran_packages){
  if (! require(pkg,character.only=T) ) {
    install.packages(pkg,ask = F,update = F)
    require(pkg,character.only=T) 
  }
}

for (pkg in Biocductor_packages){
  if (! require(pkg,character.only=T) ) {
    BiocManager::install(pkg,ask = F,update = F)
    require(pkg,character.only=T) 
  }
}

#前面的所有提示和报错都先不要管。主要看这里
for (pkg in c(Biocductor_packages,cran_packages)){
  require(pkg,character.only=T) 
}
#没有error就是成功!
install.packages('tweenr')
library(tweenr)
#哪个报错,就回去安装哪个。如果你没有安装xx包,却提示你xx包不存在,这也正常,是因为复杂的依赖关系,缺啥补啥。
if(!require(AnnoProbe))devtools::install_local("./AnnoProbe-master.zip",upgrade = F)
library(AnnoProbe)

三、下载数据

rm(list=ls())#清空页面
options(stringsAsFactors=F)
f='Gse19804_eSet.Rdata'

if (!requireNamespace("BiocManager",quietly = TRUE))
   install.packages("BiocManager")#下载BiocManager包
if (!requireNamespace("GEOquery",quietly=TRUE))
   BiocManager::install("GEOquery")#下载GEOquery包

library(GEOquery)
if(!file.exists(f)){
  gset<-getGEO('GSE19804',destdir=".",
               AnnotGPL = F,#注释文件
               getGPL = F)  #平台文件
  save(gset,file=f)}        #保存到本地
  
load("GSE19804_eSet.Rdata")
 
class(gset)
length(gset)
gset=gset[[1]]
exp<-exprs(gset)
View(gset)
exp[1:4,1:4]#查看数据,判断是否需要取log2
exp=log2(exp+1)

四、提取信息

提取临床信息:

pd<-pData(gset)

调整pd的行名顺序与exp列名完全一致:

p=identical(rownames(pd),colnames(exp));p
if(!p) exp = exp[,match(rownames(pd),colnames(exp))]

提取芯片平台编号:

gpl_number<-gset@annotation
save(f,pd,gpl_number,file="steploutput.Rdata")

分组,这里按照对照和患者分组,对照在前,患者在后:

library(stringr)
Group<-ifelse(pd$characteristics_ch1 ==  "tissue: paired normal adjacent","non_cancer", "cancer")
save(exp,Group,file="Expreset1.Rdata")

五、数据检验

1、箱线图

rm(list=ls())
options(stringsAsFactors = F)
load(file = "Expreset1.Rdata")
View(exp)
boxplot(exp[,1:100],cex=0.2,col="red")

箱线图查看数据是否有异常值,可以看出成分集中,位于4-8之间,总位数在6左右,此时不需要进行标准化与归一化

在这里插入图片描述
之前做的没有保存,这张是GEO2R上生成得,大体类似

2、PCA主成分分析

首先,需要对数据进行降维,54,675进行降维分类

rm(list=ls())
options(stringsAsFactors = F)
load(file = "Expreset1.Rdata")
exp[1:4,1:4]
exp<-t(exp)#矩阵转置,画PCA图要求行名是样本名,列名是探针名
exp[1:4,1:4]
exp<-as.data.frame(exp)#转换格式为data.frame
exp<-cbind(exp,Group)#cbind横向追加,即将分组信息追加到最后一列

需要安装两个包:

install.packages("FactoMineR")
library("FactoMineR")
install.packages("factoextra")
library("factoextra")

进行降维:

exp.pca<-PCA(exp[,-ncol(exp)],graph = FALSE)#进行降维
head(exp.pca$ind$coord)#查看降维结果

画图:

fviz_pca_ind(exp.pca,
             geom.ind = "point",#只显示点
             col.ind = exp$Group,#按分组划定不同颜色
             palette = c("#00AFBB","#E7B800"),
             addEllipses = TRUE,
             legend.title = "Groups"
)

输出的结果显示,集中程度一般,处于平面维度差异不大,分布不是特别开,两者有重叠的部分。
在这里插入图片描述
备注:这里分组不是很明显,我后面有再试过其他的方法,发现还是这样,如果有人可以指导一下非常感激~

3、层次聚类分析

rm(list=ls())
options(stringsAsFactors = F)
load(file = "Expreset1.Rdata")
exp<-t(exp)
d<-dist(exp)#计算距离
fit.complete<-hclust(d,method='complete')
plot(fit.complete,hang= -1,cex=0.8)

可以看出,基本可以聚成两类,也就是肿瘤组和非肿瘤组。
在这里插入图片描述
在这里插入图片描述

六、探针ID转换为基因ID

1、探针转换为基因ID并合并

rm(list=ls())
options(stringsAsFactors = F)
load(file = "Expreset1.Rdata")
if (!requireNamespace("BiocManager",quietly = TRUE))
    install.packages("BiocManager")
if (!requireNamespace("hgu133plus2.db",quietly=TRUE))
    BiocManager::install("hgu133plus2.db")  
library("hgu133plus2.db")
ids=toTable(hgu133plus2SYMBOL)#提取GPL芯片平台的探针ID和对应的基因
length(unique(ids$symbol))#查看一共多少个基因
tail(sort(table(ids$symbol)))#查看每个基因对应多少个探针

经过查询,对应的平台的GPL570,该平台对应的R包是hgu133plus2

able() 函数可以生成频数统计表,这里就是统计每个基因symbol出现的次数然后将其表格化;sort()函数将symbol出现的频率从小到大进行排序;tail()取最后6个即出现频率最大的6个

table一下我们可以看到,9786基因设计了1个探针;5326个基因设计了2个探针;2879个基因设计了3个探针…也就是说大部分的基因只设计了1个探针。

其实一般基因都会设计很多探针的,我们下载的表达矩阵是作者处理之后的,把许多不好的探针都过滤掉了,我们处理作者的数据要默认人家做的是对的,否则就要下载原始数据自己处理。

table(sort(table(ids$symbol)))
table(rownames(exp) %in% ids$probe_id)

发现有11574个探针没有对应的基因名;43101个探针有对应的基因名。
x %in% y表示 x 的元素在y中吗?然后返回逻辑值。rownames(exp)即表达矩阵exp的行名是文章数据中用到的所有探针ID(probe_id);ids$probe_id是具有对应基因的所有探针。所以返回的TRUE就是文章数据中有对应基因的探针数。

现在我们对探针进行过滤,把没有对应基因名的探针过滤掉:

exp = exp[rownames(exp) %in% ids$probe_id,]
dim(exp)

过滤的本质就是矩阵取子集,如:matrix[2,]意思就是取矩阵matrix的第2行和所有的列。同理,我们这里exp[rownames(exp) %in% ids$probe_id,]就是取具有对应基因的所有探针(行),和所有的列。

对比一下过滤之前和过滤之后的探针数量:

table(rownames(exp) %in% ids$probe_id)
dim(exp)

exp = exp[rownames(exp) %in% ids$probe_id,]
dim(exp)

可以发现过滤前54675个探针,过滤后剩下43101个探针。
在这里插入图片描述

然后,我们使用match函数把ids里的探针顺序改一下,使ids里探针顺序和我们表达矩阵的顺序完全一样。

ids=ids[match(rownames(exp),ids$probe_id),]

然后使用merge函数将exp的探针与芯片平台探针id相匹配,合并到exp

exp<-as.data.frame(exp)
exp$probe_id<-rownames(exp)
exp<-merge(exp,ids,by="probe_id")

在这里插入图片描述

在这里插入图片描述

2、多个探针检测一个基因,合并在一起,取其平均值

library(limma)
exp<-avereps(exp,ID=exp$symbol)
exp<-as.data.frame(exp)
row.names(exp)<-exp$symbol#将exp行名改为基因名
save(exp,Group,file="Expreset1.Rdata")

七、基因的差异性分析

rm(list=ls())
options(stringsAsFactors = F)
load(file = "Expreset1.Rdata")
library(limma)
exp<-avereps(exp,ID=exp$symbol)
exp<-as.data.frame(exp)
exp<-exp[,-c(1,122)]#去掉第一列与最后一列
save(exp,Group,file="Expreset1.Rdata")

exp[1:4,1:4]#最好每次都检测数据
table(Group)#table函数,查看Group中的分组个数

exp<-data.frame(exp,stringsAsFactors=F)#转为数量型
exp<-data.matrix(exp)
boxplot(exp[2,] ~Group)#第一个基因以Group分组画箱线图
t.test(exp[2,] ~Group)#第一个基因做t检验
#也可以自定义一个函数画图
bp=function(g){
  library(ggpubr)
  df=data.frame(gene=g,stage=Group)
  p<-ggboxplot(df,x="stage",y="gene",
               color="stage",palette="jco",
               add="jitter")
  p+stat_compare_means()#增加P值
}

#调用定义好的函数,避免同样的绘图代码重复多次
library(ggplot2)
bp(exp[1,])
bp(exp[2,])
bp(exp[3,])
bp(exp[4,])

以第一个基因为例,结果:
在这里插入图片描述

在这里插入图片描述

差异分析走标准的limma流程:

#创建一个分组的矩阵
library(limma)
design=model.matrix(~0+factor(Group))
colnames(design)=levels(factor(Group))
rownames(design)=colnames(exp)
head(design)

#创建差异比较矩阵
contrast.matrix<-makeContrasts(paste0(unique(Group),collapse="-"),levels=design)
contrast.matrix#这个矩阵声明,我们要肿瘤组和非肿瘤组进行差异分析比较

#第1步lmFit,为每个基因给定一系列的阵列来拟合线性模型
fit<-lmFit(exp,design)
#第2步eBayes,给出了一个微阵列线性模型拟合,通过经验贝叶斯调整标准误差到一个共同的值来计算修正后的t统计量、修正后的f统计量和微分表达式的对数概率
fit2<-contrasts.fit(fit,contrast.matrix)
fit2<-eBayes(fit2)
#第3步topTabe,从线性模型拟合中提取出排名靠前的基因表
#topTable(fit2,coef=2,adjust='BH')
tempOutput<-topTable(fit2,coef=1,n=Inf)
tempOutput<-na.omit(tempOutput)#移除NA值
head(tempOutput)
tempOutput["YY1",]

#上调基因和下调基因
tempOutput$g=ifelse(tempOutput$P.Value>0.01,"stable",
             ifelse(tempOutput$logFC>1.5,"up",
                    ifelse(tempOutput$logFC<1.5,"down","stable")))

table(tempOutput$g)
save(exp,Group,tempOutput,file="tempOutput.Rdata")

说明:if判断,如果这一基因P值大于0.01,则为stable接上句else否则:接下来开始判断哪些P小于0.01的基因,再if判断,如果logFC大于1.5,则为上调基因

降维结果为:
在这里插入图片描述

在这里插入图片描述

八、绘制火山图和热图

火山图

rm(list=ls())
options(stringsAsFactors = F)
load(file = "tempOutput.Rdata")
DEG=tempOutput
head(DEG)
attach(DEG)
plot(logFC,-log10(P.Value))#df新增加一列“v”,值为-log10(P.Vaule)
library(ggpubr)
df=DEG
df$v=-log10(P.Value)
ggscatter(df,x="logFC",y="v",size=0.5)
ggscatter(df,x="logFC",y="v",size=0.5,color="g")#根据基因上调下调添加颜色

在这里插入图片描述

均值差异图

ggscatter(df,x="AveExpr",y="logFC",size=0.2)
df$p_c=ifelse(df$P.Value<0.001,"p<0.001",
              ifelse(df$P.Value<0.01,"0.001<p<0.01","p<0.01"))
table(df$p_c)
ggscatter(df,x="AveExpr",y="logFC",color="p_c",size=0.2,
          palete=c("green","red","black"))

热图

rm(list=ls())
options(stringsAsFactors = F)
load(file = "tempOutput.Rdata")
exp[1:4,1:4]
table(Group)#挑选出差异最大100个基因和差异最小的100个基因
x=tempOutput$logFC#去这一列将其重新赋值给x
names(x)=row.names(tempOutput)#将基因名作为名字,命名给x
x[1:4]
cg=c(names(head(sort(x),100)),
     names(tail(sort(x),100)))#x从小到大排列,取前100及后100,并取其对应的基因名,作为向量赋值给cg
library(pheatmap)
pheatmap(exp[cg,],show_colnames=F,show_rownames=F)#按照cg取行,所得到的矩阵来画热土

n=t(scale(t(exp[cg,])))#通过scale对log-ratio数值进行归一化,scale()函数需要行使样本名,列是基因名,所以需要转置,然后再转置回来
n[n>2]=2
n[n<-2]=-2
n[1:4,1:4]
pheatmap(n,show_colnames=F,show_rownames=F)

#以肿瘤与非肿瘤分组画热图
ac=data.frame(g=Group)
rownames(ac)=colnames(n)#将ac的行名也就是分组信息给到n的列明,即热图中位于上方的分组信息
pheatmap(n,show_colnames=F,
         show_rownames=F,
         cluster_cols=F,
         annotation_col=ac)#列名注释信息为ac即分组信息

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Redis实现登录

1.发送短信验证码 Overridepublic Result sendCode(String phone, HttpSession session) {//校验手机号if(RegexUtils.isPhoneInvalid(phone)){//如果不符合&#xff0c;返回错误信息。return Result.fail("手机号格式错误&#xff01;");}//生成验证码String code …

Codeforces Round #699 (Div. 2) C. Fence Painting

翻译&#xff1a; You finally woke up after this crazy dream and decided to walk around to clear your head. Outside you saw your houses fence — so plain and boring, that youd like to repaint it. You have a fence consisting of &#x1d45b;n planks, where …

网络实验之VTP协议

一、VTP协议简介 VLAN中继协议&#xff0c;VTP&#xff0c;VLAN TRUNKING PROTOCOL&#xff0c;是CISCO专用协议&#xff0c;大多数交换机都支持该协议。VTP负责在VTP域内同步VLAN信息&#xff0c;这样就不必在每个交换上配置相同的VLAN信息。如协议名称&#xff0c;VTP协议需要…

“世界上最鸽派”的央行转鹰,透露了什么信号?

​当地时间周二&#xff0c;日本中央银行结束货币政策会议后宣布&#xff0c;部分调整当前超宽松货币政策&#xff0c;将长期利率波动幅度由正负0.25%扩展至正负0.5%。这一“黑天鹅”令全球投资者感到大为震惊。长期以来&#xff0c;投资者将日本央行看作是最后一家尚未放弃其长…

【Linux】---文件基础I/O(上)

文章目录回顾C语言文件操作接口文件相关的系统调用接口打开和关闭文件文件的打开方式文件描述符文件描述符的分配规则write、read重定向dup2mysell回顾C语言文件操作接口 在C语言中对于文件的操作有着几个常用的接口可以调用 fopen//打开文件 fclose//关闭文件 fprintf//输出…

L1-070 吃火锅(分数 15)

以上图片来自微信朋友圈&#xff1a;这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”&#xff0c;那就厉害了&#xff0c;我们的故事就开始了。 本题要求你实现一个程序&#xff0c;自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。 输入格式&#x…

即时通讯音视频开发数字视频介绍

数字视频就是先用摄像机之类的视频捕捉设备&#xff0c;将外界影像的颜色和亮度信息转变为电信号&#xff0c;再记录到储存介质&#xff08;如录像带&#xff09;。 图像&#xff1a; 是人对视觉感知的物质再现。三维自然场景的对象包括&#xff1a;深度&#xff0c;纹理和亮度…

InnoDB详解2

文章目录InnoDB详解21 行格式1 Compact行格式详解1 变长字段长度列表&#xff08;两个字节&#xff09;2 NULL值列表&#xff08;1个字节&#xff09;3 记录头信息 &#xff08;重点&#xff09;2 Dynamic行格式2 页的上层结构InnoDB详解2 1 行格式 规定每条记录是怎么存储的…

汽车租赁服务小程序开发, 新时代下的行业商机

随着我国经济水平的提升&#xff0c;群众生活水平不断改善&#xff0c;人们的出行方式也发生了非常大的变化&#xff0c;不再依赖传统的出行方式&#xff0c;而是将目光转移到汽车上&#xff0c;作为当下便捷的出行方式之一&#xff0c;在面对远程旅游时却显得有些吃力&#xf…

React扩展:fragment、Context

目录 1.fragment fragment标签能包裹其它标签&#xff0c;但最后不会渲染到DOM树上。 import React, { Component, Fragment } from reactexport default class Demo extends Component {render() {return (<Fragment><input type"text" /><input …

Stealth-Persist混合内存系统中持久应用程序的体系结构支持

文章目录crash-consistent applications 崩溃一致性程序摘要一、引言二、背景A.新兴的非易失性存储器B.混合主存储器(HMM)C.页面缓存策略D. 目前的工业HMM系统E. 持久性内存编程模式F.动机三、设计A.设计要求B.设计选项C.Stealth-PersistD.概述E. Stealth-Persist NVM库的比较四…

如何用DWDM射频光纤技术实现200公里外的站点分集

本文概述了大型卫星和数据通信服务提供商如何通过使用DWDM射频光纤解决方案为Ka波段卫星数据传输实施经济高效的位置分集天线安装。 什么是DWDM技术? DWDM是Dense Wavelength Division Multiplexing的缩写&#xff0c;即密集波分复用技术&#xff0c;指的是一种光纤数据传输技…

pytest-需要模块相应的库

1. pytest-需要模块相应的库 文章地址&#xff1a;http://www.pythonck.com/archives/docs/1-2/13-2/13002-2 http://www.pythonck.com/archives/docs/1-2/13-2/13002-2 pytest-断言、跳过及运行 三元表达式&#xff1a;三元表达式又称三目运算符。在python中并没有三元表达式…

数商云SRM供应商系统打造家居建材企业完整电商数据生态平台

随着5G、物联网、大数据、人工智能、云计算等技术的快速发展&#xff0c;全球科技不断突破创新&#xff0c;推动了整个社会的智能化发展&#xff0c;同时&#xff0c;也带动了包含家居业在内的制造行业的技术创新、产品更迭以及更加精细化的经营管理。 数字经济时代&#xff0…

代替塞规的高精度孔径测量方法——泊肃叶压差法

摘要&#xff1a;针对现有压力衰减法孔径测量中存在的基本概念不清和实施方法不明确等问题&#xff0c;本文详细介绍了压力衰减法的孔径测量基本原理&#xff0c;并重点介绍压差法测量中的高精度压力控制方法&#xff0c;为各种微小孔径和等效孔径的准确测量提供切实可行的解决…

EOF的实际含义

在学习C语言的时候&#xff0c;遇到的一个问题就是EOF。 它是end of file的缩写&#xff0c;表示"文字流"&#xff08;stream&#xff09;的结尾。这里的"文字流"&#xff0c;可以是文件&#xff08;file&#xff09;&#xff0c;也可以是标准输入&#x…

Linux tracepoint 简介

文章目录前言一、跟踪点的目的二、跟踪点的使用2.1 简介2.2 DECLARE_TRACE三、TRACE_EVENT参考资料前言 本文提供了如何在内核中插入跟踪点并将 probe functions 连接到它们的示例&#xff0c;并提供了一些 probe functions 的示例。可以在不创建自定义内核模块的情况下使用跟…

高可用 Canal集群( 秒懂 + 史上最全)

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

工控安全-Modbus协议

文章目录一、什么是Modbus协议二、Modbus通信过程三、Modbus存储区四、Modbus协议类型4.1 Modbus RTU协议4.1.1 Modbus报文帧结构4.1.2 主机对从机读数据操作4.1.3 主机对从机写数据操作4.1.4 10功能码数据解析4.1.5 总结4.2 Modbus ACSII协议4.3 Modbus-TCP4.4 Modbus-PLUS一、…

SecXOps 关键技术 模型更新

模型更新 定义内涵 本节的模型更新是指在模型训练完成并正式上线后&#xff0c;由运维人员采集并提供新的数据对 原有模型进行再训练、更新参数的过程。 技术背景 随着时间的推移&#xff0c;由于周期性事件、突变等状况的发生&#xff0c;当下的数据集和之前用于训练 模型…