当前位置: 首页 > news >正文

GEO生信数据挖掘(六)实践案例——四分类结核病基因数据预处理分析

前面五节,我们使用阿尔兹海默症数据做了一个数据预处理案例,包括如下内容:

GEO生信数据挖掘(一)数据集下载和初步观察

GEO生信数据挖掘(二)下载基因芯片平台文件及注释

GEO生信数据挖掘(三)芯片探针ID与基因名映射处理

GEO生信数据挖掘(四)数据清洗(离群值处理、低表达基因、归一化、log2处理)

GEO生信数据挖掘(五)提取临床信息构建分组,分组数据可视化(绘制层次聚类图,绘制PCA图)

本节目录

结核病基因表达数据(GSE107994)观察

临床形状数据预处理

基因表达数据预处理

绘图观察数据


结核病基因表达数据(GSE107994)观察

由于,在数据分析过程,你拿的数据样式可能会有不同,本节我们以结核病基因表达数据(GSE107994)为例,做一个实践案例。该数据集的临床形状数据和基因表达数据是单独分开的,读取,和处理都需自己改动代码。

先来看看基因表达数据,这个探针注释工作已经完成了,不需要处理。

再看看临床形状数据,需要手工删除前面的注释,把后半部分规整的数据保留下来。

临床形状数据预处理

# 手工删除前面的注释,读文件,转置
pdata <- t(read.delim("GSE107994_series_matrix_clean.txt", header = TRUE, sep = "\t"))

# 手工删除前面的注释,读文件,转置
pdata <- t(read.delim("GSE107994_series_matrix_clean.txt", header = TRUE, sep = "\t"))
pdata  <-pdata[-1,]
pdata_info = pdata[,c(1,7)]
colnames(pdata_info) = c('geo_accession','type')#观察样本类型的取值都有哪些(结核,潜隐进展,对照和潜隐)
unique(pdata_info[,2])  
#"Leicester_Active_TB"  "Longitudnal_Leicester_LTBI_Progressor" "Leicester_Control"    #"Leicester_LTBI" group_data = as.data.frame(pdata_info)

处理前

处理后

增加不同的类型标签,根据需要,选取实验组和对照组


# 使用grepl函数判断字符串是否包含'Control',并进行相应的修改
group_data$group_easy <- ifelse(grepl("Control", group_data$type ), "Control", "TB")# 使用grepl函数判断字符串是否包含特定内容,然后进行相应的修改
group_data$group_easy <- ifelse(grepl("Control", group_data$type), "Control",ifelse(grepl("LTBI", group_data$type), "LTBI","TB"))
# 使用grepl函数判断字符串是否包含特定内容,然后进行相应的修改
group_data$group_more <- ifelse(grepl("Control", group_data$type), "Control",ifelse(grepl("LTBI_Progressor", group_data$type), "LTBI_Progressor",ifelse(grepl("LTBI", group_data$type), "LTBI","TB")))#尝试把进展组排除出去save(group_data,file = "group_data.Rdata")

例如 我们可以进行 TB(结核) 和LTBI(潜隐结核)实验对照分析。

基因表达数据预处理


读取数据集

install.packages("openxlsx")
library(openxlsx)# 读基因表达矩阵,第一列为基因名ID
gse_info<- as.data.frame(read.xlsx("GSE107994_Raw.xlsx", sheet = 1))
colnames(gse_info)

后续运行代码过程中,发现基因名称中有全数字的情况,这里做删除操作。

library(dplyr)
dim(gse_info)
#基因里面有数字
gse_info <- gse_info[!grepl("^\\d+$", gse_info$ID), ]  #有效#基因名全为空
gse_info = gse_info[gse_info$ID != "",]  #无剔除
dim(gse_info) #[1] 58023   176#负值处理
gse_info[gse_info <= 0] <- 0.0001#重复值检查
table(duplicated(gse_info$ID))

