Среднее и доверительный интервал для групп переменных в R

Я новичок в R и пытаюсь сделать что-то, что, на мой взгляд, должно быть очень простым, но онлайн-код не помог.

data <- structure(list(Group = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3), 
Time = c(1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2), mean_PctPasses = c(68.26, 
60.2666666666667, 62.05, 66.3833333333333, 59.7333333333333, 
69.7714285714286, 57.1888888888889, 63.8875, 61.1833333333333, 
59.775, 66.2666666666667, 62.12), mean_AvgPassing = c(7.3, 
7.01111111111111, 6.35, 9.26666666666667, 6.68333333333333, 
8.78571428571429, 5.87777777777778, 8.3125, 7.63333333333333, 
7.7, 8.38333333333334, 6.89), mean_AvgRush = c(0.3, -0.3, 
3.5, 0.75, 5, 1.47142857142857, 5.71111111111111, 3.3875, 
2.74, 6.6, 4.5, 5), mean_Int = c(0.2, 0.777777777777778, 
0.25, 0.5, 1.5, 0.857142857142857, 0.777777777777778, 0.75, 
0.666666666666667, 0.75, 0.833333333333333, 1.1), mean_Rate = c(99.3, 
88.5222222222222, 80.5, 106.45, 77.2333333333333, 102.885714285714, 
76.8888888888889, 100.075, 92.1166666666667, 78.55, 98.05, 
79.56)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-12L), .Names = c("Group", "Time", "mean_PctPasses", "mean_AvgPassing", 
"mean_AvgRush", "mean_Int", "mean_Rate"))

Используя этот набор данных, у меня есть 2 групповые переменные "Группа" и "Время". Я хотел бы получить средние значения и доверительные интервалы в формате таблицы для каждой из этих комбинаций для переменных mean_PctPasses, чтобы mean_Rate и сохранить результат, чтобы он был в таблице. Мне нужно, чтобы это было в таблице, потому что я буду ссылаться на это позже в заговоре. Сделать это в SPSS довольно легко.

Я попытался несколько функций и ниже проблемы, которые у меня были с каждым

library(rcompanion)    
ci.mean(mean_PctPasses~Group+Time, data = data)

library(DescTools)
MeanCI(data$mean_PctPasses)

library(Rmisc)
CI(data$mean_PctPasses,    ci=0.95)

MeanCI, ci.mean и CI не допускают перечисления нескольких переменных и сохраняются в виде таблицы (отображается только в консоли)

by(data = data, data$Group, FUN = stat.desc)

Это не позволит мне сгруппировать данные по группам и времени. Ниже приведен пример графика, который я надеюсь построить в R (показан в SPSS).

Пример SPSS

Любая помощь / помощь в этом была бы отличной. Дайте мне знать, если понадобятся какие-либо разъяснения, и я обязательно отредактирую свой первоначальный пост.

ОБНОВИТЬ

После некоторых замечательных ответов (спасибо Робу и Стивену) я почувствовал, что мне нужно немного прояснить мой вопрос. Я хотел бы получить статистику для каждой группы (не индивидуально) для всей статистики (mean_PctPasses to mean_Rate). Пример функции, которая выдает статистику, которую я хотел бы получить для одной переменной, показан ниже с использованием библиотеки Rmisc (Rmisc) group.UCL(mean_PctPasses~Group+Time, data, FUN=CI). Это дает мне следующий вывод только для вывода mean_PctPasses Использование Rmisc

Но то, что я хотел бы иметь, - это следующее (которое я сфотографировал) Изображение Desired Ouput

Это, конечно, может быть показано в другой ориентации (пример ниже с SPSS и SEM). Пример альтернативной ориентации в SPSS

5 ответов

Предполагая, что вы просто хотите обычный не-объединенный доверительный интервал для каждой группы, которую вы можете сделать

require(dplyr)
alpha <- 0.05

data %>% 
    group_by(Group, Time) %>% 
    summarize(mean = mean(mean_PctPasses),
              lower = mean(mean_PctPasses) - qt(1- alpha/2, (n() - 1))*sd(mean_PctPasses)/sqrt(n()),
              upper = mean(mean_PctPasses) + qt(1- alpha/2, (n() - 1))*sd(mean_PctPasses)/sqrt(n()))

Делать это с R это тоже легко.

