У меня есть некоторые данные о пациентах, где отдельные пациенты меняют группы лечения с течением времени. Моя цель - визуализировать последовательность изменений группы и объединить эти данные в «профиль последовательности» для каждой группы лечения.
Для каждой группы лечения я хотел бы показать, когда это обычно происходит
в цикле лечения (скажем, скорее в начале или в конце). Чтобы учесть различную длину последовательности, я хотел бы стандартизировать эти профили между n 0 (самое начало) и 1 (конец).
Я хотел бы найти эффективную подготовку и визуализацию данных.
Mininmal Пример
Структура данных
library(dplyr)
library(purrr)
library(ggplot2)
# minimal data
cj_df_raw <- tibble::tribble(
~id, ~group,
1, "A",
1, "B",
2, "A",
2, "B",
2, "A"
)
# compute "intervals" for each person [start, end]
cj_df_raw %>%
group_by(id) %>%
mutate(pos = row_number(),
len = length(id),
start = (pos - 1) / len,
end = pos / len) %>%
filter(group == "A")
#> # A tibble: 3 x 6
#> # Groups: id [2]
#> id group pos len start end
#> <dbl> <chr> <int> <int> <dbl> <dbl>
#> 1 1 A 1 2 0 0.5
#> 2 2 A 1 3 0 0.333
#> 3 2 A 3 3 0.667 1
(Таким образом, Id 1 был в группе A в первых 50% их последовательности, а Id 2 был в группе A в первых 33% и последних 33% их последовательности. Это означает, что 2 идентификатора были между 0 -33% последовательности, 1 между 33-50%, 0 между 50-66% и 1 выше 66%.)
Это результат, которого я хотел бы достичь, и я упускаю шанс эффективно преобразовать свои данные.
Желаемый результат
profile_treatmen_a <- tibble::tribble(
~x, ~y,
0, 0L,
0.33, 2L,
0.5, 1L,
0.66, 0L,
1, 1L,
1, 0L
)
profile_treatmen_a %>%
ggplot(aes(x, y)) +
geom_step(direction = "vh") +
expand_limits(x = c(0, 1), y = 0)
(в идеале область под кривой должна быть затенена)
Идеальное решение: через мосты
Целью визуализации было бы сравнение «профиля последовательности» многих групп лечения одновременно. Если бы я мог подготовить данные соответствующим образом, я бы хотел использовать пакет ggridges для поразительного визуального сравнения групп лечения.
library(ggridges)
data.frame(group = rep(letters[1:2], each=20),
mean = rep(2, each=20)) %>%
mutate(count = runif(nrow(.))) %>%
ggplot(aes(x=count, y=group, fill=group)) +
geom_ridgeline(stat="binline", binwidth=0.5, scale=0.9)