如何将Spearman相关p值与相关系数相加到ggpairs?

时间:2020-05-08 18:57:47

标签: r statistics correlation

使用以下代码在R中构造ggpairs图形。

df是一个数据帧,其中包含6个连续变量和一个 Group 变量

ggpairs(df[,-1],columns = 1:ncol(df[,-1]),
mapping=ggplot2::aes(colour = df$Group),legends = T,axisLabels = "show", 
upper = list(continuous = wrap("cor", method = "spearman", size = 2.5, hjust=0.7)))+ 
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black"))

我正在尝试将spearman相关性的p值添加到生成的图形的上面板(即,附加到Spearman相关系数中)。

通常,p值是使用cor.test通过“ Spearman”传递的方法计算的。

也了解了StackOverFlow的讨论内容,对此查询与此类似,但是我需要ggpairs,但该解决方案无法使用。此外,先前的查询尚未解决。

How to add p values for Spearman correlation coefficients plotted using pairs in R

3 个答案:

答案 0 :(得分:0)

我觉得这超出了您的预期。.因此您需要定义一个自定义函数,例如ggally_cor,因此首先我们有一个函数可以打印两个变量之间的相关性:

class Parking(models.Model):
address = models.ForeignKey(Adress, on_delete=models.CASCADE, null=False, related_name='address')
price = models.DecimalField(max_digits=4, decimal_places=2, null=True, blank=True)

class ParkingLot(models.Model):        
    parking = models.ForeignKey(Parking, on_delete=models.CASCADE, null=False, related_name='parkinglots')
    floor = models.IntegerField(null=False)

class ParkingAvailability(models.Model):
    parkinglot = models.ForeignKey(ParkingLot, on_delete=models.CASCADE, null=False, related_name='availability')
    available = models.BooleanField(null=False, blank=False)

然后,我们定义一个函数,该函数接收每对数据,并计算1.总体相关性,2.按组相关性,并将其传递到ggplot中,基本上只打印此文本:

printVar = function(x,y){
      vals = cor.test(x,y,
      method="spearman")[c("estimate","p.value")]
      names(vals) = c("rho","p")
      paste(names(vals),signif(unlist(vals),2),collapse="\n")
}

现在我使用mtcars,第一列是一个随机组:

my_fn <- function(data, mapping, ...){
  # takes in x and y for each panel
  xData <- eval_data_col(data, mapping$x)
  yData <- eval_data_col(data, mapping$y)
  colorData <- eval_data_col(data, mapping$colour)

# if you have colors, split according to color group and calculate cor

  byGroup =by(data.frame(xData,yData),colorData,function(i)printVar(i[,1],i[,2]))
  byGroup = data.frame(col=names(byGroup),label=as.character(byGroup))
  byGroup$x = 0.5
  byGroup$y = seq(0.8-0.3,0.2,length.out=nrow(byGroup))

#main correlation
mainCor = printVar(xData,yData)

p <- ggplot(data = data, mapping = mapping) +
annotate(x=0.5,y=0.8,label=mainCor,geom="text",size=3) +
geom_text(data=byGroup,inherit.aes=FALSE,
aes(x=x,y=y,col=col,label=label),size=3)+ 
theme_void() + ylim(c(0,1))
  p
}

并绘制:

df  =data.frame(
Group=sample(LETTERS[1:2],nrow(mtcars),replace=TRUE),
mtcars[,1:6]
)

enter image description here

我认为对于您自己的情节来说,文本的间距可能不是最佳的,但这只是调整ggpairs(df[,-1],columns = 1:ncol(df[,-1]), mapping=ggplot2::aes(colour = df$Group), axisLabels = "show", upper = list(continuous = my_fn))+ theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) 的问题。

答案 1 :(得分:0)

效果很好。但是四舍五入的信号可能不好,并且不适用于p值。让我解释一下为什么? Signif不会舍弃小于0.01的p值,并照此打印该值(第10次幂表示为e)。假设我们使用round函数,那么它也不是很好。因为,如果p值小于0.001,它将为0(四舍五入为2位)。同样,如果p值小于0.01,它将再次为0(舍入2位)。

因此,对代码进行轻微的修改就可以了。

printVar = function(x,y){
      vals = cor.test(x,y,
      method="spearman")[c("estimate","p.value")]

      vals[[1]]<-round(vals[[1]],2)   
      vals[[2]]<-ifelse(test = vals[[2]]<0.001,"<0.001",ifelse(test=vals[[2]]<0.01,"<0.01",round(vals[[2]],2)))

          names(vals) = c("rho","p")
      paste(names(vals),unlist(vals),collapse="\n")
}

其次,如果我们以这种方式运行代码,则会出现未找到LAB的错误。

LAB是标签所需的字符串。

您可以输入字符串。或只是通过

LAB=c()

答案 2 :(得分:0)

不确定是因为您有组还是使用不同版本的包(我使用的是 GGally_2.1.1),但以下代码对我来说非常有效。

df %>% ggpairs(upper = list(continuous = wrap("cor", method = "spearman")))
相关问题