Получение нескольких полос погрешностей на гистограмме (R)

Я пытаюсь построить гистограмму в R с 4 независимыми переменными - время (t1, t2), группа (1,2,3,4,5), расстояние (далеко и близко) и сигнал (действительный и недействительный) с RT как зависимая переменная. Для того же я использовал следующий код

ggplot(b, aes(x=cue, y=RT, fill = cue))+
  geom_bar(stat="identity", position = position_dodge(),  width = .9)+
  facet_grid(group~time,  space="free_x") +
  geom_errorbar(aes(ymin= RT-se, ymax = RT+se), width = 0.2, color = "BLACK", position=position_dodge())+
  coord_cartesian(ylim = c(200,1500))+theme(legend.title = element_blank())

При запуске кодов в R я получаю следующий график

График здесь - столбчатый график

Можно ли переставить реплику (действительную / недействительную, а также расстояние (ближнюю / дальнюю) по убыванию (и то и другое должно выполняться вместе).

Полосы ошибок кажутся не по центру, как это исправить? Кроме того, могу ли я статистически сравнить два элемента (например, сравнение действительного и недопустимого в группе 1, time1) и обозначить их на графике?


Набор данных для каждого участника выглядит примерно так:

participant cue distance RT time group
P1 valid far 1461 T1 4
P1 invalid near 1416 T1 4
P1 invalid near 1409 T1 4
P1 invalid far 1351 T1 4

# ------ Обновленный запрос

Я обновил график, как показано здесь новый график. Планки погрешностей кажутся слишком маленькими, чтобы их можно было увидеть. Это почему?

Я хочу сравнить допустимые и недопустимые переменные для каждой категории. То есть сравните действительный и недействительный для ближних и дальних категорий для каждой группы.

Вот коды, которые я использовал до сих пор:

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                      conf.interval=.95, .drop=TRUE) {
  
  
  # New version of length which can handle NA's: if na.rm==T, don't count them 
  length2 <- function (x, na.rm=FALSE) {
    if (na.rm) sum(!is.na(x))
    else       length(x)
  }
  
  # This does the summary. For each group's data frame, return a vector with
  # N, mean, and sd
  datac <- ddply(data, groupvars, .drop=.drop,
                 .fun = function(xx, col) {
                   c(N    = length2(xx[[col]], na.rm=na.rm),
                     mean = mean   (xx[[col]], na.rm=na.rm),
                     sd   = sd     (xx[[col]], na.rm=na.rm)
                   )
                 },
                 measurevar
  )
  
  # Rename the "mean" column    
  datac <- plyr::rename(datac, c("mean" = measurevar))
  
  datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean
  
  # Confidence interval multiplier for standard error
  # Calculate t-statistic for confidence interval: 
  # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
  ciMult <- qt(conf.interval/2 + .5, datac$N-1)
  datac$ci <- datac$se * ciMult
  
  return(datac)
}

data<- read.table("trialdata.csv", header=TRUE, sep=",")

b<- summarySE(data, measurevar="RT", groupvars=c("cue", "distance", "time", "group"))


b %>% 
  mutate(cue = fct_rev(cue)) %>% mutate(distance = fct_rev(distance))%>%
ggplot( aes(x=distance, y=RT, fill = cue))+
  geom_bar(stat="identity", position = "dodge", width = 0.5)+
  facet_grid(group~time,  space="free_x") +
  geom_errorbar(aes(ymin= RT - se, ymax = RT + se), width = 0.08, color = "BLACK", position = position_dodge(0.5))+
    scale_fill_manual(values = c( "grey",  "dimgrey" ), 
                    labels = c("valid", "invalid"))

Что еще мне нужно сделать, чтобы включить статистические сравнения?


