Полосы ошибок на графике логарифмического масштаба?

#r #ggplot2 #logarithm #errorbar

#r #ggplot2 #логарифм #строка ошибок

Вопрос:

Итак, как правильно отображать полосы ошибок при построении точек в логарифмическом масштабе? Поскольку полосы ошибок симметричны в абсолютном масштабе, я думал, что они будут асимметричными в логарифмическом масштабе. Однако с помощью приведенного ниже кода они отображаются как симметричные в логарифмическом масштабе. Мой первоначальный вопрос был «Правильно ли код отображает полосы ошибок?» После небольшого просмотра я остаюсь немного неуверенным.

  • Я все еще не совсем уверен, что он правильно отображает полосы ошибок. Тем не менее, я склоняюсь к пониманию того, что он отображает «относительные» полосы ошибок, которые, по его мнению, являются правильными полосами ошибок для отображения зарегистрированных данных.
  • Могу ли я отобразить столбики абсолютных ошибок на логарифмической шкале каким-либо простым способом? Есть ли параметр, который я пропустил, который позволит мне переключить этот переключатель?
  • Возможно, в более общем плане, почему относительные полосы ошибок в пространстве журнала считаются «правильными»?
 library(ggplot2
pde=1.1 #position dodge for error bars
pdp=0.35 #position dodge for points
p<-ggplot(data=mtcars, aes(x=vs, y=mpg, colour=factor(am))) 
  geom_point(position=position_dodge(width=pdp), size=3) 
  stat_summary( fun = "mean", geom="point", size=2,stroke=1.1, position=position_dodge(width=pde))  
  stat_summary( fun.data = "mean_se", geom = "errorbar", width=0.15, position=position_dodge(width=pde)) 
  scale_y_log10(limits = c(1,150))
 

Ответ №1:

В справке coord_trans() объясняется, что масштабные преобразования (например, scale_y_log10() ) выполняются до вычисления статистики, в то время как преобразования координат (например, coord_trans(y="log10") ) выполняются после вычисления статистики.

В вашем случае это означает, что scale_y_log10 среднее значение и se вычисляются по данным, преобразованным в журнал, а не по исходным нетрансформированным данным. Чтобы вычислить статистику по нетрансформированным данным, удалите scale_y_log10() и используйте coord_trans(y="log10") .

В приведенном ниже примере показаны значения, которые ggplot вычисляет внутри, а затем воспроизводит эти значения путем прямого вычисления:

 library(tidyverse)

pde=1.1 #position dodge for error bars
pdp=0.35 #position dodge for points

p1 = ggplot(data=mtcars, aes(x=vs, y=mpg, colour=factor(am)))  
  geom_point(position=position_dodge(width=pdp), size=3)  
  stat_summary(fun = "mean", geom="point", size=2, stroke=1.1,
               position=position_dodge(width=pde))  
  stat_summary( fun.data = "mean_se", geom = "errorbar", 
                width=0.15, position=position_dodge(width=pde))  
  theme_bw() 

p2 = p1   scale_y_log10() 

# Get data frames for each set of mean/errorbar layers
#  that ggplot calculates internally 
p1dat = ggplot_build(p1)$data[[3]]
p2dat = ggplot_build(p2)$data[[3]]

p1dat %>% select(y, ymin, ymax)
#>          y     ymin     ymax
#> 1 15.05000 14.24910 15.85090
#> 2 20.74286 19.80888 21.67683
#> 3 19.75000 18.11339 21.38661
#> 4 28.37143 26.57319 30.16967

p2dat %>% select(y, ymin, ymax) %>% 
  mutate(y.trans = 10^y,
         ymax.trans = 10^ymax)
#>          y     ymin     ymax  y.trans ymax.trans
#> 1 1.170219 1.145648 1.194790 14.79853   15.65992
#> 2 1.314225 1.294657 1.333793 20.61699   21.56718
#> 3 1.288104 1.252044 1.324165 19.41353   21.09431
#> 4 1.447286 1.418346 1.476226 28.00826   29.93823
 

Теперь воспроизведите те же значения путем прямого вычисления:

 mtcars %>% 
  group_by(am, vs) %>% 
  summarise(mean = mean(mpg),
            mean.log = mean(log10(mpg)),
            mean.log.trans = 10^mean.log,
            mean.plus.se = mean   sqrt(var(mpg)/length(mpg)),
            se.log = sqrt(var(log10(mpg))/length(mpg)),
            mean.log.plus.se = mean.log   se.log,
            mean.log.plus.se.trans = 10^mean.log.plus.se)

#>   am vs     mean mean.log mean.log.trans mean.plus.se     se.log
#> 1  0  0 15.05000 1.170219       14.79853     15.85090 0.02457101
#> 2  0  1 20.74286 1.314225       20.61699     21.67683 0.01956814
#> 3  1  0 19.75000 1.288104       19.41353     21.38661 0.03606088
#> 4  1  1 28.37143 1.447286       28.00826     30.16967 0.02893993
#>   mean.log.plus.se mean.log.plus.se.trans
#> 1         1.194790               15.65992
#> 2         1.333793               21.56718
#> 3         1.324165               21.09431
#> 4         1.476226               29.93823
 

И мы также можем видеть, что coord_trans(y="log10") вычисляет средние значения и столбцы ошибок перед преобразованием журнала:

 p3 = p1   coord_trans(y="log10")
p3dat = ggplot_build(p3)$data[[3]]

p3dat %>% select(y, ymin, ymax)
#>          y     ymin     ymax
#> 1 15.05000 14.24910 15.85090
#> 2 20.74286 19.80888 21.67683
#> 3 19.75000 18.11339 21.38661
#> 4 28.37143 26.57319 30.16967