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

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

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

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

相关文章

NPM- 滚动进度可视化插件

目录 progress-scroll 滚动进度插件&#x1f4e6; 体验&#x1f30d; 安装&#x1f6f9; 注入&#x1f389; 配置 &#x1f916; 使用方法&#x1f4dd; 使用示例 Demo.vue &#x1f48c; 原理 progress-scroll 滚动进度插件 &#x1f916;&#x1f389;&#x1f389; 您的 进度…

基于ChatGPT+词向量/词嵌入实现相似商品推荐

最近一个项目有个业务场景是相似商品推荐&#xff0c;给一个商品描述(比如 WIENER A/B 7IN 5/LB FZN )&#xff0c;系统给出商品库中最相似的TOP 5种商品&#xff0c;这种单纯的推荐系统用词向量就可以实现&#xff0c;不过&#xff0c;这个项目特点是商品库巨大&#xff0c;有…

Windows环境下下载安装Elasticsearch和Kibana

Windows环境下下载安装Elasticsearch和Kibana 首先说明这里选择的版本都是7.17 &#xff0c;为什么不选择新版本&#xff0c;新版本有很多坑&#xff0c;要去踩&#xff0c;就用7就够了。 Elasticsearch下载 Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;最初由…

Qt多工程同名字段自动翻译工具

开发背景 项目里不同工程经常会引用同一批公共类&#xff0c;这些类里如果有字段需要翻译&#xff0c;需要在不同的项目里都翻译一遍&#xff0c;比较麻烦冗余。 特此开发了这个小翻译工具&#xff0c;能读取程序目录下的所有ts文件&#xff0c;以类名归类&#xff0c;不同项目…

Linux基础指令笔记大全

Linux基础指令笔记大全 1. ls 指令2. pwd命令3. cd 指令4. touch指令5. mkdir指令6. rmdir指令 && rm 指令7. man指令8.cp指令9. mv指令10. cat 指令11. more指令12. less指令13. head指令14. tail指令15. 时间相关的指令1. **在显示方面&#xff0c;使用者可以设定欲显…

免费的ChatGPT与StableDiffusion AI绘画 二合一 附在线地址

ChatGPT与StableDiffusion 在线地址在文末 介绍 嘿&#xff0c;大家好&#xff01;今天我要给大家介绍一个非常酷炫的技术结合——ChatGPT与StableDiffusion的合作。听起来是不是很有趣&#xff1f;那么&#xff0c;让我们一起来看看这个组合到底能带给我们什么样的奇妙体验…

空间精密定位与导航VR模拟培训软件突破了时空限制

随着科技的飞速发展&#xff0c;测绘遥感技术逐渐成为地理信息获取的重要手段。然而&#xff0c;传统的测绘展示方式存在着诸多局限性&#xff0c;无法充分展现出测绘数据的精细化和多元化&#xff0c;成为为解决这一难题的有效途径。 测绘工程专业作为时下就业率爆棚的专业之一…

数据结构和算法——排序算法

目录 排序的分类&#xff1a; 内部排序&#xff1a; 插入排序&#xff1a; 直接插入排序&#xff1a; 希尔排序&#xff1a; 选择排序&#xff1a; 简单选择排序&#xff1a; 堆排序&#xff1a; 交换排序&#xff1a; 冒泡排序&#xff1a; 快速排序 归并排序&…

k8spod就绪检查失败

pod 一直未就绪 kube-system metrics-server-7764f6c67c-2kts9 0/1 Running 0 10m kubect describe 查看 就绪探针未通过 Normal Started 3m19s kubelet Started container metrics-server Warning Unhealthy 5s (x20 over 2m55s) kubelet Readiness probe failed: HTTP probe…

ArcGIS: 第二届全国大学生GIS技能大赛(广西师范学院)详解-下午题

目录 01 题目 02 思路和实操 2.1 流域提取-思路 2.2 流域提取-实操 2.2.1 获取DEM ​编辑 2.2.2 水文分析-提取流域基于单出水口 2.3 河网分级-思路 2.4 河网分级-实操 2.4.1 提取河道网络 2.4.2 河网分级 ​编辑 2.5 子流域提取和处理-思路 2.6 子流域提取和处理-实…

HTML5的新增表单元素

HTML5 有以下新的表单元素: <datalist> <keygen> <output> datalist datalist 元素规定输入域的选项列表。 datalist属性规定 form 或 input 域应该拥有自动完成功能。当用户在自动完成域中开始输入时&#xff0c;浏览器应该在该域中显示填写的选项&…

前端-uniapp-开发指南

美团外卖微信小程序开发 uniapp-美团外卖微信小程序开发P1 成果展示P2外卖小程序后端&#xff0c;学习给小程序写http接口P3 主界面配置P4 首页组件拆分P13 外卖列表布局筛选组件商家 布局测试数据创建样式 请求商家外卖数据封装请求并发请求 uni-app框架调用https接口 开发小程…