#r #ggplot2 #errorbar
#r #ggplot2 #панель ошибок
Вопрос:
Для контекста: я рассматриваю несколько разных коэффициентов корреляции.Для каждой корреляции я создал распределение с начальной загрузкой, и я использую метод начальной загрузки процентилей для создания доверительных интервалов для каждого коэффициента. Поскольку я рассматриваю множественные корреляции, на самом деле я использую более строгий альфа-уровень, и в будущем мне нужно будет повторить этот анализ для разных наборов данных с разными альфа-коррекциями. Все это прошло хорошо, но я изо всех сил пытаюсь создать график для представления пользовательских интервалов в виде полос ошибок.
Вопрос: Как мне создать график в ggplot для представления медианных значений моих данных вместе с пользовательскими процентилями для моих полос ошибок. Мои данные находятся в data.frame с одной переменной, идентифицирующей группу (анализ), и второй переменной со всеми оценками в группе. На самом деле существует 10 000 обращений для каждого уровня переменной «Analysis» в общей сложности для 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 (см. Ссылку и код ниже), но мне бы очень хотелось, чтобы медианные значения каждого распределения были представлены, а процентили — в виде полос ошибок. Я могу получить медианные значения или прямоугольную диаграмму для представления этих данных, но мне нужны пользовательские процентили.
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), и, похоже, ни один из них не работает. Единственный способ, которым я смог добиться успеха, — это добавлять сегменты линий к графику по отдельности, как я бы делал в базовой R-графике со стрелками () (код и ссылку см. Ниже), но должен быть способ получше.Я новичок в ggplot, поэтому, возможно, есть простое исправление, но я в тупике.
#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. Что говорит вам о том, что в ваших данных вверху одна строка является медианной, одна — верхним диапазоном, а одна — нижним?
2. Данные представляют собой коэффициенты корреляции, созданные с помощью процедуры начальной загрузки, и в data.frame нет строк сводной статистики. Я проиндексировал это здесь для краткости, но на самом деле существует 10 000 случаев для каждого уровня фактора анализа.
Ответ №1:
Здесь мы немного рискуем, предполагая, что максимальное значение для каждой группы анализа — это то, что вы хотите отобразить как верхний предел строки ошибок, минимальное значение — это нижний предел строки ошибок, а то, что осталось, должно быть медианой. Примечание — вы предоставили только две строки для 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 пакетом reprex (версия 0.2.1)
Комментарии:
1. Спасибо. Чтобы убедиться, что я понимаю ваш подход и как я мог бы его применить, концептуально создайте новый data.frame, состоящий из сводной статистики для того, где вы хотите видеть нижний конец строки ошибок, верхний конец строки ошибок и точку. Преобразуйте указанный data.frame в широкий формат и используйте ymin и ymax для определения полос ошибок. Это правильно? Я попытался использовать предоставленный вами код, и R выдал следующую ошибку. Ошибка в
[.data.frame
(d, ,:=
(var, ifelse(Dist == min(Dist), «lower», : неиспользуемый аргумент (by = Анализ) появляется после строки, которая начинается с d[, var.2. @s. Уэсли беквит — да, это общий подход. Ошибка связана с тем, что не был загружен пакет data.table, который я использовал для агрегирования по группам. Вы, конечно, можете использовать другие пакеты или базовый R.