person Christina    schedule 27.01.2021    source источник
comment
Можете ли вы опубликовать свои исходные данные? Я создал фиктивный набор данных, но не могу воспроизвести вашу проблему. Может это проблема с очисткой данных.   -  person masher    schedule 27.01.2021
comment
Номер группы у всех одинаковый?   -  person masher    schedule 27.01.2021
comment
это данные всего одного участника. есть около 20 участников, и каждый участник имеет около 360 испытаний (180 в t1, 180 в t2)   -  person Christina    schedule 27.01.2021
comment
Теперь у вас есть 9 записей с одинаковым участником, сигналом, расстоянием, временем и группой! вы хотите построить среднее из них со стандартным отклонением?   -  person masher    schedule 27.01.2021
comment
@masher, что можно сделать, чтобы учесть статистику?   -  person Christina    schedule 27.01.2021
comment
Полосы ошибок такие маленькие, потому что они такие маленькие. Они представляют собой 95% ДИ среднего значения. Какую еще статистику вы хотите включить?   -  person masher    schedule 28.01.2021


Ответы (1)


#--------------------------

Отвечайте после редактирования вопроса.

Выравнивание полосы ошибок выполняется вызовом position_dodge. Недействительный / действительный переупорядочение - это вызов fct_rev. Статистическое сравнение зависит от того, что вы действительно хотите показать, а затем попытайтесь выяснить, как вы хотите это показать.

library(tidyverse)
b <- tribble(
  ~participant, ~cue, ~distance, ~RT, ~time, ~group,
  "P1", "valid",    "far",  1461,   "T1",   4,
  "P1", "invalid",  "near", 1416,   "T1",   4,
  "P1", "invalid",  "near", 1409,   "T1",   4,
  "P1", "invalid",  "far",  1351,   "T1",   4,
  "P1", "invalid",  "far",  1391,   "T1",   4,
  "P1", "invalid",  "far",  1365,   "T1",   4,
  "P1", "invalid",  "far",  1385,   "T1",   4,
  "P1", "invalid",  "near", 1465,   "T1",   4,
  "P1", "valid",    "near", 1451,   "T1",   4,
  "P1", "valid",    "near", 1397,   "T1",   4,
  "P1", "valid",    "far",  1466,   "T1",   4,
  "P1", "invalid",  "far",  1411,   "T1",   4,
  "P1", "invalid",  "near", 1439,   "T1",   4,
  "P1", "valid",    "far",  1328,   "T1",   4,
  "P1", "valid",    "far",  1437,   "T1",   4,
  "P1", "valid",    "far",  1376,   "T1",   4,
  "P1", "invalid",  "far",  1364,   "T1",   4,
  "P1", "invalid",  "near", 1451,   "T1",   4,
  "P1", "valid",    "far",  1461,   "T1",   4,
  "P1", "invalid",  "far",  1441,   "T1",   4,
  "P1", "valid",    "near", 1491,   "T1",   4,
  "P1", "valid",    "near", 1385,   "T1",   4,
  "P1", "valid",    "near", 1553,   "T1",   4,
  "P1", "invalid",  "far",  1484,   "T1",   4,
  "P1", "valid",    "far",  1449,   "T1",   4,
  "P1", "invalid",  "near", 1361,   "T1",   4,
  "P1", "invalid",  "near", 1399,   "T1",   4,
  "P1", "invalid",  "near", 1389,   "T1",   4,
  "P1", "valid",    "near", 1378,   "T1",   4,
  "P1", "valid",    "near", 1365,   "T1",   4,
  "P1", "valid",    "far",  1465,   "T1",   4,
  "P1", "valid",    "near", 1333,   "T1",   4,
  "P1", "valid",    "near", 1340,   "T1",   4,
  "P1", "invalid",  "far",  1347,   "T1",   4,
  "P1", "valid",    "far",  1375,   "T1",   4,
  "P1", "valid",    "near",  390,   "T2",   4,
  "P1", "invalid",  "far",   394,   "T2",   4,
  "P1", "invalid",  "near",  374,   "T2",   4,
  "P1", "valid",    "far",   363,   "T2",   4,
  "P1", "valid",    "near",  342,   "T2",   4,
  "P1", "invalid",  "far",   421,   "T2",   4,
  "P1", "invalid",  "near",  398,   "T2",   4,
  "P1", "invalid",  "near",  419,   "T2",   4
)


b %>% 
  group_by(participant, cue, distance, time, group) %>% 
  summarise(RT_mean = mean(RT), 
            RT_sd = sd(RT)) %>% 
  filter(participant == "P1") %>% #not strictly necessary in this instance, but will be in general.
  mutate(cue = fct_rev(cue)) %>% 
