Как добавить значение p корреляции Спирмена вместе с коэффициентом корреляции к ggpairs? - PullRequest
1 голос
/ 08 мая 2020

Построение фигуры ggpairs в R с использованием следующего кода.

df - это фрейм данных, содержащий 6 непрерывных переменных и одну Группа переменная

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"))

Я пытаюсь добавить p-значение корреляции Спирмена на верхнюю панель сгенерированная цифра (то есть) добавленная к коэффициенту корреляции Спирмена.

Как правило, p-значение вычисляется с использованием cor.test с методом, переданным как «Spearman»

Также известно из обсуждения публикации StackOverFlow запроса, похожего на этот, но мне нужен ggpairs, для которого решение не работает. Кроме того, предыдущий запрос еще не решен.

Как сложить значения p для коэффициентов корреляции Спирмена, построенных с использованием пар в R

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Работает хорошо. Но значащее округление, вероятно, не очень хорошо и не работает для p-значения. Позвольте мне объяснить почему? Signif не будет округлять значение p меньше 0,01 и будет печатать значение как таковое (с 10-й степенью, представленной как e). Допустим, мы используем круглую функцию, тогда тоже не годится. Потому что, если значение 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()

0 голосов
/ 08 мая 2020

У меня такое чувство, что это больше, чем вы ожидали ... поэтому вам нужно определить специальную функцию, например ggally_cor , поэтому сначала у нас есть функция, которая печатает корреляцию между двумя переменными:

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")
}

Затем мы определяем функцию, которая принимает данные для каждой пары и вычисляет 1. общую корреляцию, 2. корреляцию по группам, и передает ее в ggplot и в основном выводит только этот текст:

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
}

Теперь я использую mtcars, первый столбец представляет собой случайную группу:

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

И график:

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")) 

enter image description here

Я думаю, что для вашего собственного сюжета интервал текста может быть не оптимальным, но это просто вопрос настройки my_fn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...