有没有一种快速的方法在上面的面板上展示Pearson相关性,在下面的面板上展示Spearman相关性?

3

corrgram提供了绘制优雅的相关图的机会。但是,在文档中没有简单的方法可以在同一张图上获取Spearman和Pearson相关性。

也许计算两个系数的相关矩阵并粘贴它们是一种选项,但这似乎不是正确的方法。

我认为下面的图片会清楚地解释我想要得到什么:

我希望得到:

cors <- cor(state.x77, method = "pearson")
corsSp <- cor(state.x77, method = "spearman")
for(i in 1:nrow(cors))
{
for(j in i:ncol(cors))
{
cors[i,j] <- corsSp[i,j]
m[i,j] <- j
}
}
corrgram(cors, type = "corr")

以更加优雅的方式呈现。

1
你能提供一个数据集的样本或使用内置的数据集来说明失败的尝试吗? - NelsonGon
1
corrgram 只允许使用 Pearson 相关系数,来源:https://github.com/kwstat/corrgram/blob/master/R/corrgram.r - heck1
我已经编辑了我的问题,提供了一些代码。为了获得Spearman相关性,我使用 corrgram(state.x77,cor.method =“spearman”) - Jacek Mucha
3个回答

2
你可以尝试使用ggplot手动重建你的图表,这样可以得到相似的结果(除了图案背景)。"Original Answer"翻译成"最初的回答"。
library(ggplot2)
library(tibble)
library(dplyr)
library(tidyr)

## transform the cor matrix (with pearons and spearmann coeeficients) 
cor_cleaned <- cors %>%
  as.data.frame() %>%
  rownames_to_column("x") %>%
  as_tibble() %>%
  gather(y, cor, -x) %>%
  mutate(x   = factor(x, unique(x)),
         y   = factor(y, rev(levels(x))),
         dir = factor(sign(cor)))

cor_tri <- cor_cleaned %>%
  filter(x != y)

cor_diag <- cor_cleaned %>%
  filter(x == y)

ggplot(cor_tri, aes(x, y, alpha = abs(cor), fill = dir)) +
  geom_tile(show.legend = FALSE, color = "gray") +
  geom_tile(show.legend = FALSE, color = "gray", fill = NA, data = cor_diag) +
  geom_text(aes(label = y), data = cor_diag, show.legend = FALSE) + 
  scale_fill_manual(values = c("1" = "navy", "-1" = "red")) +
  theme_minimal() +
  theme(panel.grid = element_blank(),
        axis.text  = element_blank(),
        axis.title = element_blank())

Corrgram with ggplot


2

以这些数据为例:

最初的回答:

df = data.frame(x = runif(100),
                y = runif(100),
                z = runif(100),
                w = runif(100),
                v = runif(100),
                u = runif(100))

计算相关矩阵:

library("dplyr")
mat = matrix(NA, nrow = ncol(df), ncol = ncol(df)) %>%
  `row.names<-`(names(df)) %>%
  `colnames<-`(names(df))


mat[upper.tri(mat)] = cor(df,method="pearson")[upper.tri(mat)]
mat[lower.tri(mat)] = cor(df,method="spearman")[lower.tri(mat)]

将长格式转换为宽格式:

cor.long = reshape2::melt(mat)

"最初的回答":然后绘制图表:
library("ggplot2")
library("RColorBrewer")

pal = colorRampPalette(rev(brewer.pal(11, "Spectral")))

ggplot(cor.long, aes(Var1, factor(Var2, rev(levels(Var2))), fill = value)) +
  geom_tile() +
  geom_text(aes(label = Var1), data = cor.long %>% filter(Var1 == Var2)) + 
  geom_text(aes(label = value %>% round(digits = 3)), data = cor.long %>% filter(Var1 != Var2)) + 
  scale_y_discrete(limits = rev(levels(df$Var2))) +
  scale_fill_gradientn(colours = pal(100), na.value  = "white", limits=c(-.5,.5)) +
  theme(panel.background = element_blank(),
        axis.title = element_blank(),
        axis.text = element_text(angle = 45),
        legend.position = "none")

enter image description here


1

另一种计算相关矩阵的方法:

mycor <- Vectorize(function(i, j) {
   method <- ifelse(i>j, "pearson", "spearman")
   cor(state.x77[,i], state.x77[,j], method = method)
})
sqn <- 1:ncol(state.x77)
cors <- outer(sqn, sqn, FUN=mycor)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接