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

news2024/11/25 4:56:02

检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例

目录

离群值处理

删除 低表达基因

函数归一化,矫正差异

数据标准化—log2处理

 完整代码


上节围绕着探针ID和基因名称做了一些清洗工作,还做了重复值检查,空值删除操作。

#查看重复值
table(duplicated(matrix$Gene.Symbol))

#去掉缺失值
matrix_na = na.omit(matrix)  

#基因名称为空删除
matrix_final = matrix_na[matrix_na$Gene.Symbol != "",]

离群值处理

用于处理异常值,将超出一定范围的值替换为中位数,以减少异常值对后续分析的影响。

#数据离群处理
#处理极端值
#定义向量极端值处理函数
#用于处理异常值,将超出一定范围的值替换为中位数,以减少异常值对后续分析的影响。
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

boxplot(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)

删除 低表达基因

方案1 :仅去除在所有样本里表达量都为零的基因(或者平均值小于1)

方案2:仅保留在一半(50%,75%...自己选择)以上样本里表达的基因

#删除 低表达基因

#仅去除在所有样本里表达量都为零的基因(平均值小于1)

# 计算基因表达矩阵的平均值
gene_avg <- apply(matrix_final, 1, mean)
# 根据阈值筛选低表达基因
filtered_genes_1 <- matrix_final[gene_avg >= 1, ] # 表达量平均值小于1的过滤
dim(filtered_genes_1)


#+================================
#常用过滤标准2(推荐):
#仅保留在一半以上样本里表达的基因

# 计算基因表达矩阵每个基因的平均值
gene_means <- rowMeans(matrix_final)

# 计算基因平均值的排序百分位数
gene_percentiles <- rank(gene_means) / length(gene_means)

# 获取阈值
threshold <- 0.25  # 删除后25%的阈值
#threshold <- 0.5  # 删除后50%的阈值
# 根据阈值筛选低表达基因
filtered_genes_2 <- matrix_final[gene_percentiles > threshold, ]

# 打印筛选后的基因表达矩阵
dim(filtered_genes_2)

boxplot(filtered_genes_2,outline=FALSE, notch=T, las=2)  ##出箱线图
#dim(filtered_genes)

#+删除 低表达基因   得到filtered_genes_1 删除平均表达小于1的   得到filtered_genes_2 删除后25%的

函数归一化,矫正差异


#1.归一化不是绝对必要的,但是推荐进行归一化。
#有重复的样本中,应该不具备生物学意义的外部因素会影响单个样品的表达,
#例如中第一批制备的样品会总体上表达高于第二批制备的样品,假设所有样品表达值的范围和分布都应当相似,
#需要进行归一化来确保整个实验中每个样本的表达分布都相似。
#2.归一化要在log2标准化之前做
 

library(limma) 

exprSet=normalizeBetweenArrays(filtered_genes_2)

boxplot(exprSet,outline=FALSE, notch=T, las=2)  ##出箱线图

## 这步把矩阵转换为数据框很重要
class(exprSet)   ##注释:此时数据的格式是矩阵(Matrix)
exprSet <- as.data.frame(exprSet)

数据标准化—log2处理

如果表达量的数值在50以内,通常是经过log2转化后的。如果数字在几百几千,则是未经转化的。

GSE数据集的注释部分会有说明,常见的标准化处理方法有3种:RMA算法、GC-RMA算法、MAS5算法



#标准化 表达矩阵自动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)


## 开始判断
if (LogC) { 
  exprSet [which(exprSet  <= 0)] <- NaN
  ## 取log2
  exprSet_clean <- log2(exprSet)
  print("log2 transform finished")
}else{
  print("log2 transform not needed")
}

筛选后的基因表达矩阵的箱线图

经过数据清洗后的箱线图

 完整代码


# 安装并加载GEOquery包
library(GEOquery)

# 指定GEO数据集的ID
gse_id <- "GSE1297"

