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

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.mzph.cn/news/835605.shtml

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

相关文章

TFS(淘宝分布式存储引擎

TFS&#xff08;淘宝分布式存储引擎&#xff09; 什么是TFS&#xff1f; ​ 根据淘宝2016年的数据分析&#xff0c;淘宝卖家已经达到900多万&#xff0c;有上十亿的商品。每一个商品有包括大量的图片和文字(平均&#xff1a;15k)&#xff0c;粗略估计下&#xff0c;数据所占的…

IaC实战指南:DevOps的自动化基石

基础设施即代码&#xff08;Infrastructure as Code&#xff0c;IaC&#xff09;是指利用脚本、配置或编程语言创建和维护基础设施的一组实践和流程。通过IaC&#xff0c;我们可以轻松测试各个组件、实现所需的功能并在最小化停机时间的前提下进行扩展。更值得一提的是&#xf…

ETLCloud中如何执行Java Bean脚本

ETLCloud中如何执行Java Bean脚本 在ETLCloud这一强大的数据集成和转换平台中&#xff0c;执行Java Bean脚本的能力为其增添了更多的灵活性和扩展性。Java Bean脚本不仅仅是一段简单的代码&#xff0c;而是一种强大的工具&#xff0c;可以帮助用户定制和优化数据处理的每一个环…

按键配合LDO实现开关功能

今天给大家分享一个学到的按键开关电路&#xff0c;适合没有足够空间给自锁开关的场景&#xff0c;既可以用于USB供电控制也可以用于电池供电控制。话不多说上电路图先。 核心任务就是通过按键控制LDO芯片的使能管脚的电平状态&#xff0c;这枚NCP芯片高电平使能&#xff0c;VB…

代码随想录算法训练营第四十五天|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 思路&#xff1a; 我们之前做的 爬楼梯 是只能至多爬两个台阶。 这次改为&#xff1a;一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff0c;.......&#xff0c;直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢&a…

Q1季度空气净化器行业线上市场(京东天猫淘宝)销售数据分析

随着人们对健康生活方式的追求&#xff0c;以及消费升级的推动&#xff0c;空气净化器市场正在逐步恢复增长态势。 根据鲸参谋数据显示&#xff0c;今年Q1季度空气净化器在线上市场&#xff08;京东天猫淘宝&#xff09;综合销量超90万件&#xff0c;同比去年增长4%&#xff1…

【Java orm 框架比较】十一 新增 原生jdbc对比

迁移到&#xff08;https://gitee.com/wujiawei1207537021/spring-orm-integration-compare&#xff09; orm框架使用性能比较 比较mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db、原生jdbc…

1055: 邻接矩阵到邻接表

解法&#xff1a; #include<iostream> using namespace std; int arr[100][100]; int main() {int n;cin >> n;for (int i 0; i < n; i) {for (int j 0; j < n; j) {cin >> arr[i][j];}}for (int i 0; i < n; i) {for (int j 0; j < n; j) …

中东电商Noon测评Hepsiburada贺百狮,Souq,Temu,Nice One,MEIG如何自己养号补单?

养买家号进行中东跨境电商测评&#xff0c;是一个需要细心和技术的过程&#xff0c;特别是在不同的电商平台上Noon&#xff08;Namshi&#xff09;、Hepsiburada&#xff08;贺百狮&#xff09;、Souq&#xff08;亚马逊&#xff09;、Nice One、MEIG、Wadi、Temu。需要搭建完整…

洁净环境微生物监测的解决方案

药品污染控制 Manufacturing 无菌药品生产污染控制意义 01 CCS策略 无菌药品生产污染控制策略&#xff08;CCS) &#xff1a;来自于现行产品和工艺理解&#xff0c;为确保工艺性能和产品质量&#xff0c;所计划的一套体系&#xff0c;针对微生物、热原/内毒素和微粒的控制方…

图论(洛谷刷题)

目录 前言&#xff1a; 题单&#xff1a; P3386 【模板】二分图最大匹配 P1525 [NOIP2010 提高组] 关押罪犯 P3385 【模板】负环 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; SPFA写法 Dij写法&#xff1a; P3385 【模板】负环 P5960 【模板】差分约束…

Docker 容器中 PHP 使用 Curl 访问本地服务异常

在 Docker 环境中&#xff0c;将应用程序和服务容器化是常见的做法&#xff0c;但是有时会遇到一些网络通信方面的问题。其中一个常见的问题是 PHP 容器无法使用 Curl 访问本地服务&#xff0c;这可能导致开发和调试过程中的困扰。 问题描述 通常情况下&#xff0c;我们会将 …

系统代理开启时,钉钉页面加载失败等问题处理

若Windows端钉钉点击工作台/文件提示“页面加载失败”&#xff0c;可先将钉钉升级到7.1.10及以上版本&#xff1b;若依旧报错&#xff0c;可通过以下方法操作&#xff1a; 1、【电脑端钉钉】-【登录页面】-【切换到密码登录页面】-【网络设置】-切换为【不使用代理】&#xff…

mysql NDBcluster数据库集群介绍、部署及配置

前言: MySQL集群是一个无共享的、分布式节点架构的存储方案,旨在提供容错性和高性能。它由三个主要节点组成:管理节点(MGM)、数据节点和SQL节点。 管理节点(MGM) 定义与用途:管理节点是MySQL Cluster的控制中心,负责管理集群内的其他节点。它提供配置数据,启动和停止…

UE5 重定向时 APose和TPose 问题

我用了这个解决↓ IK Rig Animation Retargeting in Unreal Engine | Unreal Engine 5.0 Documentation | Epic Developer Community (epicgames.com) 这个可以参考↓ 虚幻引擎中的重定向管理器 |虚幻引擎 5.0 文档 |Epic开发者社区 (epicgames.com)

AI伦理和安全风险管理终极指南

人工智能&#xff08;AI&#xff09;正在迅速改变各个领域的软件开发和部署。驱动这一转变的两个关键群体为人工智能开发者和人工智能集成商。开发人员处于创建基础人工智能技术的最前沿&#xff0c;包括生成式人工智能&#xff08;GenAI&#xff09;模型、自然语言处理&#x…

ASP.NET网上鲜花销售系统的设计

摘 要 本系统实现了一般电子商务所具备的功能&#xff0c;如商品浏览、用户登录注册、网上与购物、结算、后台数据库管理等&#xff0c;利用这些功能可以对鲜花销售信息进行较好的管理。 网上鲜花销售系统的使用者主要是客户和销售管理者&#xff0c;对于客户来说&#xff0…

利用一下Chat-GPT写两段处理字符串的简单样例ABAP程序。这样可以大大提高工作效率。Chat-GPT的能力真是让人震撼。

我让Caht-GPT写两段ABAP 程序&#xff0c;第一段程序要求如下&#xff1a; 判读字符串里面是否含有特殊字符&#xff0c;这里说的特殊字符不包括键盘上能够输入的字符&#xff0c;如果有这样的特殊字符则输出来。 DATA: lv_string TYPE string VALUE 你的字符串,lv_result TYP…

测试开发之Python自动化 Pytest 之 fixture

Pytest 之 fixture unittest 和 nose 都支持 fixture 的,但是 fixture 在 pytest 里使用更灵活。也算是 pytest 的一个闪光点吧可以理解为一个跟 setup 和 teardown 这种前后置类似的东西。但是比它们要强大、灵活很多 fixtur 当做参数传入 # -*- coding: utf-8 -*- import …

SSL证书 购买流程

在购买SSL证书之前&#xff0c;需要知道一点相关的知识&#xff0c;通常包括以下几个环节&#xff1a; 一、确定需求 1、根据需要保护的域名数量&#xff0c;在以下三类中选择合适的证书类型&#xff1a; 单域名证书&#xff0c;只对一个域名&#xff08;例如abc.com&#x…