分组数据条件筛选,TB(结核) 和LTBI(潜隐结核)

#+=====================================================
#================================================
#+========type分组数据条件筛选step3===========
#+====================================#预处理之前,先筛选出TB组和LTBI组 的数据
unique(group_data[,"group_more"])  #"TB"  "LTBI_Progressor" "Control"    "LTBI" #"TB"  "LTBI" 对照,则剔除 "LTBI_Progressor" "Control" 
geo_accession_TB_LTBI <- group_data[group_data$group_more == "LTBI_Progressor" | group_data$group_more == "Control","geo_accession"]
gse_TB_FTBI = gse_info[,!(names(gse_info) %in% geo_accession_TB_LTBI)]gse_TB_FTBI

低表达过滤(平均值小于1)


#+=====================================================
#================================================
#+========删除 低表达(平均值小于1)基因 step4===========
#+====================================
#+==============================#新增一列计算平均
gene_avg_expression <- rowMeans(gse_TB_FTBI[, -1])  # 计算每个基因的平均表达量,排除第一列(基因名)
#仅去除在所有样本里表达量都为零的基因(平均值小于1)
gse_TB_FTBI_filtered_genes_1 <- gse_TB_FTBI[gene_avg_expression >= 1, ]

低表达过滤方案二(保留样本表达的排名前50%的基因)

#+=================================================================
#============================================================
#+========删除 低表达(排名前50%)基因 step5===========
#+==========================================
#+================================#仅保留在一半以上样本里表达的基因# 计算基因表达矩阵每个基因的平均值
gene_means <- rowMeans(gse_TB_FTBI_filtered_genes_1[,-1])# 计算基因平均值的排序百分位数
gene_percentiles <- rank(gene_means) / length(gene_means)# 获取阈值
threshold <- 0.25  # 删除后25%的阈值
#threshold <- 0.5  # 删除后50%的阈值
# 根据阈值筛选低表达基因
gse_TB_FTBI_filtered_genes_2 <- gse_TB_FTBI_filtered_genes_1[gene_percentiles > threshold, ]# 打印筛选后的基因表达矩阵
dim(gse_TB_FTBI_filtered_genes_2) #[1] 17049   176

删除重复基因,取平均

#+=================================================================
#============================================================
#+========重复基因,取平均值 step6===========
#+==========================================
#+================================dim(filtered_genes_2) 
table(duplicated(filtered_genes_2$ID))#把重复的Symbol取平均值
averaged_data <- aggregate(.~ID , filtered_genes_2, mean, na.action = na.pass)  ##把重复的Symbol取平均值#把行名命名为SYMBOL
row.names(averaged_data) <- averaged_data$ID  
dim(averaged_data)#去掉缺失值
matrix_na = na.omit(averaged_data)  #删除Symbol列(一般是第一列)
matrix_final <- subset(matrix_na, select = -1) 
dim(matrix_final) #[1] 22687   175

离群值处理


#+=================================================================
#============================================================
#+========离群值处理 step7==========================
#+==========================================
#+================================#数据离群处理
#处理极端值
#定义向量极端值处理函数
#用于处理异常值,将超出一定范围的值替换为中位数,以减少异常值对后续分析的影响。
dljdz=function(x) {DOWNB=quantile(x,0.25)-1.5*(quantile(x,0.75)-quantile(x,0.25))UPB=quantile(x,0.75)+1.5*(quantile(x,0.75)-quantile(x,0.25))x[which(x<DOWNB)]=quantile(x,0.5)x[which(x>UPB)]=quantile(x,0.5)return(x)
}#第一列设置为行名
matrix_leave=matrix_final_TB_LTBIboxplot(matrix_leave,outline=FALSE, notch=T, las=2)  ##出箱线图
dim(matrix_leave)#处理离群值
matrix_leave_res=apply(matrix_leave,2,dljdz)boxplot(matrix_leave_res,outline=FALSE, notch=T, las=2)  ##出箱线图
dim(matrix_leave_res)

