参考链接:https://mp.weixin.qq.com/suT5X_RbAildMmDM0W3R0sg
https://mp.weixin.qq.com/s/FzeaTu-OJK5YZepk3EFPQA
相关性分析是指对两个或多个具备相关性的变量元素进行分析,从而衡量两个变量因素的相关密切程度。相关性的元素之间需要存在一定的联系或者概率才可以进行相关性分析。在组学测序(如转录组)中需设置多个生物学重复,而对多个生物学重复的相关性分析,可从中判断生物学重复数据是否可以用于接下来的分析。如有出现生物学重复不一致的情况,可去除变异数据,预防某一重复数据不可用,进而影响数据的分析结果。
常见的相关性分析方法有三种:皮尔森(pearson)相关系数、斯皮尔曼(spearman)相关系数和肯德尔(kendall)相关系数。
1 皮尔森相关系数(Pearson)
皮尔森相关系数(Pearson),也称为线性相关系数,积差相关系数,1890年由英国统计学家卡尔•皮尔逊提出。是用来反映两个变量线性相关程度的统计量,适用于满足正态分布的数据。相关系数用r表示,其中n为样本量,分别为两个变量的观测值和均值。r描述的是两个变量间线性相关强弱的程度。r的绝对值越大表明相关性越强。r的取值在-1与+1之间,若r>0,表明两个变量是正相关,即一个变量的值越大,另一个变量的值也会越大;若r<0,表明两个变量是负相关,即一个变量的值越大另一个变量的值反而会越小。r 的绝对值越大表明相关性越强,要注意的是这里并不存在因果关系。若r=0,表明两个变量间不是线性相关。
2 斯皮尔曼相关性系数(spearman)
斯皮尔曼相关性系数(spearman),又称斯皮尔曼秩相关系数,是利用两变量的秩次大小作线性相关分析,而不是根据数据的实际值计算,适用于有序数据和不满足正态分布假设的等间隔数据,与Pearson相关系数相比属于非参数统计方法,具有更广的适用范围。经常用希腊字母ρ表示。
3 肯德尔相关性系数(Kendall)
肯德尔相关系数(Kendall),是一种秩相关系数。是对两个有序变量或两个秩变量之间相关程度测量,属于非参数统计。
1 数据准备
数据输入格式(csv格式):
2 R包加载及数据导入
#下载包#
install.packages("corrplot")
install.packages("ggcorrplot")
install.packages("psych")
install.packages("vcd")
#加载包#
library(corrplot)
library(ggplot2)
library(ggcorrplot)
library(vcd)
library(psych)
library(ggrepel)
#数据导入#
data<-read.table(file='C:/Rdata/jc/相关性热图数据.csv',row.names= 1,header=TRUE,sep=',') #如果row.names=1 报错可以去掉这个参数
dim(data)
data<-as.matrix(data) #利用as.matrix()将所需数据集转换为matrix格式,才可在corrplot中跑
data=data.frame(scale(data))#数据标准化
head(data)
#相关性计算
data<-cor(data,method="spearman") #pearson,spearman和kendall
round(data, 2)#保留两位小数
3 相关性热图绘制
3.1 ggcorrplot包绘制热图
#相关性热图绘制#
ggcorrplot(data, method="circle") #圆圈大小变化
#调整与美化#
ggcorrplot(data, method = "circle", #"square", "circle"相比corrplot少了很多种,只有方形和圆形,默认方形。
type ="upper" , #full完全(默认),lower下三角,upper上三角
ggtheme = ggplot2::theme_minimal,
title = "",
show.legend = TRUE, #是否显示图例。
legend.title = "Corr", #指定图例标题。
show.diag =T , #FALSE显示中间
colors = c("blue", "white", "red"), #需要长度为3的颜色向量,同时指定low,mid和high处的颜色。
outline.color = "gray", #指定方形或圆形的边线颜色。
hc.order = FALSE, #是否按hclust(层次聚类顺序)排列。
hc.method = "complete", #相当于corrplot中的hclust.method, 指定方法一样,详情见?hclust。
lab =T , #是否添加相关系数。FALSE
lab_col = "black", #指定相关系数的颜色,只有当lab=TRUE时有效。
lab_size = 4, #指定相关系数大小,只有当lab=TRUE时有效。
p.mat = NULL, #p.mat= p_mat,insig= "pch", pch.col= "red", pch.cex= 4,
sig.level = 0.05,
insig = c("pch", "blank"),
tl.cex = 12, #指定变量文本的大小,
tl.col = "black", #指定变量文本的颜色,
tl.srt = 45, #指定变量文本的旋转角度。
digits = 2 #指定相关系数的显示小数位数(默认2)。
)
3.2 corrplot包绘制相关性热图
3.2.1 corrplot包基础热图及解释
#corrplot包绘图#
corrplot(data)
corrplot(data, method="circle", #square方形,ellipse, 椭圆形,number数值,shade阴影,color颜色,pie饼图
title = "pearson", #指定标题
type="full", #full完全(默认),lower下三角,upper上三角
#col=c("#FF6666", "white", "#0066CC"), #指定图形展示的颜色,默认以均匀的颜色展示。支持grDevices包中的调色板,也支持RColorBrewer包中调色板。
outline = T, #是否添加圆形、方形或椭圆形的外边框,默认为FALSE。
diag = TRUE, #是否展示对角线上的结果,默认为TRUE
mar = c(0,0,0,0), #设置图形的四边间距。数字分别对应(bottom, left, top, right)。
bg="white", #指定背景颜色
add = FALSE, #表示是否添加到已经存在的plot中。默认FALSE生成新plot。
is.corr = TRUE, #是否为相关系数绘图,默认为TRUE,FALSE则可将其它数字矩阵进行可视化。
addgrid.col = "darkgray", #设置网格线颜色,当指定method参数为color或shade时, 默认的网格线颜色为白色,其它method则默认为灰色,也可以自定义颜色。
addCoef.col = NULL, #设置相关系数值的颜色,只有当method不是number时才有效
addCoefasPercent = FALSE, #是否将相关系数转化为百分比形式,以节省空间,默认为FALSE。
order = "original", #指定相关系数排序的方法, 可以是original原始顺序,AOE特征向量角序,FPC第一主成分顺序,hclust层次聚类顺序,alphabet字母顺序。
hclust.method = "complete", # 指定hclust中细分的方法,只有当指定order参数为hclust时有效。有7种可选:complete,ward,single,average,mcquitty,median,centroid。
addrect = NULL, #是否添加矩形框,只有当指定order参数为hclust时有效, 默认不添加, 用整数指定即可添加。
rect.col = "black", #指定矩形框的颜色。
rect.lwd = 2, #指定矩形框的线宽。
tl.pos = NULL, #指定文本标签(变量名称)相对绘图区域的位置,为"lt"(左侧和顶部),"ld"(左侧和对角线),"td"(顶部和对角线),"d"(对角线),"n"(无);当type="full"时默认"lt"。当type="lower"时默认"ld"。当type="upper"时默认"td"。
tl.cex = 1, #设置文本标签的大小
tl.col = "black", #设置文本标签的颜色。
cl.pos = NULL #设置图例位置,为"r"(右边),"b"(底部),"n"(无)之一。当type="full"/"upper"时,默认"r"; 当type="lower"时,默认"b"。
#addshade = c("negative", "positive", "all"), # 表示给增加阴影,只有当method="shade"时有效。#为"negative"(对负相关系数增加阴影135度);"positive"(对正相关系数增加阴影45度);"all"(对所有相关系数增加阴影)。
#shade.lwd = 1, #指定阴影线宽。
#shade.col = "white", #指定阴影线的颜色。
#p.mat= res1$p,sig.level= 0.01,insig= "pch", pch.col= "blue", pch.cex= 3,#只有指定矩阵的P值,sig.level,pch等参数才有效。只有当insig = "pch"时,pch.col和pch.cex参数才有效。
)
3.2.2 corrplot包图形与数值混合
#显示数字与图形混合
corrplot(data, method="circle", #square方形,ellipse, 椭圆形,number数值,shade阴影,color颜色,pie饼图
title = "pearson", #指定标题
type="full", #full完全(默认),lower下三角,upper上三角
#col=c("#FF6666", "white", "#0066CC"), #指定图形展示的颜色,默认以均匀的颜色展示。支持grDevices包中的调色板,也支持RColorBrewer包中调色板。
outline = F, #是否添加圆形、方形或椭圆形的外边框,默认为FALSE。
diag = TRUE, #是否展示对角线上的结果,默认为TRUE
mar = c(0,0,0,0), #设置图形的四边间距。数字分别对应(bottom, left, top, right)。
bg="white", #指定背景颜色
add = FALSE, #表示是否添加到已经存在的plot中。默认FALSE生成新plot。
is.corr = TRUE, #是否为相关系数绘图,默认为TRUE,FALSE则可将其它数字矩阵进行可视化。
addgrid.col = "darkgray", #设置网格线颜色,当指定method参数为color或shade时, 默认的网格线颜色为白色,其它method则默认为灰色,也可以自定义颜色。
addCoef.col = NULL, #设置相关系数值的颜色,只有当method不是number时才有效
addCoefasPercent = FALSE, #是否将相关系数转化为百分比形式,以节省空间,默认为FALSE。
order = "original", #指定相关系数排序的方法, 可以是original原始顺序,AOE特征向量角序,FPC第一主成分顺序,hclust层次聚类顺序,alphabet字母顺序。
hclust.method = "complete", # 指定hclust中细分的方法,只有当指定order参数为hclust时有效。有7种可选:complete,ward,single,average,mcquitty,median,centroid。
addrect = NULL, #是否添加矩形框,只有当指定order参数为hclust时有效, 默认不添加, 用整数指定即可添加。
rect.col = "black", #指定矩形框的颜色。
rect.lwd = 2, #指定矩形框的线宽。
tl.pos = NULL, #指定文本标签(变量名称)相对绘图区域的位置,为"lt"(左侧和顶部),"ld"(左侧和对角线),"td"(顶部和对角线),"d"(对角线),"n"(无);当type="full"时默认"lt"。当type="lower"时默认"ld"。当type="upper"时默认"td"。
tl.cex = 1, #设置文本标签的大小
tl.col = "black", #设置文本标签的颜色。
cl.pos = NULL #设置图例位置,为"r"(右边),"b"(底部),"n"(无)之一。当type="full"/"upper"时,默认"r"; 当type="lower"时,默认"b"。
#addshade = c("negative", "positive", "all"), # 表示给增加阴影,只有当method="shade"时有效。#为"negative"(对负相关系数增加阴影135度);"positive"(对正相关系数增加阴影45度);"all"(对所有相关系数增加阴影)。
#shade.lwd = 1, #指定阴影线宽。
#shade.col = "white", #指定阴影线的颜色。
#p.mat= res1$p,sig.level= 0.01,insig= "pch", pch.col= "blue", pch.cex= 3,#只有指定矩阵的P值,sig.level,pch等参数才有效。只有当insig = "pch"时,pch.col和pch.cex参数才有效。
)
corrplot(data, title = "",
method = "number", #square方形,ellipse, 椭圆形,number数值,shade阴影,color颜色,pie饼图
outline = F, #是否添加圆形、方形或椭圆形的外边框,默认为FALSE。
add = TRUE, #表示是否添加到已经存在的plot中。默认FALSE生成新plot。
type = "lower", #full完全(默认),lower下三角,upper上三角
order="original",
col="black", #指定图形展示的颜色,默认以均匀的颜色展示。支持grDevices包中的调色板,也支持RColorBrewer包中调色板。
diag=FALSE, #是否展示对角线上的结果,默认为TRUE
tl.pos="n", #指定文本标签(变量名称)相对绘图区域的位置,为"lt"(左侧和顶部),"ld"(左侧和对角线),"td"(顶部和对角线),"d"(对角线),"n"(无)
cl.pos=NULL #设置图例位置,为"r"(右边),"b"(底部),"n"(无)之一。
)
#椭圆加数值#
corrplot(data, method = "ellipse", order = "original",
addCoef.col = "black",#设置相关系数值的颜色,只有当method不是number时才有效
type="full", #full完全(默认),lower下三角,upper上三角
title = "椭圆与黑色系数值",
add = FALSE, #表示是否添加到已经存在的plot中。默认FALSE生成新plot。
diag = TRUE, #是否展示对角线上的结果,默认为TRUE
tl.cex = 1, #设置文本标签的大小
tl.col = "black", #设置文本标签的颜色。
cl.pos = NULL, #设置图例位置,为"r"(右边),"b"(底部),"n"(无)之一。当type="full"/"upper"时,默认"r"; 当type="lower"时,默认"b"。
mar = c(1,1,1,1)) #设置图形的四边间距。数字分别对应(bottom, left, top, right)。
#百分比表示#
corrplot(data, method = "ellipse", order = "original",
addCoef.col = "black",#设置相关系数值的颜色,只有当method不是number时才有效
addCoefasPercent = TRUE, #是否将相关系数转化为百分比形式,以节省空间,默认为FALSE。
type="full", #full完全(默认),lower下三角,upper上三角
title = "椭圆与黑色百分比",
add = FALSE, #表示是否添加到已经存在的plot中。默认FALSE生成新plot。
diag = TRUE, #是否展示对角线上的结果,默认为TRUE
tl.cex = 1, #设置文本标签的大小
tl.col = "black", #设置文本标签的颜色。
cl.pos = NULL, #设置图例位置,为"r"(右边),"b"(底部),"n"(无)之一。当type="full"/"upper"时,默认"r"; 当type="lower"时,默认"b"。
mar = c(1,1,1,1)) #设置图形的四边间距。数字分别对应(bottom, left, top, right)。
其他图像
corrplot(data, method = "circle")
corrplot(data, method = "square")
corrplot(cor_new, method = "pie")
corrplot(cor_new, method = "color")
corrplot(cor_new, method = "number")
更改颜色
corrplot(cor_new, method = "color", col = colorRampPalette(c("blue", "#CD2626"))(10), title = "更改颜色")
corrplot(cor_new, method = "number", col = RColorBrewer::brewer.pal(n=8, name = "RdYlGn"))
聚类显示
corrplot(cor_new,method="color",order="hclust",title = "hclust聚类", diag = TRUE,hclust.method="average",addCoef.col = "blue")
组合展示
corrplot(cor_new, method = "circle", type = "upper", tl.pos = "d")
corrplot(cor_new, add = TRUE, type = "lower", method = "number", diag = FALSE, tl.pos = "n", cl.pos = "n")
col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
corrplot(cor_new, method="color", col=col(200),
type="upper", order="hclust",
addCoef.col = "black", #添加相关系数
diag=FALSE
)
用circlize包展示
col_fun = colorRamp2(c(-1, 0, 1), c("#67BE54", "#FFFFFF", "#F82C2B"))
chordDiagram(cor_new, grid.col = 1:8, symmetric = TRUE, col = col_fun)
circos.clear()
circlize包作图非常好看,我们可以用它来做一个太极
太极图
library(circlize)
factors = 1:8
circos.par(start.degree = 22.5, gap.degree = 6)
circos.initialize(factors = factors, xlim = c(0, 1))
# yang yao is __ (a long segment)
add_yang_yao = function() {
circos.rect(0,0,1,1, col = "black")
}
# yin yao is -- (two short segments)
add_yin_yao = function() {
circos.rect(0,0,0.45,1, col = "black")
circos.rect(0.55,0,1,1, col = "black")
}
circos.track(ylim = c(0, 1), factors = factors, bg.border = NA,
panel.fun = function(x, y) {
i = get.cell.meta.data("sector.numeric.index")
if(i %in% c(2, 5, 7, 8)) add_yang_yao() else add_yin_yao()
}, track.height = 0.1)
circos.track(ylim = c(0, 1), factors = factors, bg.border = NA,
panel.fun = function(x, y) {
i = get.cell.meta.data("sector.numeric.index")
if(i %in% c(1, 6, 7, 8)) add_yang_yao() else add_yin_yao()
}, track.height = 0.1)
circos.track(ylim = c(0, 1), factors = factors, bg.border = NA,
panel.fun = function(x, y) {
i = get.cell.meta.data("sector.numeric.index")
if(i %in% c(4, 5, 6, 7)) add_yang_yao() else add_yin_yao()
}, track.height = 0.1)
# the bottom of the most recent track
r = get.cell.meta.data("cell.bottom.radius") - 0.1
# draw taiji, note default order is clock wise for `draw.sector`
draw.sector(center = c(0, 0), start.degree = 90, end.degree = -90,
rou1 = r, col = "black", border = "black")
draw.sector(center = c(0, 0), start.degree = 270, end.degree = 90,
rou1 = r, col = "white", border = "black")
draw.sector(center = c(0, r/2), start.degree = 0, end.degree = 360,
rou1 = r/2, col = "white", border = "white")
draw.sector(center = c(0, -r/2), start.degree = 0, end.degree = 360,
rou1 = r/2, col = "black", border = "black")
draw.sector(center = c(0, r/2), start.degree = 0, end.degree = 360,
rou1 = r/8, col = "black", border = "black")
draw.sector(center = c(0, -r/2), start.degree = 0, end.degree = 360,
rou1 = r/8, col = "white", border = "white")
circos.clear()
飞镖盘
factors = 1:20 # just indicate there are 20 sectors
circos.par(gap.degree = 0, cell.padding = c(0, 0, 0, 0),
start.degree = 360/20/2, track.margin = c(0, 0), clock.wise = FALSE)
circos.initialize(factors = factors, xlim = c(0, 1))
circos.track(ylim = c(0, 1), factors = factors, bg.col = "black", track.height = 0.15)
circos.trackText(x = rep(0.5, 20), y = rep(0.5, 20),
labels = c(13, 4, 18, 1, 20, 5, 12, 9, 14, 11, 8, 16, 7, 19, 3, 17, 2, 15, 10, 6),
cex = 0.8, factors = factors, col = "#EEEEEE", font = 2, facing = "downward")
circos.track(ylim = c(0, 1), factors = factors,
bg.col = rep(c("#E41A1C", "#4DAF4A"), 10), bg.border = "#EEEEEE", track.height = 0.05)
circos.track(ylim = c(0, 1), factors = factors,
bg.col = rep(c("black", "white"), 10), bg.border = "#EEEEEE", track.height = 0.275)
circos.track(ylim = c(0, 1), factors = factors,
bg.col = rep(c("#E41A1C", "#4DAF4A"), 10), bg.border = "#EEEEEE", track.height = 0.05)
circos.track(ylim = c(0, 1), factors = factors,
bg.col = rep(c("black", "white"), 10), bg.border = "#EEEEEE", track.height = 0.375)
draw.sector(center = c(0, 0), start.degree = 0, end.degree = 360,
rou1 = 0.1, col = "#4DAF4A", border = "#EEEEEE")
draw.sector(center = c(0, 0), start.degree = 0, end.degree = 360,
rou1 = 0.05, col = "#E41A1C", border = "#EEEEEE")
circos.clear()