#r #ggplot2 #linear-regression #intervals #prediction
#r #ggplot2 #линейная регрессия #интервалы #прогнозирование
Вопрос:
У меня есть фрейм данных, который содержит прогнозы и интервалы прогнозирования двух категориальных переменных (двоичных), и я хотел бы отобразить их на одном графике.
Пример фрейма данных (df):
block condition response fit lwr upr
1 1 reward yes 3388.629 2089.910 4687.348
2 2 reward yes 3372.682 2074.191 4671.173
....
Варианты: вознаграждение да, вознаграждение нет, Нет вознаграждения да, нет вознаграждения нет.
Я хотел бы получить график такого типа, но включающий все параметры (я думаю, четыре строки):
Я попытался изменить следующий код, но безрезультатно:
library("ggplot2")
p <- ggplot(df, aes(?, ?))
geom_point()
stat_smooth(method = lm)
# 3. Add prediction intervals
p geom_line(aes(y = lwr), color = "red", linetype = "dashed")
geom_line(aes(y = upr), color = "red", linetype = "dashed")
Я хотел бы использовать ggplot, но я понятия не имею, как я могу поместить туда все 4 строки. Любая помощь была бы отличной!
Комментарии:
1. Если я вас правильно понял, исходя из вашего рисунка, вам нужны доверительные и прогнозные диапазоны. Контроль достоверности для ваших параметров и диапазонов прогнозирования для ваших прогнозов. Это правильно?
2. у вас нет ваших данных в показанном фрейме данных. Они нужны вам для построения точек
3. Нет, я просто хочу показать полосы прогнозирования, а не доверительные интервалы.
4. Я не включил весь фрейм данных целиком, так как он очень большой..
Ответ №1:
График, который вы включили в свой вопрос, состоит из двух непрерывных переменных, построенных друг против друга, поэтому вы не можете использовать этот тип графика для своих данных. Вы говорите, что у вас есть две категориальные переменные, но на самом деле у вас их три: block
, condition
и response
.
Если вы строите верхние, нижние и подогнанные значения для двух категориальных переменных, естественным способом сделать это в ggplot является использование geom_errorbar
одной из ваших категориальных переменных на оси x, а другая представлена цветом полос, которые «уклоняются» в каждой позиции оси x, чтобы они былиотдельно друг от друга.
У вас есть несколько вариантов того, как вы работаете с различными блоками. Если у вас небольшое число, вы можете поместить каждый блок в свой собственный аспект. Если у вас большое число, вам может потребоваться объединить ваши данные для усреднения блоков.
Двух строк предоставленного вами фрейма данных недостаточно, чтобы сказать, какой из них будет лучше, поэтому давайте составим аналогичный набор данных. Здесь мы предположим, что есть 4 блока:
set.seed(1)
df <- data.frame(block = rep(1:4, 4),
condition = rep(rep(c("reward", "no reward"), each = 4), 2),
response = rep(c("yes", "no"), each = 8),
fit = rep(c(3400, 3200, 3300, 2900), each = 4)
rnorm(16, 0, 10),
lwr = rep(c(2080, 1900, 2000, 1600), each = 4)
rnorm(16, 0, 10),
upr = rep(c(4700, 4500, 4600, 4200), each = 4)
rnorm(16, 0, 10))
df
#> block condition response fit lwr upr
#> 1 1 reward yes 3393.735 2079.838 4703.877
#> 2 2 reward yes 3401.836 2089.438 4699.462
#> 3 3 reward yes 3391.644 2088.212 4686.229
#> 4 4 reward yes 3415.953 2085.939 4695.850
#> 5 1 no reward yes 3203.295 1909.190 4496.057
#> 6 2 no reward yes 3191.795 1907.821 4499.407
#> 7 3 no reward yes 3204.874 1900.746 4511.000
#> 8 4 no reward yes 3207.383 1880.106 4507.632
#> 9 1 reward no 3305.758 2006.198 4598.355
#> 10 2 reward no 3296.946 1999.439 4597.466
#> 11 3 reward no 3315.118 1998.442 4606.970
#> 12 4 reward no 3303.898 1985.292 4605.567
#> 13 1 no reward no 2893.788 1595.218 4193.112
#> 14 2 no reward no 2877.853 1604.179 4192.925
#> 15 3 no reward no 2911.249 1613.587 4203.646
#> 16 4 no reward no 2899.551 1598.972 4207.685
Таким образом, мы имеем те же имена и порядок столбцов, что и ваши собственные данные, и в целом аналогичные значения для числовых столбцов.
Очевидным способом построения этого ggplot было бы:
library(ggplot2)
ggplot(within(df, block <- paste("Block", block)),
aes(condition, fit, color = response, group = response))
geom_errorbar(aes(min = lwr, max = upr), size = 1.5,
width = 0.25, position = position_dodge())
geom_point(position = position_dodge(width = 0.25), color = "black")
facet_wrap(.~block, nrow = 2)
theme_bw()
Если вы хотите объединить блоки, вы можете получить единую панель с:
library(ggplot2)
library(dplyr)
df %>%
group_by(condition, response) %>%
summarise(across(c("fit", "lwr", "upr"), mean)) %>%
ggplot(aes(condition, fit, color = response, group = response))
geom_errorbar(aes(min = lwr, max = upr), size = 1.5,
width = 0.25, position = position_dodge())
geom_point(position = position_dodge(width = 0.25), color = "black")
theme_bw()
Редактировать
Другой альтернативой является построение блоков по оси x и фасету с помощью condition
:
ggplot(within(df, block <- paste("Block", block)),
aes(block, fit, color = response, group = response))
geom_errorbar(aes(min = lwr, max = upr), size = 1.5,
width = 0.25, position = position_dodge())
geom_point(position = position_dodge(width = 0.25), color = "black")
facet_grid(condition~.)
theme_bw()
Комментарии:
1. Большое вам спасибо, Аллан, и я действительно забыл о переменной block. есть 14 различных блоков, и я также хотел бы визуализировать эффект блока. Можно ли как-то сделать это без построения 14 различных графиков?
2. Потому что, если бы я использовал последний график, который вы предложили, я бы потерял информацию из эффекта блока, поскольку она агрегирована. Это правильно?
3. @Баклажан да, как я показал в конце вопроса, вы можете объединить блоки вместе, хотя при этом теряется некоторая информация. Другим вариантом было бы огранить по условию и поместить блок на ось x
4. Да, лучшим решением было бы поместить блок на ось X! Я изменил код следующим образом:
df %>% group_by(condition, response, block) %>% summarise(across(c("fit", "lwr", "upr"), mean)) %>% ggplot(aes(block, fit, color = condition, group = response)) geom_errorbar(aes(min = lwr, max = upr), size = 1.5, width = 0.25, position = position_dodge()) geom_point(position = position_dodge(width = 0.25), color = "black") theme_bw()
я думаю, что это выглядит очень хорошо! (если вы не собираетесь сказать, что я сделал что-то ужасно неправильное в коде:’))