# 使用getGEO函数获取数据集的基础信息
gse_info <- getGEO(gse_id, destdir = ".", AnnotGPL = F ,getGPL = F) # Failed to download ./GPL96.soft.gz!

# 提取基因表达矩阵
expression_data <- exprs(gse_info[[1]])

# 提取注释信息
#annotation <- featureData(gse_info[[1]])


#查看平台文件列名
colnames(annotation)

#打印项目文件列表
dir() 

# 读取芯片平台文件txt
platform_file <- read.delim("GPL96-57554.txt", header = TRUE, sep = "\t", comment.char = "#")

#查看平台文件列名
colnames(platform_file)

# 假设芯片平台文件中有两列,一列是探针ID,一列是基因名
#probe_names <- platform_file$ID
#gene_symbols <- platform_file$Gene.Symbol
platform_file_set=platform_file[,c(1,11)]


#一个探针对应多个基因名,保留第一个基因名
ids = platform_file_set
library(tidyverse)
test_function <- apply(ids,
                       1,
                       function(x){
                         paste(x[1],
                               str_split(x[2],'///',simplify=T),
                               sep = "...")
                       })
x = tibble(unlist(test_function))

colnames(x) <- "ttt" 
ids <- separate(x,ttt,c("ID","Gene.Symbol"),sep = "\\...")
dim(ids)

#将Matrix格式表达矩阵转换为data.frame格式
exprSet <- data.frame(expression_data)
dim(exprSet)

#给表达矩阵新增加一列ID
exprSet$ID <- rownames(exprSet) # 得到表达矩阵,行名为ID,需要转换,新增一列
dim(exprSet)
#矩阵表达文件和平台文件有相同列‘ID’,使用merge函数合并
express <- merge(x = exprSet, y = ids, by.x = "ID")

#删除探针ID列
express$ID =NULL


dim(express) 

matrix = express
dim(matrix)
#查看多少个基因重复了
table(duplicated(matrix$Gene.Symbol))


#把重复的Symbol取平均值
matrix <- aggregate(.~Gene.Symbol, matrix, mean)  ##把重复的Symbol取平均值
row.names(matrix) <- matrix$Gene.Symbol  #把行名命名为SYMBOL

dim(matrix)

matrix_na = na.omit(matrix)   #去掉缺失值
dim(matrix_na)

matrix_final = matrix_na[matrix_na$Gene.Symbol != "",]
dim(matrix_final)

matrix_final <- subset(matrix_final, select = -1)  #删除Symbol列(一般是第一列)
dim(matrix_final)
#+  经过注释、探针名基因名处理、删除基因名为空值、删除缺失值 得到最终 matrix_final
#+==================================================================================
#+========================================================================================




#+==================================================================================
#+========================================================================================
#+增加#(2)离群值处理

#数据离群处理
#处理极端值
#定义向量极端值处理函数
#用于处理异常值,将超出一定范围的值替换为中位数,以减少异常值对后续分析的影响。
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

boxplot(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)

#+增加#(2)离群值处理
#+==================================================================================
#+========================================================================================





#+==================================================================================
#+========================================================================================
#删除 低表达基因

#仅去除在所有样本里表达量都为零的基因(平均值小于1)

# 计算基因表达矩阵的平均值
gene_avg <- apply(matrix_final, 1, mean)
# 根据阈值筛选低表达基因
filtered_genes_1 <- matrix_final[gene_avg >= 1, ] # 表达量平均值小于1的过滤
dim(filtered_genes_1)


#+================================
#常用过滤标准2(推荐):
#仅保留在一半以上样本里表达的基因

# 计算基因表达矩阵每个基因的平均值
gene_means <- rowMeans(matrix_final)

# 计算基因平均值的排序百分位数
gene_percentiles <- rank(gene_means) / length(gene_means)

# 获取阈值
threshold <- 0.25  # 删除后25%的阈值
#threshold <- 0.5  # 删除后50%的阈值
# 根据阈值筛选低表达基因
filtered_genes_2 <- matrix_final[gene_percentiles > threshold, ]

