专栏名称: 生信菜鸟团
生信菜鸟团荣誉归来,让所有想分析生物信息学数据的小伙伴找到归属,你值得拥有!
目录
相关文章推荐
生信菜鸟团  ·  基因组数据在精准医学中扮演什么角色 ·  昨天  
BioArt  ·  Nat Commun | ... ·  昨天  
BioArt  ·  专家点评Nat Chem Biol | ... ·  2 天前  
BioArt  ·  Nature | ... ·  3 天前  
生物学霸  ·  一个 80 后高校教师的苦闷 ·  3 天前  
51好读  ›  专栏  ›  生信菜鸟团

WGCNA(2)代码实操之准备阶段

生信菜鸟团  · 公众号  · 生物  · 2024-09-19 18:27

正文

学习笔记总结于『生信技能树』马拉松课程

GEO数据挖掘系列,第20篇学习笔记:WGCNA代码实操之准备阶段

0.数据预整理

本例用GEO数据库下载的数据,GSE199335

rm(list = ls())
library(tinyarray)
gse = "GSE199335"
geo = geo_download(gse,destdir=".",colon_remove = T)
geo$gpl

做WGCNA必须有15及以上的样本,否则不符合要求,没有做的意义

图0
#View(geo$pd)
library(stringr)
Group = paste(geo$pd$genotype,geo$pd$age,sep="_") %>% 
  str_remove(" months of age| weeks of age") %>% 
  str_remove(" type") %>% 
  str_replace("/",".")
table(Group)
Group = factor(Group,levels = c("wild_6""wild_9""R6.1_6""R6.2_9"))
ids $gpl,destdir = tempdir(),type = "soft")
ids = na.omit(ids)#将NA行去除
exp = trans_array(geo$exp,ids,from = "ID")#把探针表达矩阵转为基因表达矩阵
pd = geo$pd
Group
save(exp,Group,pd,file = "Dat.Rdata")

以上整理数据的代码,尤其是分组信息和探针注释,因数据而异。请观察本例的结果,当遇到其他数据时,需要变动以上代码使结果和本例的尽可能相同,才能便于后续代码的运行

后续代码主要来自WGCNA的官方文档,部分进行了一些改动

1.表达矩阵数据整理

①需要有至少15个样本

②需要行是样本,列是基因,所以需要转置

③不推荐使用全部基因,因为计算量太大

④不推荐使用差异分析所得的差异基因,包作者说的

⑤比较推荐的方法是按照方差或者mad去取前多少个基因,例如3500,5000,8000个,或者保留基因总数的前1/4。无标准答案(有选择困难的可以选5000,出现问题后再试试其他数值)

rm(list = ls())
library(WGCNA)
library(tinyarray)
load("Dat.Rdata")
#exp = log2(geo$exp+1)
png("1.exp.png", width = 2000, height = 1200,res = 300)
boxplot(exp)#检查是否有离群的样本
dev.off()

从图1可以看出数据是取过log的,且没有异常样本,可以用

图1 exp
#方法一:前5000个
datExpr0 = t(exp[order(apply(exp, 1, mad), decreasing = T)[1:5000],])

#方法二:基因总数的前1/4
# datExpr0 = t(exp[order(apply(exp, 1, var), decreasing = T)[1:round(0.25*nrow(exp))],])

datExpr0[1:4,1:4]

1.1基因过滤

主要看缺失值,GEO的芯片数据大多数没缺失值

gsg = goodSamplesGenes(datExpr0, verbose = 3)

gsg$allOK # 返回TRUE则继续,若不是TRUE,以下代码将进行处理

if (!gsg$allOK){
  # 把含有缺失值的基因或样本打印出来
  if (sum(!gsg$goodGenes)>0)
    printFlush(paste("Removing genes:", paste(names(datExpr0)[!gsg$goodGenes], collapse = ", ")));
  if (sum(!gsg$goodSamples)>0)
    printFlush(paste("Removing samples:", paste(rownames(datExpr0)[!gsg$goodSamples], collapse = ", ")));
  # 去掉那些缺失值
  datExpr0 = datExpr0[gsg$goodSamples, gsg$goodGenes]
}

1.2样本过滤

sampleTree = hclust(dist(datExpr0), method = "average")

png(file = "2.sampleClustering.png", width = 2000, height = 2000,res = 300)
par(cex = 0.6)
par(mar = c(0,4,2,0))
plot(sampleTree, main = "Sample clustering to detect outliers", sub="", xlab="", cex.lab = 1.5,
     cex.axis = 1.5, cex.main = 2)
dev.off()

看有没有自己单独一个分支的样本,如果有异常值就需要去掉

图2 sampleClustering
# 如果有离群值,以下代码将去掉该离群值
# 根据聚类图自己设置 cutHeight 参数的值
if(F){
  clust = cutreeStatic(sampleTree, cutHeight = 170, minSize = 10)
  table(clust) # 0代表切除的,1代表保留的
  keepSamples = (clust!=0)
  datExpr = datExpr0[keepSamples, ]
}
#没有异常样本就不需要去除
datExpr = datExpr0

2.表型信息整理

即临床信息的整理,这个信息来自芯片数据的pData,也就是上面的pd







请到「今天看啥」查看全文