Среднее и доверительный интервал для групп переменных в 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).
Любая помощь / помощь в этом была бы отличной. Дайте мне знать, если понадобятся какие-либо разъяснения, и я обязательно отредактирую свой первоначальный пост.
ОБНОВИТЬ
После некоторых замечательных ответов (спасибо Робу и Стивену) я почувствовал, что мне нужно немного прояснить мой вопрос. Я хотел бы получить статистику для каждой группы (не индивидуально) для всей статистики (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)
Тем не менее, вы должны рассмотреть возможность использования точечного графика для отображения ваших данных.
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()
что дает вам