# 打印筛选后的基因表达矩阵
dim(filtered_genes_2)

boxplot(filtered_genes_2,outline=FALSE, notch=T, las=2)  ##出箱线图
#dim(filtered_genes)

#+删除 低表达基因   得到filtered_genes_1 删除平均表达小于1的   得到filtered_genes_2 删除后25%的
#+==================================================================================
#+========================================================================================





#+==================================================================================
#+========================================================================================
### limma的函数归一化,矫正差异  ,表达矩阵自动log2化

#1.归一化不是绝对必要的,但是推荐进行归一化。
#有重复的样本中,应该不具备生物学意义的外部因素会影响单个样品的表达,
#例如中第一批制备的样品会总体上表达高于第二批制备的样品,假设所有样品表达值的范围和分布都应当相似,
#需要进行归一化来确保整个实验中每个样本的表达分布都相似。
#2.归一化要在log2标准化之前做


library(limma) 

exprSet=normalizeBetweenArrays(filtered_genes_2)

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)


## 开始判断
if (LogC) { 
  exprSet [which(exprSet  <= 0)] <- NaN
  ## 取log2
  exprSet_clean <- log2(exprSet)
  print("log2 transform finished")
}else{
  print("log2 transform not needed")
}

boxplot(exprSet_clean,outline=FALSE, notch=T, las=2)  ##出箱线图
### limma的函数归一化,矫正差异  ,表达矩阵自动log2化 得到exprSet_clean
#+==================================================================================
#+========================================================================================



# saving all data to the path
save(exprSet_clean, file ="exprSet_clean_75percent_filter.RData")

上述处理得到了干净的基因表达矩阵,数据部分已经没有问题,但是在做数据挖掘(差异分析、富集分析等)之前还有一项准备工作,要将数据样本进行分组,即患病组、对照组。

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

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

相关文章

Elasticsearch基础篇(三):Elasticsearch7.x的集群部署

Elasticsearch的集群部署 1. Elasticsearch集群架构主节点数据节点客户端节点分片节点间通信集群状态 2. Elasticsearch集群部署2.1 系统配置修改2.1.1 修改文件句柄数和线程数2.1.2 修改虚拟内存2.1.3 关闭交换空间&#xff08;Swap&#xff09; 2.2 下载es数据库并上传到服务…

企业部署,springboot+vue+vue,Linux上部署mysql与redis,docker中部署nginx,jenkins。完整详细。

企业项目部署全流程笔记 前言 涉及&#xff1a;Linux服务器&#xff0c;docker&#xff0c;Jenkins&#xff0c;nginx&#xff0c;springoot&#xff0c;vue&#xff0c;mysql&#xff0c;redis&#xff0c;git&#xff0c; docker生成容器类型&#xff1a;MySql&#xff0c…

5G消息发展的前景与挑战

随着5G技术的快速发展和普及&#xff0c;5G消息正逐渐成为全球通信领域的新焦点。 随着5G技术的快速发展和普及&#xff0c;5G消息正逐渐成为全球通信领域的新焦点。 5G消息发展呈现规模化、产业化趋势 自2020年4月国内三大运营商联合发布5G消息白皮书以来&#xff0c;已经过…

Ubuntu20.04.1编译qt6.5.3版mysql驱动

下载qtbase6.5.3源码&#xff0c;将plugin中sqldrivers源码拷至于项目工程中&#xff0c;使用qtcreator打开文件 1、下载mysql开发库 sudo apt-get update sudo apt-get install build-essential libmysqlclient-dev 2、在msyql子目录中CMakeLists.txt第一行添加头文件、引…

面试必考精华版Leetcode236. 二叉树的最近公共祖先

题目&#xff1a; 代码(首刷看解析 10.1&#xff09;&#xff1a; class Solution { public:TreeNode* ansnullptr;bool FindSon(TreeNode* root,TreeNode* p,TreeNode* q){if(root nullptr) return false;bool lson FindSon(root->left,p,q);bool rson FindSon(root-&…

