高级练习题笔记

高级题链接:http://www.bio-info-trainee.com/3409.html

第一题

#1
#切换镜像
rm(list = ls()) 
options()$repos 
options()$BioC_mirror
options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/")
options("repos" = c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
#对于CRAN包,install.package
#对于bioconductor包,BiocManager::install("package_name",ask = F,update = F)

第二题

#2
suppressPackageStartupMessages(library(CLL))
data(sCLLex) #sCLLex是依赖于CLL这个package的一个对象
sCLLex
dat=exprs(sCLLex)
dim(dat)
dat[1:5,1:5] #提取表达矩阵并查看
samples=sampleNames(sCLLex) #提取样本信息
pdata=pData(sCLLex)
group_list=as.character(pdata[,2])
group_list #提取分组信息并查看

第三题

#3
str(dat)
head(dat)

第四题

#4
#BiocManager::install('hgu95av2.db')
suppressPackageStartupMessages(library(hgu95av2.db))
ls("package:hgu95av2.db")

第五题

#5
ids = toTable(hgu95av2SYMBOL) #用toTable函数提取探针和基因的对应关系
head(ids)
ids[ids$symbol=='TP53',] #找到TP53对应的探针

第六题

#6
table(ids$symbol) #table很关键
sort(table(ids$symbol))
sort(table(ids$symbol),decreasing = T)[1] #最多对应8个探针
plot(table(sort(table(ids$symbol)))) #直接画图可以看到整体情况
probe_num.png

第七题

#7
table(rownames(dat) %in% ids$probe_id) #可以看到有1165个探针没有对应的基因名

第八题

#8
dim(dat)
dat[1:4,1:4]
dat = dat[rownames(dat) %in% ids$probe_id,] #过滤表达矩阵
dat = dat[ids$probe_id,] #一样的效果
dim(dat)
dat[1:4,1:4] #处理前后检查一下表达矩阵,事半功倍

第九题

#9
#以下是我摸索match函数用法的过程
a = c('a','b','c')
b = c('b','c','a')
match(a,b)
match(b,a)
rm(a,b)

ids$mean = apply(dat,1,mean)
ids = ids[order(ids$symbol,ids$mean,decreasing = T),]
ids = ids[!duplicated(ids$symbol),]
dat = dat[ids$probe_id,] #常规的过滤步骤

第十题

#10
rownames(dat) = ids$symbol

第十一题

#11
dat[,1]
boxplot(dat[,1])
hist(dat[,1])
plot(density(dat[,1]))

library(reshape2)
dat_L=melt(dat) #宽矩阵变长矩阵
colnames(dat_L)=c('symbol','sample','value')
dat_L$group=rep(group_list,each=nrow(dat)) #特别注意加上each参数
head(dat_L)
library(ggplot2)
p=ggplot(dat_L,aes(x=sample,y=value,fill=group))+geom_boxplot() #ggplot的“映射”概念,按照group来涂色
print(p)
p=ggplot(dat_L,aes(x=sample,y=value,fill=group))+geom_violin()
print(p)
#这两张图横轴上字太多了,略丑,后面会调整
p=ggplot(dat_L,aes(value,fill=group))+geom_histogram(bins = 200)+facet_wrap(~sample, nrow = 4) #facet_wrap一张画布画多图
print(p)
p=ggplot(dat_L,aes(value,col=group))+geom_density()+facet_wrap(~sample, nrow = 4)
print(p)
p=ggplot(dat_L,aes(x=sample,y=value,fill=group))+geom_boxplot()
p=p+stat_summary(fun.y="mean",geom="point",shape=23,size=3,fill="red")
p=p+theme_set(theme_set(theme_bw(base_size=20)))
p=p+theme(text=element_text(face='bold'),axis.text.x=element_text(angle=30,hjust=1),axis.title=element_blank())
print(p)
ggsave(filename = "test.png")
#高级箱线图,添加了表示均值的红点,改变了背景,调整了横轴标签

多图预警!


boxplot.png
histogram.png
density.png
ggplot-boxplot.png
ggplot-violin.png

上面这两张图横轴上字太多了,略丑,后面会调整


ggplot-hist.png
ggplot-density.png
ggplot-boxplot-advanced.png

第十二题

#12
# apply(dat,1,mean)
# apply(dat,1,max)
# apply(dat,1,min)
# apply(dat,1,median)
# apply(dat,1,sd)
# apply(dat,1,var)
# apply(dat,1,mad) #这些本质都是一样的

top = sort(apply(dat,1,mad),decreasing = T)[1:50]
#tail(sort(apply(exprSet,1,mad)),50) #一样的效果
str(top)
#题目中说这题不合规,我猜测可能是因为1.拿已筛选的表达矩阵来做这步处理以偏概全;2.得到的不是列表

第十三题

#13
dat2=dat[rownames(dat) %in% names(top),]
pheatmap::pheatmap(t(scale(t(dat2))))
pheatmap::pheatmap(dat2,scale = 'row') #两种画法本质一样
#暂时没有采用另外几个热图画法
heatmap.png

第十四题

#14
g_mean <- tail(sort(apply(dat,1,mean)),50)
g_median <- tail(sort(apply(dat,1,median)),50)
g_max <- tail(sort(apply(dat,1,max)),50)
g_min <- tail(sort(apply(dat,1,min)),50)
g_sd <- tail(sort(apply(dat,1,sd)),50)
g_var <- tail(sort(apply(dat,1,var)),50)
g_mad <- tail(sort(apply(dat,1,mad)),50)
#首先取这一堆统计量的top50基因

library(UpSetR) #看重叠部分要用到这个包
g_all <- unique(c(names(g_mean),names(g_median),names(g_max),names(g_min),
                  names(g_sd),names(g_var),names(g_mad)))
df=data.frame(g_all=g_all,
               g_mean=ifelse(g_all %in%  names(g_mean) ,1,0),
               g_median=ifelse(g_all %in%  names(g_median) ,1,0),
               g_max=ifelse(g_all %in%  names(g_max) ,1,0),
               g_min=ifelse(g_all %in%  names(g_min) ,1,0),
               g_sd=ifelse(g_all %in%  names(g_sd) ,1,0),
               g_var=ifelse(g_all %in%  names(g_var) ,1,0),
               g_mad=ifelse(g_all %in%  names(g_mad) ,1,0)
)
upset(df,nsets = 7) #以后可以套用的常规流程
overlap.png

第十五题

#15
#之前的pdata就是表型数据,还从中取了一个group_list

第十六题

#16
#清理一下工作环境
save(dat,pdata,group_list,file = 'input.Rdata')
rm(list = ls())
options(stringsAsFactors = F)
load(file = 'input.Rdata')

colnames(dat) = paste(group_list,1:22,sep='') #参考答案的,想不出这步说明我还没有彻底适应R语言的“向量”概念
#从这步开始就是聚类分析常规步骤
nodePar <- list(lab.cex = 0.6, pch = c(NA, 19), 
                cex = 0.8, col = "red") #定义聚类图里的点长啥样
hc=hclust(dist(t(dat))) #用dist计算“距离”
par(mar=c(3,2,2,3)) #调整画板参数(页边距)
plot(as.dendrogram(hc), nodePar = nodePar,  horiz = TRUE)
hclust.png

第十七题

#17
#清理一下工作环境
save(dat,pdata,group_list,file = 'input.Rdata')
rm(list = ls())
options(stringsAsFactors = F)
load(file = 'input.Rdata')

#PCA的基本步骤
#BiocManager::install('ggfortify')
library(ggfortify)
df=as.data.frame(t(dat))
df$group=group_list
autoplot(prcomp(df[,1:(ncol(df)-1)]), data = df, colour = 'group') #prcomp是进行主成分分析的函数

library("FactoMineR")
library("factoextra") #画主成分分析图需要加载这两个包
df=as.data.frame(t(dat))
dat.pca <- PCA(df, graph = FALSE) #之前prcomp的东西是带有分组信息的,现在重新赋值一个dat.pca,不带分组信息。
fviz_pca_ind(dat.pca,
             geom.ind = "point", # show points only (nbut not "text")
             col.ind = group_list, # color by groups
             # palette = c("#00AFBB", "#E7B800"),
             addEllipses = TRUE, # Concentration ellipses
             legend.title = "Groups"
)
PCA1.png
PCA2.png

第十八题

#18
#清理一下工作环境
save(dat,pdata,group_list,file = 'input.Rdata')
rm(list = ls())
options(stringsAsFactors = F)
load(file = 'input.Rdata')

#t检验
pvals = apply(dat, 1, function(x){
  t.test(as.numeric(x)~group_list)$p.value
}) #要尽量避免循环,多用apply
p.adj = p.adjust(pvals, method = "BH")
#以下都是参考答案的,这才知道虽然题目只说了“批量t检验”,但既然是差异分析就要有fold change
group1 = which(group_list == "progres.")
group2 = which(group_list == "stable") #获取分组索引
dat1 = dat[, group1]
dat2 = dat[, group2] #分离表达矩阵
# 答案中是化为因子后再操作的,其实可以直接做
# group_list=as.factor(group_list)
# group1 = which(group_list == levels(group_list)[1])
# group2 = which(group_list == levels(group_list)[2]) #获取分组索引
# dat1 = dat[, group1]
# dat2 = dat[, group2] #分离表达矩阵
# dat = cbind(dat1, dat2)
avg_1 = rowMeans(dat1)
avg_2 = rowMeans(dat2)
log2FC = avg_2-avg_1
DEG_t.test = cbind(avg_1, avg_2, log2FC, pvals, p.adj)
DEG_t.test=DEG_t.test[order(DEG_t.test[,4]),] #按照原始p值排列
DEG_t.test=as.data.frame(DEG_t.test)
head(DEG_t.test)

第十九题

#19
#DEG by limma 
#流程:design-contrast.matrix-step1/2/3
library(limma)
design <- model.matrix(~0 + factor(group_list))
colnames(design)=levels(factor(group_list))
rownames(design)=colnames(dat)
design
contrast.matrix <- makeContrasts(paste0(unique(group_list), collapse = "-"), levels = design)
contrast.matrix
#step1
fit <- lmFit(dat,design)
#step2
fit2 <- contrasts.fit(fit, contrast.matrix)
fit2 <- eBayes(fit2)  ## default no trend !!!
#eBayes() with trend=TRUE
#step3
tempOutput = topTable(fit2, coef=1, n=Inf)
DEG = na.omit(tempOutput) 
#write.csv(nrDEG2,"limma_notrend.results.csv",quote = F)
head(DEG)

#以下是画火山图的代码
logFC_cutoff <- with(DEG,mean(abs(logFC)) + 2*sd(abs(logFC))) #先找一个分界线
DEG$change = as.factor(ifelse(DEG$P.Value < 0.05 & abs(DEG$logFC) > logFC_cutoff,
                              ifelse(DEG$logFC > logFC_cutoff ,'UP','DOWN'),'NOT')
) #定义上调、下调和无变化
this_tile <- paste0('Cutoff for logFC is ',round(logFC_cutoff,3),
                    '\nThe number of up gene is ',nrow(DEG[DEG$change =='UP',]) ,
                    '\nThe number of down gene is ',nrow(DEG[DEG$change =='DOWN',])
) #编辑火山图的标题
this_tile
head(DEG)
g = ggplot(data=DEG, aes(x=logFC, y=-log10(P.Value), color=change)) +
  geom_point(alpha=0.4, size=1.75) +
  theme_set(theme_set(theme_bw(base_size=20)))+
  xlab("log2 fold change") + ylab("-log10 p-value") +
  ggtitle( this_tile  ) + theme(plot.title = element_text(size=15,hjust = 0.5))+
  scale_colour_manual(values = c('blue','black','red')) #颜色是根据DEG$change来涂的
print(g)

volcano.png

第二十题

#20
head(DEG)
head(DEG_t.test)
DEG_t.test=DEG_t.test[rownames(DEG),] #首先使两个数据框的行名顺序一致
plot(DEG_t.test[,3],DEG[,1]) #可以看到两种方法得到的fold change负相关,这是因为两次的谁和谁比不一样
plot(DEG_t.test[,4],DEG[,4]) #可以看到使用limma包和t.test的p值差异不大
plot(-log10(DEG_t.test[,4]),-log10(DEG[,4]))
logFC.png
p-value.png
-lg p.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容