ggplot(aes(x=cue, y=RT_mean, fill = distance))+
  geom_bar(stat="identity", position = position_dodge(),  width = .9)+
  facet_grid(group~time,  space="free_x") +
  geom_errorbar(aes(ymin= RT_mean - RT_sd, ymax = RT_mean + RT_sd), 
                width = 0.2, color = "BLACK", 
                position=position_dodge(0.9))+ #the 0.9 here should the same value as the width in geom_bar
                                              #  to keep the error bar centred.
  coord_cartesian(ylim = c(200,1500))+theme(legend.title = element_blank())
#> `summarise()` regrouping output by 'participant', 'cue', 'distance', 'time' (override with `.groups` argument)

Создано 27 января 2021 года пакетом REPEX (v0.3.0)

#--------------------------

Оригинальный ответ

Я сделал фиктивный набор данных и думаю, что у вас может быть проблема с качеством данных. Обратите внимание, что первые две строки b имеют одинаковую метку, время и группу, но разные RT. Можете ли вы опубликовать свои исходные данные?

Порядок действительных / недействительных можно изменить с помощью пакета forcats, как в моем втором примере.

library(tidyverse)
cue <- c("invalid",   "invalid","valid","invalid","valid","invalid","valid","invalid","valid")
time <- c("T1",           "T1","T1","T2","T2","T1","T1","T2","T2")
group <- c(1,                1,1,1,1,2,2,2,2)
RT <- c(1000,             1200,1300,400,500,700,800,300,400)
ci <- c(50,                100,100,100,100,50,50,50,50)

b <- tibble(cue,time,group,RT,ci)

b
#> # A tibble: 9 x 5
#>   cue     time  group    RT    ci
#>   <chr>   <chr> <dbl> <dbl> <dbl>
#> 1 invalid T1        1  1000    50
#> 2 invalid T1        1  1200   100
#> 3 valid   T1        1  1300   100
#> 4 invalid T2        1   400   100
#> 5 valid   T2        1   500   100
#> 6 invalid T1        2   700    50
#> 7 valid   T1        2   800    50
#> 8 invalid T2        2   300    50
#> 9 valid   T2        2   400    50

ggplot(b,aes(x=cue, y=RT, fill = cue))+
  geom_bar(stat="identity", position = position_dodge(),  width = .9)+
  facet_grid(group~time,  space="free_x") +
  geom_errorbar(aes(ymin= RT - ci, ymax = RT + ci), width = 0.2, color = "BLACK", position=position_dodge())+
  coord_cartesian(ylim = c(200,1500))+theme(legend.title = element_blank())



#reverse the order of the "invalid"/"valid"
b %>% 
  mutate(cue = fct_rev(cue)) %>% 
ggplot(aes(x=cue, y=RT, fill = cue))+
  geom_bar(stat="identity", position = position_dodge(),  width = .9)+
  facet_grid(group~time,  space="free_x") +
  geom_errorbar(aes(ymin= RT - ci, ymax = RT + ci), width = 0.2, color = "BLACK", position=position_dodge())+
  coord_cartesian(ylim = c(200,1500))+theme(legend.title = element_blank())

Создано 27 января 2021 года пакетом REPEX (v0.3.0)

person masher    schedule 27.01.2021
comment
Извините, я полностью пропустил переменную в наборе данных. Мне нужно добавить к этому еще одну независимую переменную, distance - far and near. Отредактирую вопрос и добавлю подробности - person Christina; 27.01.2021
comment
Это будет проблемой. Вам нужно будет отфильтровать это перед построением графика. - person masher; 27.01.2021
comment
Я отфильтровал данные и удалил выбросы. Как я могу добавить новую переменную? - person Christina; 27.01.2021
comment
Я попробовал изменить fn, но получил ошибку. Error: Problem with mutate () `input cue. x не удалось найти функцию fct_rev i Вход cue - fct_rev(cue). - person Christina; 27.01.2021
comment
ты library(tidyverse)? Похоже, вы не загрузили библиотеку forcats. - person masher; 27.01.2021