力扣 -- 712. 两个字符串的最小ASCII删除和

解题过程&#xff1a; 参考代码&#xff1a; class Solution { public:int minimumDeleteSum(string s1, string s2) {int ms1.size();int ns2.size();//求两个字符串的总ASCII和int sum0;for(const auto& e:s1){sume;}for(const auto& e:s2){sume;}//多开一行&#x…

数据结构与算法-(6)---栈的应用-(2)进制转换

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

基于STM32设计的智能化钻杆系统(华为云IOT)

一、项目引言 在现代石油、天然气等资源勘探和开采过程中,钻井是一项关键的工艺。为了提高钻井作业的准确性和效率,我们设计了一种基于STM32的智能化钻杆系统。该系统利用先进的控制和通信技术,实现了远程控制管子的转动和移动角度,并通过管子设备端的OLED显示屏显示接收到…

Docker从认识到实践再到底层原理(八)|Docker网络

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

WiFi网络分析工具Airtool for Mac

Airtool是一款Mac平台上的WiFi网络分析工具&#xff0c;它可以帮助用户监测、分析和管理无线网络。 以下是Airtool的一些主要功能和特点&#xff1a; 实时监测&#xff1a;Airtool可以实时监测当前Mac设备所连接的WiFi网络&#xff0c;包括网络速度、信号强度、连接状态等。信…

Linux CentOS7 vim重复行

在用vim编辑处理文件时&#xff0c;会有重复行。有的是情境需要&#xff0c;有的可能是误操作而形成。对于正常形成的重复行&#xff0c;我们不作讨论&#xff0c;我们仅讨论什么情况下会出现重复行&#xff0c;如何避免&#xff0c;如何处理。 在文件中的单行或多个连续空白行…

Docker从认识到实践再到底层原理(九)|Docker Compose 容器编排

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

每日一练-Q1-大数加法-20231001

目录 1.题目描述 2.输入描述 3.示例提示 4.问题分析 5.通过代码 1.题目描述 大数一直是一个c语言的一个难题。 现在我们需要你手动模拟出大数加法过程。 请你给出两个大整数加法结果。 2.输入描述 第一行输入整数n&#xff0c;第二行输入整数m。 (1<number<1e100)…

Leetcode 224. 基本计算器

文章目录 题目代码&#xff08;10.1 首刷看解析&#xff09; 题目 Leetcode 224. 基本计算器 代码&#xff08;10.1 首刷看解析&#xff09; class Solution { public:int calculate(string s) {stack<int> sk; // 存储正负号sk.push(1);int sign 1;int res 0;int i…

优维低代码实践:应用级配置

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

【Vue】Vuex详解,一文读懂并使用Vuex

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

一图带你了解封装与分用

一、前缀知识 IP地址&#xff1a;用于定位主机的网络地址。 端口号&#xff1a;区分主机上不同的应用程序。 协议&#xff1a;描述了网络通信传输的数据的含义。 二、TCP/IP五层网络模型 物理层&#xff1a;描述了网络通信中基础设施的规范。 数据链路层&#xff1a;相邻节点之…

fcntl函数 非阻塞轮询

fcntl&#xff08;&#xff09; 在打开的文件描述符 FD 上执行下面描述的操作之一。 操作由 cmd 确定。 fcntl&#xff08;&#xff09; 可以采用可选的第三个参数。 是否需要此参数由 cmd 确定。 所需的参数类型在后面的括号中指示。 每个cmd名称&#xff08;在大多数情况下&…

公众号迁移是什么?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不…

博弈论——劳资博弈

劳资博弈 0 引言 前一篇文章介绍了静态博弈中常见的几个案例以及场景&#xff0c;并且在此之前也还介绍过斯塔克尔伯格博弈等动态博弈&#xff0c;以及相关的解决方法——反应函数法。今天我们继续介绍一个常见的动态博弈——劳资博弈&#xff0c;并利用反应函数解决&#xff…