R ggplot пользовательские процентили - PullRequest
1 голос
/ 09 марта 2019

Для контекста: Я смотрю на несколько различных коэффициентов корреляции. Для каждой корреляции я создал загрузочное распределение, и я использую метод процентили начальной загрузки, чтобы создать доверительные интервалы для каждого коэффициента.Поскольку я смотрю на множественные корреляции, я на самом деле использую более строгий альфа-уровень, и мне нужно будет повторить этот анализ для разных наборов данных с различными альфа-поправками в будущем.Все это прошло хорошо, но я изо всех сил пытаюсь создать график, представляющий пользовательские интервалы в виде полос ошибок.

Вопрос: Как создать график в ggplot для представления медианных значений моих данных вместе с пользовательскими процентилями для моих панелей ошибок.Мои данные находятся в data.frame с одной переменной, идентифицирующей группу (анализ), и второй переменной со всеми оценками в группе.Фактически существует 10 000 случаев для каждого уровня переменной «Анализ», что в общей сложности составляет 40 000 строк.Я включил распечатку индекса для краткости непосредственно ниже.

 >BootDistOverall[c(1:2,10000:10002,20000:20002,30000:30002),]
                             Analysis       Dist
  1      Alpha by Consequences (No Outlier) -0.4286326
  2      Alpha by Consequences (No Outlier) -0.4191646
  10000  Alpha by Consequences (No Outlier) -0.5248891
  10001 Alpha by Past-30-Day Binge Drinking -0.2972018
  10002 Alpha by Past-30-Day Binge Drinking -0.3011621
  20000 Alpha by Past-30-Day Binge Drinking -0.4145920
  20001                  Q0 by Consequences  0.3689336
  20002                  Q0 by Consequences  0.4540535
  30000                  Q0 by Consequences  0.5772917
  30001    Q0 by Past-30-Day Binge Drinking  0.6655952
  30002    Q0 by Past-30-Day Binge Drinking  0.4412748

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

Violin plot

p0 <- <-ggplot(BootDistOverall, aes(Analysis,Dist))+ 
    geom_violin(scale = "area", 
    color = "#002344", 
    size = 1, 
    fill = "#FECB00")+ 
    ylim(-1,1)+
    geom_hline(yintercept = 0, 
        linetype = "dashed", 
        color = "black")+
    xlab("Analysis")+
    ylab("Bootstrapped Pearson's r")+
    coord_flip()+
    theme_bw()

Мне нужна помощь в создании аналогичного графика, но с точками для медианы и панелями ошибок, соответствующими моим пользовательским процентилям.Я пробовал несколько разных методов (geom_errorbar, geom_pointrange), и я не могу заставить их работать.Единственный способ, которым я смог сделать работу - это добавить сегменты линий к графику индивидуально, как я сделал бы в графике base R с помощью стрелок () (см. Код и ссылку ниже), но должен быть лучший способ.Я новичок в ggplot, так что может быть простое исправление, но я в своем уме.