Другой способ, используя CI() от Rmisc:

library(dplyr)
library(Rmisc)
library(ggplot2)

data <- 
  data %>%
  group_by(Group, Time) %>%
  dplyr::summarise(avg_PctPasses = mean(mean_PctPasses), 
            uci_PctPasses = CI(mean_PctPasses)[1], 
            lci_PctPasses = CI(mean_PctPasses)[3]) %>%
  mutate(Time = Time %>% as.factor())

По общему признанию, я не большой поклонник "магических чисел" после звонка CI(),

Построение данных одинаково просто.

data %>%
  ggplot(aes(x = Group, y = avg_PctPasses, fill = Time)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_errorbar(aes(ymin = lci_PctPasses, ymax = uci_PctPasses), position = "dodge")

введите описание изображения здесь

Возможно, вам будет интересно воспроизвести стиль SPSS с помощью базовой графики R.

library(DescTools)

z <- with(data, 
      aggregate(mean_PctPasses, list(Time, Group), MeanCI))
z <- xtabs(x ~ Group.1 + Group.2, z)

par(mar=c(5.1,4.1,4.1,8.1))
b <- barplot(z[,,1], beside=TRUE, ylim=c(0, 140), 
         col=c("royalblue3","limegreen"), las=1, 
         xlab="Group", ylab="Mean mean_PctPasses",
         panel.first={
           rect(par("usr")[1], par("usr")[3],          
                par("usr")[2], par("usr")[4], 
                col="grey85")
         })

 ErrBars(from=z[,,2], to=z[,,3], pos=b)
 legend(x="topright", legend=c("1","2"), title="Time", bty="n", 
   fill=c("royalblue3","limegreen"), inset=c(-.2, 0), xpd=TRUE)

барплот в стиле SPSS

Тем не менее, вы должны рассмотреть возможность использования точечного графика для отображения ваших данных.

col <- c("royalblue3","limegreen")
PlotDot(z[,,1], args.errbars = list(from=z[,,2], to=z[,,3], mid=z[,,1],
                                pch=22, bg.pch=col, cex.pch=1.5), 
    color = col, lcolor = NA, 
    panel.first=abline(v=seq(0,150,10), col="grey", lty="dotted"))

точечный график по группам

Может быть, проще работать с одной переменной за раз. Есть более простой способ сделать это.

Вам необходимо установить/загрузить пакет Hmisc, используя библиотеку()

      my_data <- data %>%
    group_by(Group, Time) %>% 
    summarise(N = n(), ci = list(enframe(Hmisc::smean.cl.normal(mean_PctPasses)))) %>% 
    unnest() %>% 
    spread(name, value)

print(my_data)

Вот результат:

Это выглядит лучше/аккуратнее, если вы group_by() используете одну переменную за раз (и повторяете для всех количественных переменных):

       my_data <- data %>%
   group_by(Group, Time) %>% 
   summarise(N = n(), ci = list(enframe(Hmisc::smean.cl.normal(mean_PctPasses)))) %>% 
   unnest() %>% 
   spread(name, value)

 print(my_data)

С выходом:

Обновление tidyr 1.0.0

В качестве элегантной альтернативы summarise ранее решения, полезно знать, что новый Приведенныеtidyr 1.0.0 содержит функцию, о которой часто забывают: unnest_wider. При этом вы можете упростить код до следующего:

      data.to.plot <- data %>% 
  nest(data = -"Group") %>%
  mutate(ci = map(data, ~ MeanCI(.x$mean_PctPasses))) %>% 
  unnest_wider(ci)

который дает

      # A tibble: 3 x 5
  Group data              mean lwr.ci upr.ci
  <dbl> <list>           <dbl>  <dbl>  <dbl>
1     1 <tibble [4 × 6]>  64.2   58.3   70.1
2     2 <tibble [4 × 6]>  62.6   53.9   71.4
3     3 <tibble [4 × 6]>  62.3   57.9   66.8

Вы можете легко построить это с помощью

        ggplot(aes(x = Group, y = mean)) +
  geom_bar(aes (fill = Group), stat = "identity") +
  geom_errorbar(
    aes(
      ymin = lwr.ci, ymax = upr.ci,
      width = 0.5
    ),
    size = 0.5 # line thickness
  ) + 
  coord_flip() +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() 

что дает вам

Другие вопросы по тегам