Ошибка: stat_summary требует следующую отсутствующую эстетику: y - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь создать barplot с ошибками с доверительным интервалом, используя ggplot. По сути, у меня есть переменная, Q1, с 7 вариантами ответов, и я хочу построить процент респондентов для каждого варианта как фактор двух групп (Один и Два) - процент субъектов в каждой группе, которые выбраликаждый из 7 вариантов ответа.

Я пытался добавить y= count, y=prop или y=..prop.. к aes в ggplot, но, похоже, это не сработало. Любые предложения приветствуются.

df5 <- filter(df, Q1!="-99",df$Group=="One"|df$Group=="Two") 

ggplot(data = df5, aes(x = Q1)) + 
 stat_summary(fun.y = mean, geom = "bar") +
 stat_summary(fun.data = mean_cl_boot, geom = "errorbar", fun.args = list(mult = 1)) +
    geom_bar(aes(label= scales::percent(..prop..),
                   y= ..prop..,fill = df5$Group), position = "dodge")

Ошибка: stat_summary требует следующей отсутствующей эстетики: y.

По сути, я пытаюсь получить что-то похожее на это,с ошибками, представляющими доверительные интервалы.

example of barplot with error bars.

1 Ответ

1 голос
/ 27 октября 2019

Обратите внимание, что есть лучший способ записать ваш первый выбор:

df5 <- df %>% filter(Q1!="-99", Group %in% c("One", "Two"))

Я рекомендую вам явно вычислить статистику перед построением графика. функция DescTools::MultinomCI() выполнит эту работу (см. документацию)

# Reproducible example: random
library(tidyverse)
n <- 1000
df5 <- tibble(
    Q1 = sample(letters[1:7], n, replace=TRUE),
    Group = sample(c("One","Two"), n, replace=TRUE)
    )

library(DescTools)
df_stats <- df5 %>% 
    count(Group, Q1) %>% 
    group_by(Group) %>% 
    do({
        df_grp <- .
        df_grp %>% 
            select(Q1, n) %>%
            bind_cols(as_tibble(MultinomCI(df_grp$n))) %>% 
            rename(prop = est)
    })

Если вы хотите использовать гистограммы:

df_stats %>% 
    ggplot(aes(Q1, y=prop, ymin=lwr.ci, ymax=upr.ci, fill=Group)) + 
    geom_col(position="dodge") + 
    geom_errorbar(position="dodge") + 
    ylim(0, NA)

(обратите внимание, что оси столбцов всегда должны начинаться с нуля,следовательно, использование ylim)

Однако, чтобы подчеркнуть различия между группами в ответах, линейный график будет гораздо более читабельным:

df_stats %>% 
    ggplot(aes(Q1, y=prop, ymin=lwr.ci, ymax=upr.ci, color=Group, group=Group)) + 
    geom_line() + 
    geom_errorbar(position="dodge", width=.2) + 
    ylim(0, NA)

resulting plot, using geom line

...