Points version

 #Create percentile points
  Uppers = c(
      quantile(BootDist2$Dist, .995,na.rm=T),
      quantile(BootDist4$Dist, .995,na.rm=T),
      quantile(BootDist1$Dist, .995,na.rm=T),
      quantile(BootDist3$Dist, .995,na.rm=T))

   Lowers = c(
      quantile(BootDist2$Dist, .005,na.rm=T),
      quantile(BootDist4$Dist, .005,na.rm=T),
      quantile(BootDist1$Dist, .005,na.rm=T),
      quantile(BootDist3$Dist, .005,na.rm=T))

 #Create a point graph
   ggplot(BootDistOverall, aes(x=Analysis,y=Dist))+   
      stat_summary(fun.y = mean,
           geom = "point",
           shape=22,
           size=5,
           color = "#002344",
           fill = "#FECB00")+
      theme_bw()+
      coord_flip()+
      ylim(-1,1)+
      geom_hline(yintercept = 0, 
                 linetype = "dashed", 
                 color = "black")+
      xlab("Analysis")+
      ylab("Bootstrapped Pearson's r")+
  #Add error bars with geomsemgents
      geom_segment(x=1,xend=1,y=Lowers[1],yend=Uppers[1])+
      geom_segment(x=2,xend=2,y=Lowers[2],yend=Uppers[2])+
      geom_segment(x=3,xend=3,y=Lowers[3],yend=Uppers[3])+
      geom_segment(x=4,xend=4,y=Lowers[4],yend=Uppers[4])+
      geom_segment(x=.9,xend=1.1,y=Lowers[1],yend=Lowers[1])+
      geom_segment(x=.9,xend=1.1,y=Uppers[1],yend=Uppers[1])+
      geom_segment(x=1.9,xend=2.1,y=Lowers[2],yend=Lowers[2])+
      geom_segment(x=1.9,xend=2.1,y=Uppers[2],yend=Uppers[2])+
      geom_segment(x=2.9,xend=3.1,y=Lowers[3],yend=Lowers[3])+
      geom_segment(x=2.9,xend=3.1,y=Uppers[3],yend=Uppers[3])+
      geom_segment(x=3.9,xend=4.1,y=Lowers[4],yend=Lowers[4])+
      geom_segment(x=3.9,xend=4.1,y=Uppers[4],yend=Uppers[4])

1 Ответ

1 голос
/ 09 марта 2019

Взяв здесь немного веры в предположении, что значение MAX для каждой группы анализа - это то, что вы хотите отобразить как верхний конец полосы ошибок, значение MIN - это нижний конец полосы ошибок, ито, что осталось, должно быть медианой.Обратите внимание - вы предоставили только две строки для Q0 by Past-30-Day Binge Drinking, так что это, вероятно, неверное предположение ... вам нужно изменить в соответствии с тем, что на самом деле представляют ваши данные ...

... в зависимости от того, какчтобы настроить ваши данные для построения в ggplot() - рабочая парадигма состоит в том, что у вас есть одна переменная для эстетики.Чтобы построить график ошибок, вам нужно x, y, ymin и ymax.Как только вы переформатируете свои данные, чтобы соответствовать этому, построение графика прямо вперед.Вот рабочий пример:

library(data.table)
library(ggplot2)

d <- structure(list(Analysis = c("Alpha by Consequences (No Outlier)", 
                                 "Alpha by Consequences (No Outlier)", "Alpha by Consequences (No Outlier)", 
                                 "Alpha by Past-30-Day Binge Drinking", "Alpha by Past-30-Day Binge Drinking", 
                                 "Alpha by Past-30-Day Binge Drinking", "Q0 by Consequences", 
                                 "Q0 by Consequences", "Q0 by Consequences", "Q0 by Past-30-Day Binge Drinking", 
                                 "Q0 by Past-30-Day Binge Drinking"), Dist = c(-0.4286326, -0.4191646, 
                                                                               -0.5248891, -0.2972018, -0.3011621, -0.414592, 0.3689336, 0.4540535, 
                                                                               0.5772917, 0.6655952, 0.4412748), var = c("median", "upper", 
                                                                                                                         "lower", "upper", "median", "lower", "lower", "median", "upper", 
                                                                                                                         "upper", "lower")), row.names = c(NA, -11L), class = c("data.table", 
                                                                                                                                                                                "data.frame"))
#impute which row is the min, max, and median - NOTE you only gave two rows for the last Analysis group
d[, var := ifelse(Dist == min(Dist), "lower", ifelse(Dist == max(Dist), "upper", "median")), by = Analysis]
#cast into one row per Analysis
d_wide <- dcast(Analysis ~ var, data = d, value.var = "Dist")
#plot
ggplot(d_wide, aes(Analysis, median, ymin = lower, ymax = upper)) +
  geom_errorbar(width = .4) +
  geom_point(colour = "orange", size = 4) +
  coord_flip() +
  theme_bw()
#> Warning: Removed 1 rows containing missing values (geom_point).

Создано в 2019-03-09 пакетом Представить (v0.2.1)

...