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

#r #ggplot2 #bar-chart #statistical-test

#r #ggplot2 #гистограмма #статистический тест

Вопрос:

Я пытаюсь построить гистограмму в 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 я получаю следующий график

Постройте здесь — гистограмма

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

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


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

участник реплика расстояние RT время Группа
P1 допустимо далеко 1461 T1 4
P1 неверно рядом 1416 T1 4
P1 неверно рядом 1409 T1 4
P1 неверно далеко 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"))
 

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

Комментарии:

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

2. Номер группы все тот же?

3. эти данные относятся только к одному участнику. в программе около 20 участников, и у каждого участника около 360 испытаний (180 в t1, 180 в t2)

4. Теперь у вас есть 9 записей с одинаковыми участниками, сигналами, расстоянием, временем и группой! вы хотели построить их среднее значение со стандартным отклонением?

5. @masher что можно сделать для включения статистики?

Ответ №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)
 

Создано 2021-01-27 пакетом reprex (версия 0.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())
 

Создано 2021-01-27 пакетом reprex (версия 0.3.0)

Комментарии:

1. Извините, я полностью пропустил переменную в наборе данных. Мне нужно добавить к этому еще одну независимую переменную, расстояние — дальнее и ближнее. Я отредактирую вопрос и добавлю детали

2. Это будет проблемой. Вам нужно будет отфильтровать это перед построением графика.

3. Я отфильтровал данные и удалил выбросы. Как я могу добавить новую переменную?

4. Я попробовал мутировать fn, но получил ошибку. Error: Problem with мутировать ввод (). cue x не удалось найти функцию «fct_rev», которую я ввел cue fct_rev(cue) . `

5. а ты library(tidyverse) ? Похоже, вы не загрузили библиотеку forcats.