log2 处理

#+=================================================================
#============================================================
#+========log2 处理 step8==========================
#+==========================================
#+================================# limma的函数归一化,矫正差异  ,表达矩阵自动log2化#1.归一化不是绝对必要的,但是推荐进行归一化。
#有重复的样本中,应该不具备生物学意义的外部因素会影响单个样品的表达,
#例如中第一批制备的样品会总体上表达高于第二批制备的样品,假设所有样品表达值的范围和分布都应当相似,
#需要进行归一化来确保整个实验中每个样本的表达分布都相似。
#2.归一化要在log2标准化之前做library(limma) exprSet=normalizeBetweenArrays(matrix_leave_res)boxplot(exprSet,outline=FALSE, notch=T, las=2)  ##出箱线图## 这步把矩阵转换为数据框很重要
class(exprSet)   ##注释:此时数据的格式是矩阵(Matrix)
exprSet <- as.data.frame(exprSet)#标准化 表达矩阵自动log2化
qx <- as.numeric(quantile(exprSet, 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)#负值全部置为空
#exprSet[exprSet <= 0] <- 0.0001
#去掉缺失值
#exprSet = na.omit(exprSet)  #15654
#save (exprSet,file = "waitlog_data_TB_LTBI.Rdata")## 开始判断
if (LogC) { exprSet [which(exprSet  <= 0)] <- NaN## 取log2exprSet_clean <- log2(exprSet+1)  #@@@@是否加一 加一的话不产生负值@#@¥@#@#@%@%¥@@@@@@print("log2 transform finished")
}else{print("log2 transform not needed")
}boxplot(exprSet_clean,outline=FALSE, notch=T, las=2)  ##出箱线图dataset_TB_LTBI =exprSet_clean

绘图观察数据


#+=================================================================
#============================================================
#+========对照组不同颜色画箱线图 step9==========================
#+==========================================
#+================================# 使用grepl函数判断字符串是否包含'LTBI',并进行颜色标记,为了画图
group_data_TB_LTBI$group_color <- ifelse(grepl("LTBI", group_data_TB_LTBI$group_more), "yellow", "blue")#画箱线图查看数据分布
group_list_color = group_data_TB_LTBI$group_color 
boxplot( data.frame(dataset_TB_LTBI),outline=FALSE,notch=T,col=group_list_color,las=2)dev.off()#+=================================================================
#============================================================
#+========绘制层次聚类图 step10==========================
#+==========================================
#+================================
#+#检查表达矩阵的样本名称,和分租信息的样本名称顺序,是否一致对应
colnames(dataset_TB_LTBI)
group_data_TB_LTBI$geo_accessionexprSet =dataset_TB_LTBI
#修改GSM的名字,改为分组信息
#colnames(exprSet)=paste(group_list,1:ncol(exprSet),sep = '')#定义nodePar
nodePar=list(lab.cex=0.6,pch=c(NA,19),cex=0.7,col='blue')
#聚类
hc=hclust(dist(t(exprSet))) #t()的意思是转置#绘图
plot(as.dendrogram(hc),nodePar = nodePar,horiz = TRUE)dev.off()#+=================================================================
#============================================================
#+========绘制PCA散点样本可视化图 step11===================
#+==========================================
#+================================##PCA图
#install.packages('ggfortify')
library(ggfortify)
df=as.data.frame(t(exprSet))  #转置后就变成了矩阵
dim(df)  #查看数据维度
dim(exprSet)df$group=group_data_TB_LTBI$group_more  #加入样本分组信息
autoplot(prcomp(df[,1:ncol(df)-1]),data=df,colour='group')  #PCA散点图dev.off()

至此,我们对两个数据集进行了预处理工作,下面我们可以对处理完毕的数据进行差异分析了。

相关文章:

GEO生信数据挖掘(六)实践案例——四分类结核病基因数据预处理分析

前面五节&#xff0c;我们使用阿尔兹海默症数据做了一个数据预处理案例&#xff0c;包括如下内容&#xff1a; GEO生信数据挖掘&#xff08;一&#xff09;数据集下载和初步观察 GEO生信数据挖掘&#xff08;二&#xff09;下载基因芯片平台文件及注释 GEO生信数据挖掘&…...

8.Mobilenetv2网络代码实现

代码如下&#xff1a; import math import os import numpy as npimport torch import torch.nn as nn import torch.utils.model_zoo as model_zoo#1.建立带有bn的卷积网络 def conv_bn(inp, oup, stride):return nn.Sequential(nn.Conv2d(inp,oup,3,stride,biasFalse),nn.Bat…...

Spring Boot Controller

刚入门小白&#xff0c;详细请看这篇SpringBoot各种Controller写法_springboot controller-CSDN博客 Spring Boot 提供了Controller和RestController两种注解。 Controller 返回一个string&#xff0c;其内容就是指向的html文件名称。 Controller public class HelloControll…...

在网络安全、爬虫和HTTP协议中的重要性和应用

1. Socks5代理&#xff1a;保障多协议安全传输 Socks5代理是一种功能强大的代理协议&#xff0c;支持多种网络协议&#xff0c;包括HTTP、HTTPS和FTP。相比之下&#xff0c;Socks5代理提供了更高的安全性和功能性&#xff0c;包括&#xff1a; 多协议支持&#xff1a; Socks5代…...

Web测试框架SeleniumBase

首先&#xff0c;SeleniumBase支持 pip安装&#xff1a; > pip install seleniumbase它依赖的库比较多&#xff0c;包括pytest、nose这些第三方单元测试框架&#xff0c;是为更方便的运行测试用例&#xff0c;因为这两个测试框架是支持unittest测试用例的执行的。 Seleniu…...

jvm打破砂锅问到底- 为什么要标记或记录跨代引用

为什么要标记或记录跨代引用. ygc时, 直接把老年代引用的新生代对象(可能是对象区域)记录下来当做根, 这其实就是依据第二假说和第三假说, 强者恒强, 跨代引用少(存在互相引用关系的两个对象&#xff0c;是应该倾 向于同时生存或者同时消亡的). 拿ygc老年代跨代引用对象当做根…...

小程序长期订阅

准备工作 ::: tip 管理后台配置 小程序类目&#xff1a;住建&#xff08;硬性要求&#xff09; 功能-》订阅消息-》我的模版 申请模版&#xff1a;1、预约进度通知 2、申请结果通知 3、业务办理进度提醒 ::: 用户订阅一次后&#xff0c;可长期下发多条消息。目前长期性订阅…...

Studio One6.5中文版本版下载及功能介绍

Studio One是一款专业的音乐制作软件&#xff0c;由美国PreSonus公司开发。该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One的主要特点…...

07-Zookeeper分布式一致性协议ZAB源码剖析

上一篇&#xff1a;06-Zookeeper选举Leader源码剖析 整个Zookeeper就是一个多节点分布式一致性算法的实现&#xff0c;底层采用的实现协议是ZAB。 1. ZAB协议介绍 ZAB 协议全称&#xff1a;Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;。 Zook…...

云原生安全应用场景有哪些?

当今数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一&#xff0c;而云计算作为企业数字化转型的关键技术&#xff0c;其安全性也日益受到重视。随着云计算技术的快速发展&#xff0c;云原生安全应用场景也越来越广泛&#xff0c;下面本文将从云原生安全应用场景出发&a…...

Step 1 搭建一个简单的渲染框架

Step 1 搭建一个简单的渲染框架 万事开头难。从萌生到自己到处看源码手抄一个mini engine出来的想法&#xff0c;到真正敲键盘去抄&#xff0c;转眼过去了很久的时间。这次大概的确是抱着认真的想法&#xff0c;打开VS从零开始抄代码。不知道能坚持多久呢。。。 本次的主题是搭…...

Excel 插入和提取超链接

构造超链接 HYPERLINK(D1,C1)提取超链接 Sheet页→右键→查看代码Sub link()Dim hl As HyperlinkFor Each hl In ActiveSheet.Hyperlinkshl.Range.Offset(0, 1).Value hl.AddressNext End Sub工具栏→运行→运行子过程→提取所有超链接地址参考&#xff1a; https://blog.cs…...

基础架构开发-操作系统、编译器、云原生、嵌入式、ic

基础架构开发-操作系统、编译器、云原生、嵌入式、ic 操作系统编译器词法分析AST语法树生成语法优化生成机器码 云原生容器开发一般遇到的岗位描述RDMA、DPDK是什么东西NFV和VNF是什么RisingWave云原生存储引擎开发实践 单片机、嵌入式雷达路线规划 ic开发 操作系统 以C和Rust…...

C++-Mongoose(3)-http-server-https-restful

1.url 结构 2.http和 http-restful区别在于对于mg_tls_opts的赋值 2.1 http和https 区分 a) port地址 static const char *s_http_addr "http://0.0.0.0:8000"; // HTTP port static const char *s_https_addr "https://0.0.0.0:8443"; // HTTP…...

git多分支、git远程仓库、ssh方式连接远程仓库、协同开发(避免冲突)、解决协同冲突(多人在同一分支开发、 合并分支)

1 git多分支 2 git远程仓库 2.1 普通开发者&#xff0c;使用流程 3 ssh方式连接远程仓库 4 协同开发 4.1 避免冲突 4.2 协同开发 5 解决协同冲突 5.1 多人在同一分支开发 5.2 合并分支 1 git多分支 ## 命令操作分支-1 创建分支git branch dev-2 查看分支git branch-3 分支合…...

ChatGPT或将引发现代知识体系转变

作为当下大语言模型的典型代表&#xff0c;ChatGPT对人类学习方式和教育发展所产生的变革效应已然引起了广泛关注。技术的快速发展在某种程度上正在“倒逼”教育领域开启更深层次的变革。在此背景下&#xff0c;教育从业者势必要学会准确识变、科学应变、主动求变、以变应变&am…...

【爬虫实战】用pyhon爬百度故事会专栏

一.爬虫需求 获取对应所有专栏数据&#xff1b;自动实现分页&#xff1b;多线程爬取&#xff1b;批量多账号爬取&#xff1b;保存到mysql、csv&#xff08;本案例以mysql为例&#xff09;&#xff1b;保存数据时已存在就更新&#xff0c;无数据就添加&#xff1b; 二.最终效果…...

焦炭反应性及反应后强度试验方法

声明 本文是学习GB-T 4000-2017 焦炭反应性及反应后强度试验方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 7— 进气口&#xff1b; 8— 测温热电偶。 图 A.1 单点测温加热炉体结构示意图 A.3 温度控制装置 控制精度&#xff1a;(11003)℃。…...

链表(3):双链表

引入 我们之前学的单向链表有什么缺点呢&#xff1f; 缺点&#xff1a;后一个节点无法看到前一个节点的内容 那我们就多设置一个格子prev用来存放前面一个节点的地址&#xff0c;第一个节点的prev存最后一个节点的地址&#xff08;一般是null&#xff09; 这样一个无头双向…...

【TES720D】基于复旦微的FMQL20S400全国产化ARM核心模块

TES720D是一款基于上海复旦微电子FMQL20S400的全国产化核心模块。该核心模块将复旦微的FMQL20S400&#xff08;兼容FMQL10S400&#xff09;的最小系统集成在了一个50*70mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;特别是用在控制领域…...

Python 列表切片陷阱:引用、复制与深复制

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 Python 列表的切片和赋值操作很基础&#xff0c;之前也遇到过一些坑&#xff0c; 但今天刷 Codewars 时发现了一个更大的坑&#xff0c;故在此记录。 Python 列表赋值&am…...

macbook电脑删除app怎么才能彻底清理?

macBook是苹果公司推出的一款笔记本电脑&#xff0c;它的操作系统是macOS。在macBook上安装的app可能会占用大量的存储空间&#xff0c;因此&#xff0c;当我们不再需要某个app时&#xff0c;需要将其彻底删除。macbook删除app&#xff0c;怎么才能彻底呢&#xff1f;本文将给大…...

【数据结构】二叉树--链式结构的实现 (遍历)

目录 一 二叉树的遍历 1 构建一个二叉树 2 前序遍历 3 中序遍历 4 后续遍历 5 层序 6 二叉树销毁 二 应用(递归思想) 1 二叉树节点个数 2 叶子节点个数 3 第K层的节点个数 4 二叉树查找值为x的节点 5 判断是否是二叉树 一 二叉树的遍历 学习二叉树结构&#xff0…...

reids基础数据结构

文章目录 一.整体1.RedisDb2.对象头 二.string三.list1.ziplist2.quicklist 四.hash五.set六.zset1.查找2.插入3.删除4.更新5.元素排名 一.整体 1.RedisDb redis内部的所有键值对是两个hash结构&#xff0c;维护了键值对和过期时间 dict *dictdict *expire 2.对象头 int t…...

gitlab 维护

一 环境信息 二 日常维护 2.1 gitlab mirror 2.1.1 常见方法 社区版本gitab mirror 只能push&#xff0c;默认限制了局域网内mirror 需要修改admin/setting/network(网络)/outbound(出站请求) 勾选允许局域网即可。 2.1.2 疑难问题 内网有三个gitlab A: GITLAB 12 B\C GI…...

ABB机器人RWS连接方法

目录 方法一&#xff1a;curl 方法二&#xff1a;网页地址 方法三&#xff1a;Postman 与ABB机器人通讯&#xff0c;较新机器人&#xff0c;可以使用Robot Web Services&#xff0c;直接方便地使用网页进行查看当前数据&#xff0c;但是网页需要用户名密码验证&#xff0c;测…...

Spring Boot的循环依赖问题

目录 1.循环依赖的概念 2.解决循环依赖的方法 1.构造器方法注入&#xff1a; 2.Lazy注解 3.DependsOn注解 1.循环依赖的概念 两个或多个bean之间互相依赖&#xff0c;形成循环&#xff0c;此时&#xff0c;Spring容器无法确定先实例化哪个bean&#xff0c;导致循环依赖的…...

postgresql|数据库|恢复备份的时候报错:pg_restore: implied data-only restore的处理方案

一&#xff0c; 前情回顾 某次在使用pg_dump命令逻辑备份出来的备份文件对指定的几个表恢复的时候&#xff0c;报错pg_restore: implied data-only restore 当然&#xff0c;遇到问题首先就是百度了&#xff0c;但好像没有什么明确的解决方案&#xff0c;具体的报错命令和…...

Elasticsearch:使用 Langchain 和 OpenAI 进行问答

这款交互式 jupyter notebook 使用 Langchain 将虚构的工作场所文档拆分为段落 (chunks)&#xff0c;并使用 OpenAI 将这些段落转换为嵌入并将其存储到 Elasticsearch 中。然后&#xff0c;当我们提出问题时&#xff0c;我们从向量存储中检索相关段落&#xff0c;并使用 langch…...

安全巡检管理系统—隐患排查治理

安全管理越来越重要&#xff0c;每个生产企业都需要一个安全隐患排查治理小程序&#xff01;利用凡尔码平台搭建安全巡检管理系统主要有以下四个功能 1、制定巡检计划&#xff1a;安全巡检管理系统可以帮助用户制定巡检计划&#xff0c;用户可以根据需要创建不同的计划&#xf…...