Från Z:\SHPR\Arsrapport\2021\code\Data management knee.R
Under rubriken "PROM"
# Pre-PROM
knee_preprom <-
knee_preprom0 %>%
# AWD har önskat få hantera KOOS-variabler som numeriska.
# I övrigt föredras klartext
mutate(across(c(!matches("koos") & where(has_map)), as_factor)) %>%
mutate(across(where(~inherits(.x, "POSIXt")), ~as.Date(.x, tz = "CET")))
qs::qsave(knee_preprom, here("..", "data", "knee", "knee_preprom.qs"))
# Post-PROM
knee_postprom <-
knee_postprom0 %>%
mutate(across(c(!matches("koos") & where(has_map)), as_factor)) %>%
mutate(across(where(~inherits(.x, "POSIXt")), ~as.Date(.x, tz = "CET")))
qs::qsave(knee_postprom, here("..", "data", "knee", "knee_postprom.qs"))
# Kombinerat PROM-dataset
knee_preprom <- janitor::clean_names(knee_preprom)
knee_postprom <- janitor::clean_names(knee_postprom)
names(knee_preprom) <- gsub("prepk_", "", names(knee_preprom))
names(knee_postprom) <- gsub("postpk_", "", names(knee_postprom))
# Lägg ihop och ta bara med PROM-variabler och id
knee_prom_wide <-
bind_rows(
pre = knee_preprom,
post = knee_postprom,
.id = "when"
) %>%
# Standardisera namnsättning avseende vad som berör höger/vänster knä
rename_with(~ gsub("r_old$", "_oldr", .)) %>%
rename_with(~ gsub("l_old$", "_oldl", .)) %>%
rename_with(~ gsub("r$", "_r", .)) %>%
rename_with(~ gsub("l$", "_l", .)) %>%
rename_with(~ gsub("__", "_", .)) %>%
# Namn med r och l i slutet som misstas för right/left behöver kodas tillbaka
rename(
smoker = smoke_r,
eq5d3lprofil_old = eq5d3lprofi_old_l
) %>%
select(
# county är bra men vi lägger i hop med prim-dataoch tar den därifrån
-subject_id, -status_code, -skar_id, -unit_code, -county,
-starts_with("event_id"),
-contains("date"), date,
-proxy, -contact, -emai_l, -attend
) %>%
relocate(
SubjectKey = subject_key,
side, date, when
) %>%
arrange(SubjectKey, side, date)
# En rad per sida. Dvs en rad för de flesta men två rader för bilaterala
knee_prom_long <-
knee_prom_wide %>%
pivot_longer(
matches("_[lr]$"),
names_to = c(".value", "var_side"),
names_pattern = "(.*)_([lr])"
) %>%
mutate(var_side = factor(var_side, c("r", "l"), c("Höger", "Vänster"))) %>%
filter(as.character(side) == as.character(var_side) | side == "Båda") %>%
select(-side) %>%
rename(side = var_side) %>%
mutate(across(starts_with("eq5d_"), as.numeric, .names = "{.col}_num"))
# Länka in mot primärerna
knee_prom <-
knee_prim %>%
select(
SubjectKey, KP_Side, KP_SurgDate, opyear, KP_County, KP_TypeAWD,
Protestyp, KP_UnitCode
) %>%
inner_join(knee_prom_long, c("SubjectKey", KP_Side = "side")) %>%
mutate(
KP_UnitCode = as.character(KP_UnitCode),
prom_time = as.numeric(date - KP_SurgDate),
prom_period = case_when(
when == "pre" & between(prom_time, -90, 0) ~ "pre",
when == "post" & between(prom_time, 365 - 90, 365 + 180) ~ "post"
),
prom_time_diff_goal =
abs(if_else(prom_period == "post", prom_time - 365, prom_time)),
fyllnadsgrad = apply(., 1, function(x) mean(is.na(x))),
# Olika versioner av EQ-5D-index
eq5d3l_index_tto = eq5d3l_index_tto_old(eq5d3lprofil_old),
eq5d5l_index_tto = eq5d5l_index_tto(
eq5d_mob_num, eq5d_self_care_num, eq5d_activities_num,
eq5d_pain_num, eq5d_anxiety_num),
eq5d5l_index_vas = eq5d5l_index_vas(
eq5d_mob_num, eq5d_self_care_num, eq5d_activities_num,
eq5d_pain_num, eq5d_anxiety_num),
# Gamla VAS-skalor konverteras till likert för smärta och satisfaction
kn_pain_all = coalesce(ordered(kn_pain), cut_vas(vas_old, when)),
satisfaction_all =
coalesce(ordered(satisfaction), cut_vas_satisfaction(knee_op_sat_old))
) %>%
filter(!is.na(prom_period)) %>%
# Om en primop har fler än en pre- eller post-PROM-enkät så tas i första hand
# den som ligger närmast tidsgränsen.
# Vid fler från samma datum tas den enkät som har mest ifylld information.
# Har de lika mycket information sker valet slumpmässigt
arrange(SubjectKey, KP_Side, KP_SurgDate, when, prom_time_diff_goal, fyllnadsgrad) %>%
distinct(SubjectKey, KP_Side, KP_SurgDate, when, .keep_all = TRUE) %>%
select(-when, -fyllnadsgrad)
Från
Z:\SHPR\Arsrapport\2021\code\Data management knee.R
Under rubriken "PROM"
Från
Z:\SHPR\Arsrapport\2021\code\lib\prom.R