【生信技能树】GEO数据挖掘全流程

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','cowplot','patchwork','basetheme','paletteer','AnnoProbe','ggthemes','VennDiagram','tinyarray') 
Biocductor_packages <- c('GEOquery','hgu133plus2.db','ggnewscale',"limma","impute","GSEABase","GSVA","clusterProfiler","org.Hs.eg.db","preprocessCore","enrichplot")for (pkg in cran_packages){if (! require(pkg,character.only=T,quietly = T) ) {install.packages(pkg,ask = F,update = F)require(pkg,character.only=T) }
}for (pkg in Biocductor_packages){if (! require(pkg,character.only=T,quietly = 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) 
}
#没有任何提示就是成功了,如果有warning xx包不存在,用library检查一下。#library报错,就单独安装。

表达矩阵和临床信息的获取、疾病组和健康组的分组工作

rm(list = ls())#首先清空一下环境防止原来数据的影响
#打破下载时间的限制,改前60秒,改后10w秒
options(timeout = 100000) 
options(scipen = 20)#不要以科学计数法表示#传统下载方式
library(GEOquery)
eSet = getGEO("GSE57338", destdir = '.', getGPL = F)#这是一个示例数据集,是关于DCM这种病的
#网速太慢,下不下来怎么办
#1.从网页上下载/发链接让别人帮忙下,放在工作目录里
#2.试试geoChina,只能下载2019年前的表达芯片数据
#library(AnnoProbe)
#eSet = geoChina("GSE7305") #选择性代替第8行#前面下载下来的数据保存到了eSet这个变量中
class(eSet)#发现是一个
length(eSet)eSet = eSet[[1]] 
class(eSet)#(1)提取表达矩阵exp
exp <- exprs(eSet)
dim(exp)
range(exp)#看数据范围决定是否需要log,是否有负值,异常值
#exp = log2(exp+1) #需要log才log
boxplot(exp[,1:20],las = 2) #看是否有异常样本#(2)提取临床信息
pd <- pData(eSet)
as.data.frame(pd)
pd$title
k = str_detect(pd$title,"Non|CMP");table(k)
pd<-pd[k,]
#(3)让exp列名与pd的行名顺序完全一致
p = identical(rownames(pd),colnames(exp));p
if(!p) {
#intersect用于找出两个向量间的公共元素,返回值是两个向量中相同的元素
#intersect函数比较的时候是不考虑下标的,只要某个元素在传给该函数的两个向量中同时存在,那这个元素就是函数返回值的某个元素s = intersect(rownames(pd),colnames(exp))exp = exp[,s]#根据名字提取exp中的列pd = pd[s,]#根据名字提取pd的行
}#这样得到的exp列名和pd行名顺序完全一致#(4)提取芯片平台编号,后面要根据它来找探针注释
gpl_number <- eSet@annotation;gpl_number
save(pd,exp,gpl_number,file = "step1output.Rdata")# 原始数据处理的代码,按需学习
# https://mp.weixin.qq.com/s/0g8XkhXM3PndtPd-BUiVgw

eSet = getGEO("GSE57338", destdir = '.', getGPL = F)是我们需要根据情况修改的第一句代码,用哪个数据集就把第一个参数改成哪个数据集。

再来研究一下eSet

getGEO函数下载下来的数据集我们是用eSet这个变量接收的,通过上面一系列代码可以知道这是一个列表,且只有一个元素(如果有两个元素就说明是不同批次的或者同一个数据集是不同公司测的),既然只有一个元素那直接提取出来就是了,提取列表中的元素要用两个中括号,提取出来第一个元素之后覆盖掉eSet中的内容,此时再次查看eSet的类型,发现是一个看不懂的东西,反正也是一个类型,这是一个高级类型,总之就理解成接收了我们下载的GEO数据集的一个对象。这个eSet的内容长这样子

这一大堆乱七八糟的是肯定没法直接扔进后续的函数里面做差异分析的,因此接下来我们要提取表达矩阵,直接运行这段代码就行,这段代码不需要修改

其中把eSet这个对象扔到exprs这个函数里面就能得到对应的表达矩阵了,表达矩阵长这样

其中每一列是一个样本,每一行的行名其实是一个探针,而每一个探针都会对应一个基因,后续我们会根据探针与基因名的对应关系把这些行名改成基因名。现在只需要明确一点就是探针的表达量代表基因的表达量就行。

我们把表达矩阵存到exp里面,dim(exp)用来查看这个矩阵的维度(查看维度要做什么后面再说),range(exp)用来查看这个矩阵中元素的范围,如果数据从个位数到几万都有,那这个矩阵中元素就是没有取过对数的,我们需要手动取一下以2为底的对数,不要问为什么取2的对数不是其他的,这就是一个约定俗成的东西,其中在取对数的这一步我们对exp矩阵的每个元素都做了+1的运算,这个确实会改变基因的表达量,但是我们是做差异分析,基因表达量都+1并不会改变他们之间的差异性,之所以+1是为了防止出现一些负数等等。然后使用基本绘图系统的boxplot函数绘制了一个箱线图,boxplot的第一个参数传了exp这个矩阵的前20列,这是因为我用的这个数据集前面查看维度的时候发现是三万多行,三百多列,直接用exp作为参数绘制箱线图非常的密集而导致难以观察,所以我取了前20行,如果前面dim(exp)的时候发现矩阵的列很少,那就不用取前20列了。我用的这个数据集前20绘制的箱线图长这样

发现数据还是很正常的,没有上下浮动很明显的样本。如果有异常就需要做一些另外的处理比如删除等等,这个以后单独介绍一下,这里就不介绍了。

接下来再提取临床信息

使用pData(eSet)函数就能提取到临床信息了,这个eSet就是我们最开始时用来接收下载的数据的那个对象,函数的返回结果是一个数据框,也就是说临床信息我们使用一个名为pd的数据框保存。pd长这样

可以看到所谓的临床信息包含了title,这一列有特发性扩张型心肌病左心室,缺血性左心室,非衰竭左心室这三种情况,后面还有什么日期等等一系列的临床信息,我想要研究扩张型心肌病和健康人基因表达的差异,那我就根据title这一列中的字符串筛选出这两种情况,也就是把缺血性左心室剔除,我们发现特发性扩张型心肌病左心室这种情况有一个特有的字符串叫做Non,而非衰竭左心室也就是健康样本有一个字符串叫做CMP,运行代码

k = str_detect(pd$title,"Non|CMP");table(k)将会得到一个逻辑向量,如果title这一列(也就是一个向量)的元素中有Non或者CMP,就返回TRUE,否则返回False,再运行代码pd扩张型心肌病和健康样本这两种情况的行了。

接下来要让exp的列名和pd的行名完全一致,至于为什么后面再解释。

identical(rownames(pd),colnames(exp))用于查看pd(只有扩张型心肌病和健康样本这两种情况的数据框)的行名和exp(表达矩阵)的列名 是不是相同,pd的行名和exp的列名都是不同样本名,他们是有可能顺序相同的,如果不同我们执行if语句里面的内容把他们变成顺序相同,intersect函数用于找出两个向量中的公共元素,返回值是一个向量,该向量中的元素均为传给intersect函数的两个参数比如x和y的公共元素,无需考虑下标是不是相同,只要一个元素在x和y两个向量中同时存在,那么这个元素就是intersect返回结果的其中一个元素。我们用s来接收这个intersect函数的结果,这个结果就是一些样本名,然后根据这些样本名提取出exp的列和pd的行并覆盖掉exp和pd,这样就能保证exp的列和pd的行是完全一样的。

预处理还需要把探针转换成对应的基因名,这个代码一般是不需要改动的

我们看到这里提取eSet中的元素用的是@,这个符号的功能和数据框提取某一列用的那个$是一个道理。一般eSet第一次提取用的是@,后续可能是@也可能是$至于怎么提取可以通过点左上角环境中的这个eSet变量,点开是这样的,根据这里的结构决定是用@还是$提取元素

为了防止代码太长不便于维护,我们把目前所得到的,后续有用的变量存起来

save(pd,exp,gpl_number,file = "step1output.Rdata"),其实目前有用的就是存有临床信息且经过处理之后只剩下扩张型心肌病和健康两种情况的那个数据框pd,以及表达矩阵exp,还有刚才提取到的芯片平台编号,这个编号用于后续把探针转换成基因名。

# Group(实验分组)和ids(探针注释)
rm(list = ls())  
load(file = "step1output.Rdata")
# 1.Group----
library(stringr)
# 标准流程代码是二分组,多分组数据的分析后面另讲# 使用字符串处理的函数获取分组k = str_detect(pd$title,"Non");table(k)
# 需要把Group转换成因子,并设置参考水平,指定levels,对照组在前,处理组在后
Group = ifelse(k,"healthy","DCM")
table(Group)
#这个数据框是为了检查一下分组是不是成功
check_df<-data.frame(pd$title,Group)
#把Group这个向量转换成因子类型,前面是对照组
Group<-factor(Group,levels = c("healthy","DCM"))
#2.探针注释的获取-----------------
#捷径
library(tinyarray)
find_anno(gpl_number) #辅助写出找注释的代码
ids <- AnnoProbe::idmap('GPL11532')#这句代码是根据上一句代码的提示复制来的
#如果能打出代码就不需要再管其他方法。
#如果使用复制下来的AnnoProbe::idmap('xxx')代码发现报错了,请注意尝试不同的type参数
#如果不知道type能取什么,可以使用?idmap来查看
#如果显示no annotation avliable in Bioconductor and AnnoProbe则要去GEO网页上看GPL表格里找啦。#捷径里面包含了全部的R包、一部分表格、一部分自主注释
#方法1 BioconductorR包(最常用,已全部收入find_anno里面,不用看啦)
if(F){gpl_number #看看编号是多少#http://www.bio-info-trainee.com/1399.html #在这里搜索,找到对应的R包library(hgu133plus2.db)ls("package:hgu133plus2.db") #列出R包里都有啥ids <- toTable(hgu133plus2SYMBOL) #把R包里的注释表格变成数据框
}
# 方法2 读取GPL网页的表格文件,按列取子集
##https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL570
# 方法3 官网下载注释文件并读取
# 方法4 自主注释,了解一下
#https://mp.weixin.qq.com/s/mrtjpN8yDKUdCSvSUuUwcA
save(exp,Group,ids,file = "step2output.Rdata")

重新开一个R脚本清空原来环境中的变量以防止以前运行的内容对本次要运行的代码造成影响

使用r包stringr中的函数str_detect根据title这一列中是否含有Non这个字符串进行筛选,得到一个逻辑向量k,结果如图

这个结果显示有136个健康样本,82个扩张型心肌病样本。

创建一个名为Group的向量,并根据前面的把这个向量的内容改成healthy和DCM(DCM是扩张型心肌病的简称),结果应该是有原本136个TRUE的位置元素被改成了healthy,82个FALSE对应位置的元素被改成DCM。

然后紧接着创建了一个名为check_df的数据框把title这一列和我们刚才创建的Group这个向量放在了一起,顾名思义这个数据框就是为了让我们直观地检查一下是不是正确的分组了。我在这里展示部分check_df的结果

从结果来看我们确实正确的分组了。知道Group这个变量是对的之后,我们就把他转换成因子类型,这是因为后续分析所用到的函数的参数要求。因子这种类型特别适用于处理一些有很多重复元素的向量。

上面这三句代码是在进行探针转换为基因名的工作,find_anno是R包tinyarray中的一个函数,他需要的参数是我们前面得到的编号,扔进去之后会得到一个提示性的结果,我这里是这样

根据这个代码运行结果的提示写了第三句代码

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RS422一主多从MAX3490

RS422一主多从MAX3490 最近项目用到了RS422一主多从&#xff0c;一个主机4个从机。芯片用的MAX3490&#xff0c;几经折腾&#xff0c;最终只能从一拖4改为一拖2。 主机发送端&#xff0c;从机4个接收端都是正常的&#xff0c;没有问题。波形非常完美&#xff0c;没有太大变形 …

超级漂亮的 Ai 官网源码

超级漂亮的 AI 官网源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 <script lang"js">function project3D(x, y, z, vars) {var p, dx - vars.camXy - vars.camY - 8z - vars.camZp Math.atan2(x, z)d Math.sqrt(x * x z * z)x Math.sin(p - v…

揭秘奇葩环境问题:IDEA与Maven版本兼容性解析

1.问题描述 最近在实现通过Java爬虫获取网页源码&#xff0c;然后紧接着将源码转换为图片上传到OSS服务器&#xff0c;其中探索了很多办法&#xff0c;但是在实现过程中遇到一个奇葩问题&#xff0c;就是我无论下载任何Maven依赖&#xff0c;都无法正常下载&#xff0c;简直是…

八年前端开发之路中遇到的一些实用技巧分享——代码思路及通用场景

在开发中比较有用的代码思路 1. 链式编程2. 高阶函数应用-(添加数据并提供删除方法)3. 利用Promise链切入&#xff08;延迟执行&#xff09;4. 通过中间层来解决问题&#xff08;装饰者模式&#xff09;5. 单例模式 1. 链式编程 所谓链式编程即是函数调用后返回对象本身 let …

自动化中遇到的问题归纳总结

1、动态元素定位不到 解决方法&#xff1a;尽量使用固定元素定位&#xff0c;如没有固定元素&#xff0c;则采用绝对路径进行定位&#xff0c;因为元素路径是唯一且不变的 2、自动化脚本执行速度较慢 尽量使用css方法定位元素&#xff0c;使用等待时&#xff0c;少用sleep方…

中国目前比较有影响力的人物颜廷利:物质与无知通音

既然是在中国优秀传统文化之根-汉语当中&#xff0c;汉字‘物质’二字跟‘无知’通音&#xff0c;因此&#xff0c;面对当前金钱肆虐、物欲横流的现实生活&#xff0c;当人类众生把‘物质’&#xff08;无知&#xff09;生活看的太真、太重时&#xff0c;那么&#xff0c;这就很…

浅谈现代消息队列与云存储

一、前言 1970 年代末&#xff0c;消息系统用于管理多主机的打印作业&#xff0c;这种削峰解耦的能力逐渐被标准化为“点对点模型”和稍复杂的“发布订阅模型”&#xff0c;实现了数据处理的分布式协同。随着时代的发展&#xff0c;Kafka&#xff0c;Amazon SQS&#xff0c;Ro…

2024年3月 电子学会 青少年等级考试机器人理论真题五级

202403 青少年等级考试机器人理论真题五级 第 1 题 下图程序运行后&#xff0c;串口监视器显示的结果是&#xff1f;&#xff08; &#xff09; A&#xff1a;0 B&#xff1a;1 C&#xff1a;3 D&#xff1a;4 第 2 题 下列选项中&#xff0c;关于74HC595移位寄存器芯片的…

旧手机-基于Termux配置服务器(不用拿去换钢盆了)

Hi&#xff0c;大家好&#xff0c;我是抢老婆酸奶的小肥仔。 大家用手机这么多年了&#xff0c;手上或多或少都有一两个被替换下来的旧手机&#xff0c;也不用拿去换啥钢盆了&#xff0c;使用Termux可以将旧手机改造成一个服务器。 不多说&#xff0c;直接开干。 1、安装app…

JAVA毕业设计141—基于Java+Springboot+Vue的物业管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的物业管理系统(源代码数据库)141 一、系统介绍 本项目前后端分离&#xff0c;分为管理员、员工、用户三种角色(角色权限可自行分配) 1、用户&#xff1a; …

相机模型,坐标变换,畸变

小孔成像模型 墨子就记录了小孔成像是倒立的。这从几何光学的角度是很好理解的&#xff1a;光沿直线传播&#xff0c;上方和下方的光线交叉&#xff0c;导致在成像平面位置互换。 小孔的大小有什么影响&#xff1f; 小孔越大&#xff0c;进光量变大了&#xff0c;但是成像平…

研究生学习---找工作

规划 研一~研二上学期完成小论文&#xff0c;实习&#xff0c;秋招 竞赛&#xff1a;kaggle&#xff1f; 面试题一般简单且为原题&#xff0c;笔试题目很难&#xff0c;不会出原题 项目 找工作软件