diff --git a/DESCRIPTION b/DESCRIPTION index b00df957..28ea34e6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: ablanor Title: AblaNor- Rapporteket -Version: 1.0.2 +Version: 1.1.0 Authors@R: c( person(given = "Kristina", family = "Skaare", diff --git a/NAMESPACE b/NAMESPACE index afe66fd3..bd4787ba 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -18,6 +18,13 @@ export(getProsPatient) export(getProsPatientData) export(getRand12) export(getRand12Data) +export(indik_akuttsuksess) +export(indik_avbrudd) +export(indik_ferdig_komplik) +export(indik_overlevelse30dg) +export(indik_pacemaker) +export(indik_prom_klineff) +export(indik_tamponade) export(ki_akutt_suksess) export(ki_akutt_suksess_svt) export(ki_akutt_suksess_svt_avnrt) @@ -45,6 +52,7 @@ export(utlede_alder_75) export(utlede_aldersklasse) export(utlede_bmi) export(utlede_bmi_klasse) +export(utlede_dager_sensur) export(utlede_hjertesvikt_redusert_ef) export(utlede_kardiomyopati) export(utlede_kateg_afli_aryt_i48) diff --git a/NEWS.md b/NEWS.md index a74ea2c7..5397b02f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,12 @@ +# ablanor 1.1.0 +## Nytt +* Nye versjoner av kvalitetsindikatorene. +* Legge til indikatorene i utforsker + +## Bugfix +* Fjerne unødvendig bruk av _kodebok_fyll_ ved SINGLE-row-spørringer. Sparer +mye tid ved innlasting av kodebok og navn til variabelliste i utforsker + # ablanor 1.0.2 Bugfix: Ikke abonnere på veiledning + Fikse header slik at html ser bra ut Ny parameter i legg_til_forlopstype_kortnavn diff --git a/R/getKodebokData.R b/R/getKodebokData.R index e2f4317e..35f09fe8 100644 --- a/R/getKodebokData.R +++ b/R/getKodebokData.R @@ -12,7 +12,51 @@ getKodebokData <- function() { ablanor::kbd %>% - dplyr::mutate(fysisk_feltnavn = tolower(.data$fysisk_feltnavn)) + dplyr::mutate( + + fysisk_feltnavn = tolower(.data$fysisk_feltnavn), + + # Dersom identitiske "fysisk_feltnavn" gi samme prefix som i utforsker. + fysisk_feltnavn = dplyr::case_when( + + # FRA GKV: + .data$fysisk_feltnavn %in% c("complete", + "incomplete_reason", + "status", + "usercomment") & + .data$skjemanavn == "GKV spørreskjema somatikk, voksne, døgn" ~ + paste0("gkv_", .data$fysisk_feltnavn), + + # FRA RAND12 + .data$fysisk_feltnavn %in% c("complete", + "incomplete_reason", + "status", + "usercomment") & + .data$skjemanavn == "Livskvalitetsskjema" ~ + paste0("rand_", .data$fysisk_feltnavn), + + # FRA OPPFØLGING + .data$fysisk_feltnavn %in% c("complete", + "incomplete_reason", + "status", + "usercomment") & + .data$skjemanavn == "Oppfølging etter 1 år" ~ + paste0("followup_", .data$fysisk_feltnavn), + + # FRA PROSEDYRE + .data$fysisk_feltnavn %in% c("status", + "usercomment") & + .data$skjemanavn == "Prosedyre" ~ + paste0("pros_", .data$fysisk_feltnavn), + + # FRA BASISSKJEMAET + .data$fysisk_feltnavn %in% c("status", + "usercomment") & + .data$skjemanavn == "Basisskjema" ~ + paste0("basereg_", .data$fysisk_feltnavn), + + + TRUE ~ .data$fysisk_feltnavn)) } @@ -34,15 +78,15 @@ getKodebokData <- function() { getKodebokMedUtledetedVar <- function() { - ablanor::kbd %>% - dplyr::mutate(fysisk_feltnavn = tolower(.data$fysisk_feltnavn)) %>% + ablanor::getKodebokData() %>% dplyr::select(.data$skjemanavn, .data$fysisk_feltnavn, .data$ledetekst, .data$listeverdier, .data$listetekst) %>% dplyr::mutate(listeverdier = as.character(.data$listeverdier)) %>% - dplyr::bind_rows(ablanor::def_utledete_var) + dplyr::bind_rows(ablanor::def_utledete_var %>% + tidyr::replace_na(replace = list(listeverdier= "NA"))) } diff --git a/R/getPivotDataSet.R b/R/getPivotDataSet.R index 5ee5dc01..1d8bc28c 100644 --- a/R/getPivotDataSet.R +++ b/R/getPivotDataSet.R @@ -52,7 +52,7 @@ getPivotDataSet <- function(setId = "", toDate = NULL) } - + if(singleRow == FALSE){ # Erstatte listeverdi med listetekst og ja/nei for avkrysningsboks kb <- ablanor::getKodebokData() %>% dplyr::select(.data$fysisk_feltnavn, @@ -71,6 +71,7 @@ getPivotDataSet <- function(setId = "", kb = kb, suffiks = "_tekst", fjerne_suffiks_fra_navn = TRUE) + } dat %<>% ablanor::legg_til_sykehusnavn(df = ., short = FALSE) diff --git a/R/getProsPatientData.R b/R/getProsPatientData.R index 81e81180..7eb98c2d 100644 --- a/R/getProsPatientData.R +++ b/R/getProsPatientData.R @@ -82,7 +82,8 @@ getProsPatientData <- function(registryName, # Forberede Followup-data followup_data <- d_followup %>% dplyr::rename("MCEID_FOLLOWUP" = .data$MCEID) %>% - dplyr::rename_at(dplyr::vars(.data$USERCOMMENT:.data$CREATEDBY), + dplyr::rename_at(dplyr::vars(.data$USERCOMMENT:.data$CREATEDBY, + .data$COMPLETE, .data$INCOMPLETE_REASON), function(x) { paste0("followup_", x) }) %>% @@ -146,5 +147,19 @@ getProsPatientData <- function(registryName, # HJERTESVIKT OG REDUSERT EF d_ablanor %<>% ablanor::utlede_hjertesvikt_redusert_ef(.) - d_ablanor %>% dplyr::arrange(.data$mceid) + + # Indikator tamponade, indikator for avbrudd + d_ablanor %<>% + # ablanor::utlede_dager_sensur(df=., dager_sensur =?? ) %>% + # ablanor::indik_overlevelse30dg() %>% + ablanor::indik_tamponade(.) %>% + ablanor::indik_prom_klineff(.) %>% + ablanor::indik_ferdig_komplik(.) %>% + ablanor::indik_akuttsuksess(.) %>% + ablanor::indik_pacemaker(.) %>% + ablanor::indik_avbrudd(.) + + d_ablanor %>% dplyr::arrange(.data$mceid) + + } diff --git a/R/getRand12Data.R b/R/getRand12Data.R index ce4da3b0..ca9378ea 100644 --- a/R/getRand12Data.R +++ b/R/getRand12Data.R @@ -40,7 +40,9 @@ getRand12Data <- function(registryName, d_rand12_ut <- d_pros %>% dplyr::select(.data$MCEID, .data$CENTREID) %>% - dplyr::left_join(., d_rand12, by = c("MCEID", "CENTREID")) + dplyr::left_join(., d_rand12, by = c("MCEID", "CENTREID")) %>% + dplyr::rename("RAND_COMPLETE" = .data$COMPLETE, + "RAND_INCOMPLETE_REASON"= .data$INCOMPLETE_REASON) names(d_rand12_ut) <- tolower(names(d_rand12_ut)) diff --git a/R/utlede_kvalitetsindikatorer.R b/R/utlede_kvalitetsindikatorer.R new file mode 100644 index 00000000..2ed3f8c3 --- /dev/null +++ b/R/utlede_kvalitetsindikatorer.R @@ -0,0 +1,615 @@ +#' Kvalitetsindikatorer for AblaNor +#' +#' Oppdaterte versjoner av kvalitetsindikatorer. I bruk fra og med våren 2022. +#' +#' For hver av kvalitetsindikatorene, legge til en variabel for datagrunnlag +#' (suffix 'data') og en for indikatoren ja/nei. +#' +#' __Overlevelse 30 dager etter prosedyren__ +#' \code{indik_overlevelse30dg} +#' \itemize{ +#' +#' \item nevneren \code{indik_overlevelse30dg_data} (datagrunnlag) har verdien +#' \emph{ja} dersom forløpstype er AFLI (\code{forlopstype} = 1) +#' uten AV-knuter (\code{abla_strat_av_his} = 0) og dersom tid til sensur er +#' over 30 dager (\code{dager_pros_sensur_gyldig} = \emph{ja]}). Variabelen har +#' verdi \emph{nei} for andre forløpstyper, for kort sensur-tid. Dersom +#' flere enn et forløp (AFLI, uten AV knuter, med gyldig tid) i et 30-dagers +#' intervall, brukes kun nyeste forløp og alle eldre forløp har verdi +#' \code{indik_overlevelse_30dg} = \emph{nei}. +#' +#' \item telleren \code{indik_overlevelse30dg} har verdien \emph{ja} dersom +#' pasienten er levende 30 dager etter prosedyren, var verdien \emph{nei} +#' dersom pasienten er død 0-29 dager etter prosedyren. +#' } +#' +#' \code{indik_overlevelse30dg} bruker hjelpe-funksjonen +#' \code{utlede_dager_sensur} som lager to nye variabler +#' \code{dager_pros_sensur} og \code{dager_pros_sensur_gyldig}. +#' \code{indik_overlevelse30dg} inneholder antall dager fra proseyre til +#' dødsdato for avdøde pasienter og antall dager fra proseydre til sensurdato +#' (dato for nedlastet datadump) for levende pasienter. +#' \code{indik_overlevelse30dg_gyldig} har verdien nei/manglende dersom for +#' kort sensur-tid eller datoer er manglende. +#' +#' __Tamponade i forbindelse med prosedyren__ +#' \code{indik_tamponade()} +#' \itemize{ +#' \item nevneren \code{indik_tamponade_data} (datagrunnlag) har verdien +#' \emph{ja} dersom forløpstype er AFLI (\code{forlopstype} = 1) +#' uten AV-knuter (\code{abla_strat_av_his} = 0). +#' \item telleren \code{indik_tamponade} har verdien \emph{ja} dersom +#' \code{indik_tamp_data} = \emph{ja} og \code{komp_tamp} = 1, +#' verdien \emph{nei} dersom \code{indik_tamp_data} = \emph{ja} og +#' \code{komp_tamp} = 0, +#' verdien \emph{manglende} dersom \code{indik_tamp_data} = \emph{ja} og +#' \code{komp_tamp} er manglende, +#' og verdien \emph{NA} dersom forløpet ikke er i datagrunnlaget +#' (\code{indik_tamp_data} = \emph{nei}). +#' } +#' +#' __Klinisk effekt 12 måneder etter prosedyren__ +#' \code{indik_prom_klineff} +#' \itemize{ +#' +#' \item nevneren \code{indik_prom_klineff_data} (datagrunnlag) har verdien +#' \emph{ja} dersom forløpstype er AFLI (\code{forlopstype} = 1) +#' uten AV-knuter (\code{abla_strat_av_his} = 0) og dersom oppfølgingsskjema +#' er utfylt. Variabelen har +#' verdi \emph{nei} for andre forløpstyper eller manglende oppfølging. +#' +#' \item telleren \code{indik_prom_klineff} har verdien \emph{ja} dersom +#' pasienten har svart \emph{Helt bra}, \emph{Mye bedre} eller \emph{Bedre} +#' sammenlignet med før prosedyre. Variabelen har verdien \emph{nei} dersom +#' pasienten svarer \emph{Uforandret} eller \emph{Verre}. Variabelen har verdien +#' \emph{manglende} dersom oppfølgingsskjemaet er fylt ut, men spørsmålet om +#' klinisk effekt er ubesvart. +#' } +#' +#' __Ferdig utfylt komplikasjonsskjema__ +#' \code{indik_ferdig_komplik} +#' \itemize{ +#' +#' \item nevneren \code{indik_ferdig_komp_data} har verdien \emph{ja} for alle +#' prosedyrer. +#' \item tellerne \code{indik_ferdig_komp} har verdien \emph{ja} dersom +#' spørsmålet \code{komp_janei} er utfylt med en av verdiene \emph{ja} eller +#' \emph{nei}, \code{indik_ferdig_komp} har verdien \emph{nei} dersom +#' \code{komp_janei} er manglende. +#' } +#' +#' __Vellykket prosedyre (akutt suksess)__ +#' \code{indik_akuttsuksess} +#' \itemize{ +#' +#' \item nevneren \code{indik_akuttsuksess_data} (datagrunnlag) har verdiene +#' \emph{AFLI}, \emph{VT}, \emph{AVRT} eller \emph{AVNRT} avhenging av +#' forløpstype (forlopstype og aryt_i47_1_underkat) og kun dersom pasienten er +#' abladert (\code{abla_strat_ingen} =0) og uten AV-knuter +#' (\code{abla_strat_av_his} = 0). Variabelen har +#' verdi \emph{nei} for andre forløpstyper, ikke abladert, eller AV-knuter. +#' +#' \item telleren \code{indik_akuttsuksess} har verdien \emph{ja} dersom +#' \code{akutt_suksess} = 1. +#' Variabelen har verdien \emph{nei} dersom \code{akutt_suksess} = 0 eller 2, +#' og verdien \emph{manglende} dersom \code{akutt_suksess} mangler. +#' } +#' +#' __Behov for pacemaker__ +#' \code{indik_pacemaker} +#' \itemize{ +#' +#' \item nevneren \code{indik_pacemaker_data} (datagrunnlag) har verdien +#' \emph{ja} dersom forløpstype er SVT (\code{forlopstype} = 3) +#' uten AV-knuter (\code{abla_strat_av_his} = 0). Variabelen har +#' verdi \emph{nei} for andre forløpstyper. +#' +#' \item telleren \code{indik_pacemaker} har verdien \emph{ja} dersom +#' pasienten har hatt komplikasjon AV-blokk etterfulgt av innsetting av +#' pacemaker (\code{komp_avblokk_pm} = 1). Variabelen har verdien \emph{nei} +#' eller og verdien \emph{manglende} dersom \code{komp_avblokk_pm} mangler. +#' } +#' +#' __Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner__ +#' \code{indik_avbrudd()} +#' \itemize{ +#' \item nevneren \code{indik_avbrudd_data} (datagrunnlag) har +#' verdiene \emph{AFLI} eller \emph{VT, SVT, AV-knuter} avhengig av +#' forløpstype, og verdien \emph{nei} dersom forløpstype \emph{EFU}. +#' \item telleren \code{indik_avbrudd} har verdien \emph{ja} dersom +#' \code{indik_avbrudd_data} = \emph{AFLU} eller \emph{VT, SVT, AV-knuter} og +#' \code{abla_strat_ingen_arsak} = 4(tekniske problemer) eller 5(Komplikasjon), +#' verdien \emph{nei} dersom \code{indik_avbrudd_data} = \emph{ja} og +#' ingen avbrudd eller avbrudd av andre årsaker. +#' Verdien \emph{NA} dersom forløpet ikke er i datagrunnlaget. +#' } +#' +#' +#' @param df data.frame med ablanor-data. Må inneholde ulike variabler for de +#' ulike funksjonene. F.eks. \code{forlopstype}, \code{abla_strat_av_his} og +#' \code{komp_tamp} for indikatoren "Komplikasjon tamponade for AFLI uten AV +#' knuter". +#' @param dato_sensur dato for sensur til overlevelsesanalyser. Anbefaler +#' 3mnd før datadump, da det kan ta så lang tid å få overført datoen fra +#' folkeregisteret. +#' +#' @name utlede_kvalitetsindikatorer +#' @aliases +#' utlede_dager_sensur +#' indik_overlevelse30dg +#' indik_tamponade +#' indik_prom_klineff +#' indik_ferdig_komplik +#' indik_akuttsuksess +#' indik_pacemaker +#' indik_avbrudd +#' +#' @examples +#' # OVERLEVELSE +#' data.frame( +#' patient_id = rep(1, 3), +#' mceid = 1:3, +#' forlopstype = rep(1, 3), +#' abla_strat_av_his = rep(0, 3), +#' dato_pros = as.Date(c(rep("2020-10-15",2),"2021-10-15"), +#' format = "%Y-%m-%d"), +#' deceased = c(0, 1, 0), +#' deceased_date = as.Date(c(NA, "2020-10-18", NA), +#' format = "%Y-%m-%d")) %>% +#' ablanor::utlede_dager_sensur( +#' df=., +#' dato_sensur = as.Date("2021-10-20", format = "%Y-%m-%d")) %>% +#' ablanor::indik_overlevelse30dg() +#' +#' # TAMPONADE +#' df <- data.frame(forlopstype = c(2, 3, 4, NA, 1, 1, 1, 1), +#' abla_strat_av_his = c(NA, 1, 0, 0, 1, 0, 0, 0), +#' komp_tamp = c(rep(0, 6), 1, 1)) +#' ablanor::indik_tamponade(df = df) +#' +#' # KLINISK EFFEKT +#' df <- data.frame(forlopstype = c(2, 3, 4, NA, 1, 1, 1, 1), +#' abla_strat_av_his = c(NA, 1, 0, 0, 1, 0, 0, 0), +#' followup_status = c(0, 0, 0, 1, 1, 1, 1, 1), +#' q2 = c(NA, NA, NA, 1:5)) +#' ablanor::indik_prom_klineff(df = df) +#' +#' # FERDIG UTFYLT KOMPLIKASJONER +#' ablanor::indik_ferdig_komplik(df = data.frame(komp_janei = c(NA, 0, 1))) +#' +#' # AKUTT SUKSESS +#' df <- data.frame( +#' abla_strat_ingen = c(1, NA, rep(0, 18)), +#' abla_strat_av_his = c(0, 0, 1, NA, rep(0, 16)), +#' forlopstype = c(rep(1, 4), NA, rep(1, 5), rep(2, 3), rep(3, 6), 4), +#' aryt_i47_1_underkat = c(rep(NA, 13), NA, 1:5, NA), +#' akutt_suksess = c(rep(NA, 5), NA, 9, 0, 1, 2, 0:2, 0:2, 0:2 , 1)) +#' ablanor::indik_akuttsuksess(df) +#' +#' +#' +#'#PACEMAKERBEHOV +#' df <- data.frame(forlopstype = c(2, 3, 4, NA, 1, 3, 3, 3), +#' abla_strat_av_his = c(NA, 1, 0, 0, 1, 0, 0, 0), +#' komp_avblokk_pm = c(NA, NA, NA, 0, 1, 0, 1, 0)) +#' ablanor::indik_pacemaker(df = df) +#' +#'# AVBRUDD +#' df <- data.frame(forlopstype = c(3, 4, NA, 1, 1, 1, 1, 1, 1, 1, 1), +#' abla_strat_av_his = c(1, 0, 0, 1, NA, 0, 0, 0, 0, 0, 0), +#' abla_strat_ingen = c(rep(0, 5), NA, 1, 1,1, 1, 0), +#' abla_strat_ingen_arsak = c(rep(NA, 6), 1, 4,5, NA, NA)) +#' ablanor::indik_avbrudd(df = df) +#' + +NULL +#' @rdname utlede_kvalitetsindikatorer +#' @export +utlede_dager_sensur <- function(df, dato_sensur) { + + + stopifnot(c("dato_pros", "deceased", "deceased_date") %in% names(df)) + + + df %>% dplyr::mutate( + + # FOR ALLE: Antall dager mellom prosedyre og sensur/død + dager_pros_sensur = dplyr::case_when( + # For avdøde: + .data$deceased == 1 ~ as.numeric(difftime(deceased_date, + .data$dato_pros, + units = "days")), + # For levende + .data$deceased == 0 ~ as.numeric(difftime(dato_sensur, + .data$dato_pros, + units = "days")), + TRUE ~ NA_real_), + + + # FOR ALLE: er dager_pros_sensur gyldig (ja, nei, manglende) ? + dager_pros_sensur_gyldig = dplyr::case_when( + # dersom feilregistring og negativ tid, ikke med + .data$dager_pros_sensur < 0 ~ "nei", + + # alle døde, som har datoer, er med + .data$deceased == 1 & + !is.na(.data$dato_pros) & + !is.na(.data$deceased_date) ~ "ja", + + + # døde, som manger datoer, er ikke med + .data$deceased == 1 & + (is.na(.data$dato_pros) | is.na(.data$deceased_date)) ~ "manglende", + + + # levende med lang nok sensur er med + .data$deceased == 0 & + !is.na(.data$dato_pros) & + .data$dager_pros_sensur >= 30 ~ "ja", + + # levende med for kort sensur er ikke med + .data$deceased == 0 & + !is.na(.data$dato_pros) & + .data$dager_pros_sensur < 30 ~ "nei", + + # levende manglende dato for prosedyre er ikke med + .data$deceased == 0 & + is.na(.data$dato_pros) ~ "manglende", + + # manglende dødsdatus + is.na(.data$deceased) ~ "manglende", + + + TRUE ~ NA_character_)) + +} + + +#' @rdname utlede_kvalitetsindikatorer +#' @export +indik_overlevelse30dg <- function(df) { + + stopifnot(c("forlopstype", "abla_strat_av_his", + "dager_pros_sensur", "dager_pros_sensur_gyldig", + "dato_pros", "deceased", + "patient_id", "mceid") %in% names(df)) + + + # Hjelpevariabel: Filter på riktig forløpstype + # (vi ser kun på 30-dagers intervall for disse) + df %>% dplyr::mutate( + utvalgt = dplyr::case_when( + # Kun AFLI uten AV-knuter, med gyldig overlevelses-tid: + .data$forlopstype %in% 1 & + .data$abla_strat_av_his %in% 0 & + .data$dager_pros_sensur_gyldig %in% "ja" ~ "ja", + TRUE ~ "nei")) %>% + + + + # Dager mellom forløpene, Kun dersom utvalgt er "ja" at dette er aktuelt + dplyr::group_by(.data$patient_id, .data$utvalgt) %>% + dplyr::arrange(.data$dato_pros) %>% + dplyr::mutate( + + # Antall dager mellom forløpene, lead og lag + time.diff_lag = as.numeric(difftime(.data$dato_pros, + dplyr::lag(.data$dato_pros), + units = "days")), + time.diff_lead = -1 * as.numeric(difftime(.data$dato_pros, + dplyr::lead(.data$dato_pros), + units = "days")), + + # For pasienter med >1 forløp innen et 30 dagers intervall, + # teller kun det SISTE forløpet: + indik_overlevelse30dg_data = dplyr::case_when( + + # INGEN DOBLE FORLØP (Kun et forløp) + is.na(.data$time.diff_lead) & + is.na(.data$time.diff_lag) & + .data$utvalgt == "ja" ~ "ja", + + # ENESTE FORLØP I INTERVALLET + (.data$time.diff_lag >= 31 | is.na(.data$time.diff_lag)) & + (.data$time.diff_lead >= 31 | is.na(.data$time.diff_lead)) & + .data$utvalgt == "ja" ~ "ja", + + # FLERE FORLØP, DETTE ER DET SISTE + (.data$time.diff_lead >= 31 | is.na(.data$time.diff_lead)) & + .data$time.diff_lag < 31 & + .data$utvalgt == "ja" ~ "ja", + + # FLERE FORLØP, DETTE ER IKKE DET SISTE + .data$time.diff_lead < 31 & + .data$utvalgt == "ja" ~ "nei", + + # IKKE I DATAGRUNNLAGET + .data$utvalgt == "nei" ~ "nei", + + TRUE ~ NA_character_)) %>% + dplyr::ungroup() %>% + + + # Indikator ja/nei + dplyr::mutate( + indik_overlevelse30dg = factor( + x = dplyr::case_when( + #ikke død + .data$indik_overlevelse30dg_data == "ja" & + .data$deceased == 0 ~ "ja", + + #død etter 30 dager + .data$indik_overlevelse30dg_data == "ja" & + .data$deceased == 1 & + .data$dager_pros_sensur >= 30 ~ "ja", + + # død 0-29 dager + .data$indik_overlevelse30dg_data == "ja" & + .data$deceased == 1 & + .data$dager_pros_sensur < 30 ~ "nei", + + #ikke i datagrunnlaget + .data$indik_overlevelse30dg_data == "nei" ~ NA_character_), + + levels = c("ja", "nei"), + labels = c("ja", "nei"), + ordered = TRUE)) %>% + + dplyr::select(- .data$utvalgt, + -.data$time.diff_lag, + -.data$time.diff_lead) %>% + dplyr::arrange(.data$mceid) + +} + + +#' @rdname utlede_kvalitetsindikatorer +#' @export +indik_tamponade <- function(df) { + stopifnot(c("forlopstype", + "abla_strat_av_his", + "komp_tamp") %in% names(df)) + + df %>% + dplyr::mutate( + indik_tamp_data = dplyr::if_else( + condition = (.data$forlopstype %in% 1 & + .data$abla_strat_av_his %in% 0), + true = "ja", + false = "nei", + missing = "nei"), + + indik_tamp = dplyr::case_when( + .data$indik_tamp_data %in% "ja" & + .data$komp_tamp %in% 1 & + !is.na(.data$komp_tamp) ~ "ja", + + .data$indik_tamp_data %in% "ja" & + .data$komp_tamp %in% 0 & + !is.na(.data$komp_tamp) ~ "nei", + + .data$indik_tamp_data %in% "ja" & + is.na(.data$komp_tamp) ~ "manglende", + + .data$indik_tamp_data %in% "nei" ~ NA_character_, + + TRUE ~ NA_character_)) + +} + + + + + +#' @rdname utlede_kvalitetsindikatorer +#' @export +indik_prom_klineff <- function(df) { + + + stopifnot(c("forlopstype", + "abla_strat_av_his", + "followup_status", + "q2") %in% names(df)) + + + + df %>% dplyr::mutate( + + # INDIKATOR: OPPFØLGING ETTER 12 MND + # klinisk forbedring, kun AFLI uten HIS + indik_prom_klineff_data = dplyr::if_else( + condition = (.data$followup_status %in% c(-1, 0, 1) & + .data$forlopstype %in% 1 & + .data$abla_strat_av_his %in% 0), + true = "ja", + false = "nei", + missing = "nei"), + + indik_prom_klineff = dplyr::case_when( + .data$indik_prom_klineff_data == "ja" & .data$q2 %in% 1:3 ~"ja", + .data$indik_prom_klineff_data == "ja" & .data$q2 %in% 4:5 ~ "nei", + .data$indik_prom_klineff_data == "ja" & is.na(.data$q2) ~ "manglende", + .data$indik_prom_klineff_data == "nei" ~ NA_character_, + TRUE ~ NA_character_)) + +} + + + +#' @rdname utlede_kvalitetsindikatorer +#' @export +indik_ferdig_komplik <- function(df) { + + stopifnot("komp_janei" %in% names(df)) + + df %>% + dplyr::mutate( + indik_ferdig_komp_data = "ja", + + indik_ferdig_komp = ifelse( + test = !is.na(.data$komp_janei), + yes = "ja", + no = "nei")) +} + + +#' @rdname utlede_kvalitetsindikatorer +#' @export +indik_akuttsuksess <- function(df) { + + stopifnot(all(c("forlopstype", + "abla_strat_av_his", + "abla_strat_ingen", + "aryt_i47_1_underkat", + "akutt_suksess") %in% names(df))) + + + df %>% dplyr::mutate( + + indik_akuttsuksess_data = factor( + x = dplyr::case_when( + + # datagrunnlag: abladerte, AFLI + .data$abla_strat_ingen %in% 0 & + .data$abla_strat_av_his %in% 0 & + .data$forlopstype %in% 1 ~ "AFLI", + + + # datagrunnlag: abladerte, VT + .data$abla_strat_ingen %in% 0 & + .data$abla_strat_av_his %in% 0 & + .data$forlopstype %in% 2 ~ "VT", + + + # datagrunnlag: abladerte, SVT - AVRT + .data$abla_strat_ingen %in% 0 & + .data$abla_strat_av_his %in% 0 & + .data$forlopstype %in% 3 & + .data$aryt_i47_1_underkat %in% 4 ~ "AVRT", + + # datagrunnlag: abladerte, SVT - AVNRT + .data$abla_strat_ingen %in% 0 & + .data$abla_strat_av_his %in% 0 & + .data$forlopstype %in% 3 & + .data$aryt_i47_1_underkat %in% 1:2 ~ "AVNRT", + + TRUE ~ "nei"), + levels = c("AFLI", + "VT", + "AVRT", + "AVNRT", + "nei"), + labels = c("AFLI", + "VT", + "AVRT", + "AVNRT", + "nei"), + ordered = TRUE), + + + + indik_akuttsuksess = dplyr::case_when( + ! .data$indik_akuttsuksess_data %in% "nei" & + .data$akutt_suksess %in% 1 ~ "ja", + + ! .data$indik_akuttsuksess_data %in% "nei" & + .data$akutt_suksess %in% c(0, 2) ~ "nei", + + ! .data$indik_akuttsuksess_data %in% "nei" & + (is.na(.data$akutt_suksess) | + ! .data$akutt_suksess %in% c(0, 2)) ~ "manglende", + + .data$indik_akuttsuksess_data %in% "nei" ~ NA_character_, + TRUE ~ NA_character_) + + ) +} + + +#' @rdname utlede_kvalitetsindikatorer +#' @export +indik_pacemaker <- function(df) { + + stopifnot(c("forlopstype", + "abla_strat_av_his", + "komp_avblokk_pm") %in% names(df)) + + + + df %>% dplyr::mutate( + indik_pacemaker_data = ifelse( + test = (.data$forlopstype %in% 3 & + .data$abla_strat_av_his %in% 0), + yes = "ja", + no = "nei"), + + indik_pacemaker = dplyr::case_when( + + .data$indik_pacemaker_data == "ja" & + .data$komp_avblokk_pm %in% 1 ~ "ja", + + .data$indik_pacemaker_data == "ja" & + .data$komp_avblokk_pm %in% 0 ~ "nei", + + .data$indik_pacemaker_data == "ja" & + is.na(.data$komp_avblokk_pm) ~ "manglende", + + .data$indik_pacemaker_data == "nei" ~ NA_character_, + + TRUE ~ NA_character_)) + +} + + +#' @rdname utlede_kvalitetsindikatorer +#' @export +indik_avbrudd <- function(df) { + + + stopifnot(c("forlopstype", + "abla_strat_av_his", + "abla_strat_ingen", + "abla_strat_ingen_arsak") %in% names(df)) + + + + df %>% dplyr::mutate( + + indik_avbrudd_data = dplyr::case_when( + (!is.na(.data$abla_strat_ingen) & + .data$forlopstype %in% 1 & + .data$abla_strat_av_his %in% 0) ~ "AFLI", + + (!is.na(.data$abla_strat_ingen) & + .data$forlopstype %in% 2:3) ~ "VT, SVT, AV-knuter", + + (!is.na(.data$abla_strat_ingen) & + .data$forlopstype %in% 1 & + .data$abla_strat_av_his %in% 1) ~ "VT, SVT, AV-knuter", + + TRUE ~ "nei"), + + indik_avbrudd = dplyr::case_when( + + # dersom avbrudd på grunn av komplikasjoner blir det "ja" + .data$indik_avbrudd_data != "nei" & + .data$abla_strat_ingen == 1 & + .data$abla_strat_ingen_arsak %in% 4:5 ~ "ja", + + # ingen avbrudd eller avbrudd av andre årsaker er "nei" + .data$indik_avbrudd_data != "nei" & + .data$abla_strat_ingen == 1 & + .data$abla_strat_ingen_arsak %in% c(1, 2, 3, 9) ~ "nei", + + .data$indik_avbrudd_data != "nei" & + .data$abla_strat_ingen == 0 ~ "nei", + + .data$indik_avbrudd_data != "nei" & + .data$abla_strat_ingen == 1 & + !.data$abla_strat_ingen_arsak %in% c(1, 2, 3, 4, 5, 9) ~ "manglende", + + + .data$indik_avbrudd_data == "nei" ~ NA_character_, + + TRUE ~ NA_character_)) +} diff --git a/data-raw/def_utledete_var.R b/data-raw/def_utledete_var.R index 006111b2..b583ec21 100644 --- a/data-raw/def_utledete_var.R +++ b/data-raw/def_utledete_var.R @@ -1,5 +1,8 @@ ## code to prepare `def_utledete_var` dataset goes here -def_utledete_var <-read.csv(file = "data-raw/def_utledete_var.csv", sep = ";") +def_utledete_var <-read.csv2(file = "data-raw/def_utledete_var.txt", + sep = ";", + header = TRUE, + encoding = "UTF-8") usethis::use_data(def_utledete_var, overwrite = TRUE) diff --git a/data-raw/def_utledete_var.csv b/data-raw/def_utledete_var.csv index d261d114..28f3cd53 100644 --- a/data-raw/def_utledete_var.csv +++ b/data-raw/def_utledete_var.csv @@ -1,4 +1,4 @@ -fysisk_feltnavn;skjemanavn;ledetekst;listeverdier;listetekst +fysisk_feltnavn;skjemanavn;ledetekst;listeverdier;listetekst alder;utledet_variabel;alder ved prosedyretidspunktet;NA;NA alder_75;utledet_variabel;alder ved prosedyretidspunktet >= 75 år eller <75 år;NA;NA aldersklasse;utledet_variabel;"alder ved prosedyretidspunktete gruppert i klasser. ""18-49"", ""50-59"", ""60-69"" osv. Alder under 18 år eller over 99 år blir gitt aldersklasse NA.";NA;NA @@ -18,3 +18,40 @@ kategori_vt_kardiomyopati;utledet_variabel;kategori kardiomyopati for forløpsty kategori_vt_kardiomyopati;utledet_variabel;kategori kardiomyopati for forløpstype VT;Ukjent om kardiomyopati;forlopstype = 2, kardiomyopati = 9 kategori_afli_hjsvikt_ef;utledet_variabel;kategori AFLI hjertesvikt og redusert EF;AFLI-Verken hjertesvikt eller redusert EF;forlopstype = 1, enten hjertesvikt = 1 eller ejekfrak = 2 eller 3 kategori_afli_hjsvikt_ef;utledet_variabel;kategori AFLI hjertesvikt og redusert EF;AFLI-Hjertesvikt og/eller redusert EF;forlopstype = 1, verken hjertesvikt = 1 eller ejekfrak = 2 eller 3 +indik_tamp_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";ja;"Datagrunnlaget er ""ja"" for AFLI-forløp uten AV-knuter (forlopstype =1, abla_strat_av_his =0)" +indik_tamp_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";nei;"Datagrunnlaget er ""nei"" for VT, SVT eller EFU-forløp samt AV-knuter (forlopstype =2, 3, 4 eller abla_strat_av_his =1)" +indik_tamp;utledet_variabel;"Kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";ja;I datagrunnlaget og komplikasjon tamponade (komp_tamp = 1). +indik_tamp;utledet_variabel;"Kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";nei;I datagrunnlaget, men ikke komplikasjon tamponade (komp_tamp = 0). +indik_tamp;utledet_variabel;"Kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";manglende;I datagrunnlaget men manglende komplikasjon tamponade (komp_tamp = NA). +indik_tamp;utledet_variabel;"Kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";NA;Ikke i datagrunnlaget +indik_prom_klineff_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";ja;"Datagrunnlaget er ""ja"" dersom alle disse kriteriene er oppfylt: AFLI-forløp (forlopstype =1) + uten AV-knuter (abla_strat_av_his =0) + utfylt oppfølgingsskjema (followup_status -1, 0 eller 1)" +indik_prom_klineff_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";nei;"Datagrunnlaget er ""nei"" dersom minst et av kriteriene for ""ja"" mangler." +indik_prom_klineff;utledet_variabel;"Kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";ja;I datagrunnlaget og 'Når det gjelder arytmien er tilstanden din NÅ sammenlignet med for 1 år siden' er ' Bedre', 'Mye bedre' eller 'Helt bra' (q2 = 1, 2, 3) +indik_prom_klineff;utledet_variabel;"Kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";nei;I datagrunnlaget og 'Når det gjelder arytmien er tilstanden din NÅ sammenlignet med for 1 år siden' er ' Uforandret' eller 'Verre' (q2 = 4, 5) +indik_prom_klineff;utledet_variabel;"Kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";manglende;I datagrunnlaget, men spørsmålet er ikke besvart. +indik_prom_klineff;utledet_variabel;"Kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";NA;Ikke i datagrunnlaget +indik_ferdig_komp_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Ferdig utfylt komplikasjonsskjema""";ja;"Datagrunnlaget er ""ja"" for alle prosedyrer" +indik_ferdig_komp;utledet_variabel;"Kvalitetsindikatoren ""Ferdig utfylt komplikasjonsskjema""";ja;I datagrunnlaget og komp_janei er enten 'ja' eller 'nei' +indik_ferdig_komp;utledet_variabel;"Kvalitetsindikatoren ""Ferdig utfylt komplikasjonsskjema""";nei;I datagrunnlaget men komp_janei mangler +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";AFLI;"Datagrunnlaget er ""AFLI"" dersom alle kriteriene er oppfylt: AFLI (forlopstype = 1) + abladert (abla_strat_ingen =0) + uten AV-knuter (abla_strat_av_his =0)" +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";VT;"Datagrunnlaget er ""VT"" dersom alle kriteriene er oppfylt: VT (forlopstype = 2) + abladert (abla_strat_ingen =0) + uten AV-knuter (abla_strat_av_his =0)" +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";AVRT;"Datagrunnlaget er ""AVRT"" dersom alle kriteriene er oppfylt: SVT (forlopstype = 3) + AVRT (aryt_i47_1_underkat =4) + abladert (abla_strat_ingen =0) + uten AV-knuter (abla_strat_av_his =0)" +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";AVNRT;"Datagrunnlaget er ""AVNRT"" dersom alle kriteriene er oppfylt: SVT (forlopstype = 3) + typisk/atypisk AVNRT (aryt_i47_1_underkat = 1 eller 2) + abladert (abla_strat_ingen =0) + uten AV-knuter (abla_strat_av_his =0)" +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";nei;"Datagrunnlaget er ""nei"" for alle andre" +indik_akuttsuksess;utledet_variabel;"Kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";ja;Dersom i datagrunnlaget og akutt suksess 'Ja' (akutt_suksess = 1) +indik_akuttsuksess;utledet_variabel;"Kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";nei;Dersom i datagrunnlaget og akutt suksess 'Nei'/'Usikker' (akutt_suksess = 0 eller 2) +indik_akuttsuksess;utledet_variabel;"Kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";manglende;Dersom i datagrunnlaget men akutt suksess mangler (akutt_suksess = NA) +indik_akuttsuksess;utledet_variabel;"Kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";NA;Ikke i datagrunnlaget +indik_pacemaker_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Behov for pacemaker""";ja;"Datagrunnlaget er ""ja"" dersom alle disse kriteriene er oppfylt: SVT-forløp (forlopstype =3) + uten AV-knuter (abla_strat_av_his =0) " +indik_pacemaker_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Behov for pacemaker""";nei;"Datagrunnlaget er ""nei"" dersom minst et av kriteriene for ""ja"" mangler." +indik_pacemaker;utledet_variabel;"Kvalitetsindikatoren ""Behov for pacemaker""";ja;I datagrunnlaget og 'komplikasjon AV-blokk etterfulgt av innsetting av pacemaker' (komp_avblokk_pm = 1) +indik_pacemaker;utledet_variabel;"Kvalitetsindikatoren ""Behov for pacemaker""";nei;I datagrunnlaget men ikke 'komplikasjon AV-blokk etterfulgt av innsetting av pacemaker' (komp_avblokk_pm = 0) +indik_pacemaker;utledet_variabel;"Kvalitetsindikatoren ""Behov for pacemaker""";manglende;I datagrunnlaget og manglende 'komplikasjon AV-blokk etterfulgt av innsetting av pacemaker' (komp_avblokk_pm = NA) +indik_pacemaker;utledet_variabel;"Kvalitetsindikatoren ""Behov for pacemaker""";NA;Ikke i datagrunnlaget +indik_avbrudd_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";AFLI;"Datagrunnlaget er ""AFLI"" dersom alle kriteriene er oppfylt: AFLI -forløp (forlopstype = 1) + uten AV-knuter (abla_strat_av_his = 0)" +indik_avbrudd_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";VT, SVT, AV-knuter;"Datagrunnlaget er ""VT, SVT, AV-knuter"" dersom alle kriteriene er oppfylt: AFLI -forløp med AV-knuter (forlopstype = 1, abla_strat_av_his = 1) eller SVT/VT (forlopstype = 2,3 )" +indik_avbrudd_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";nei;"Datagrunnlaget er ""nei"" ellers" +indik_avbrudd;utledet_variabel;"Kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";ja;I datagrunnlaget og ikke abladert (abla_strat_ingen = 1) på grunn av komplikasjon eller tekniske problemer (abla_strat_ingen_arsak = 4, 5) +indik_avbrudd;utledet_variabel;"Kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";nei;I datagrunnlaget og ikke abladert (abla_strat_ingen = 1) av andre grunner (abla_strat_ingen_arsak = 1, 2, 3, 9) +indik_avbrudd;utledet_variabel;"Kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";manglende;I datagrunnlaget og ikke abladert (abla_strat_ingen = 1) av manglende grunn (abla_strat_inge_arsak = NA) +indik_avbrudd;utledet_variabel;"Kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";NA;Ikke i datagrunnlaget diff --git a/data-raw/def_utledete_var.txt b/data-raw/def_utledete_var.txt new file mode 100644 index 00000000..28f3cd53 --- /dev/null +++ b/data-raw/def_utledete_var.txt @@ -0,0 +1,57 @@ +fysisk_feltnavn;skjemanavn;ledetekst;listeverdier;listetekst +alder;utledet_variabel;alder ved prosedyretidspunktet;NA;NA +alder_75;utledet_variabel;alder ved prosedyretidspunktet >= 75 år eller <75 år;NA;NA +aldersklasse;utledet_variabel;"alder ved prosedyretidspunktete gruppert i klasser. ""18-49"", ""50-59"", ""60-69"" osv. Alder under 18 år eller over 99 år blir gitt aldersklasse NA.";NA;NA +bmi_manual;utledet_variabel;bmi utledet med formelen : bmi = vekt/(hoyde*høyde) = [kg]/[m2];NA;NA +bmi_klasse;utledet_variabel;bmi_manual gruppert i klasser, basert på FHI sin definisjon;NA;NA +bmi_over35;utledet_variabel;bmi_manual >= 35 eller <35. Utledet;NA;NA +aar;utledet_variabel;Aar for prosedyredato;NA;NA +maaned_nr;utledet_variabel;Måned (numerisk) for prosedyredato;NA;NA +maaned;utledet_variabel;"År og måned for prosedyredato (f.eks ""2021-10"" for oktober 2021)";NA;NA +kategori_afli_aryt_i48;utledet_variabel;ICD-kode for Atrieflimmer;AFLI-ICD 48.0 Paroksymal atrieflimmer;forlopstype = 1, aryt_i48_0 = 1 +kategori_afli_aryt_i48;utledet_variabel;ICD-kode for Atrieflimmer;AFLI-ICD 48.1 Persisterende atrieflimmer;forlopstype = 1, aryt_i48_1 = 1, aryt_i48_1_underkat = 1 +kategori_afli_aryt_i48;utledet_variabel;ICD-kode for Atrieflimmer;AFLI-ICD 48.1 Langtidspersisterende atrieflimmer;forlopstype = 1, aryt_i48_1 = 1, aryt_i48_1_underkat = 2 +kategori_vt_kardiomyopati;utledet_variabel;kategori kardiomyopati for forløpstype VT;Uten kardiomyopati;forlopstype = 2, kardiomyopati = 0 +kategori_vt_kardiomyopati;utledet_variabel;kategori kardiomyopati for forløpstype VT;Iskemisk KM (ICM);forlopstype = 2, kardiomyopati = 1, type_kardiomyopati = 1 +kategori_vt_kardiomyopati;utledet_variabel;kategori kardiomyopati for forløpstype VT;Dilatert KM (DCM);forlopstype = 2, kardiomyopati = 1, type_kardiomyopati = 2 +kategori_vt_kardiomyopati;utledet_variabel;kategori kardiomyopati for forløpstype VT;Annen KM;forlopstype = 2, kardiomyopati = 1, type_kardiomyopati = verken 1 eller 2 +kategori_vt_kardiomyopati;utledet_variabel;kategori kardiomyopati for forløpstype VT;Ukjent om kardiomyopati;forlopstype = 2, kardiomyopati = 9 +kategori_afli_hjsvikt_ef;utledet_variabel;kategori AFLI hjertesvikt og redusert EF;AFLI-Verken hjertesvikt eller redusert EF;forlopstype = 1, enten hjertesvikt = 1 eller ejekfrak = 2 eller 3 +kategori_afli_hjsvikt_ef;utledet_variabel;kategori AFLI hjertesvikt og redusert EF;AFLI-Hjertesvikt og/eller redusert EF;forlopstype = 1, verken hjertesvikt = 1 eller ejekfrak = 2 eller 3 +indik_tamp_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";ja;"Datagrunnlaget er ""ja"" for AFLI-forløp uten AV-knuter (forlopstype =1, abla_strat_av_his =0)" +indik_tamp_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";nei;"Datagrunnlaget er ""nei"" for VT, SVT eller EFU-forløp samt AV-knuter (forlopstype =2, 3, 4 eller abla_strat_av_his =1)" +indik_tamp;utledet_variabel;"Kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";ja;I datagrunnlaget og komplikasjon tamponade (komp_tamp = 1). +indik_tamp;utledet_variabel;"Kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";nei;I datagrunnlaget, men ikke komplikasjon tamponade (komp_tamp = 0). +indik_tamp;utledet_variabel;"Kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";manglende;I datagrunnlaget men manglende komplikasjon tamponade (komp_tamp = NA). +indik_tamp;utledet_variabel;"Kvalitetsindikatoren ""Tamponade i forbindelse med prosedyren""";NA;Ikke i datagrunnlaget +indik_prom_klineff_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";ja;"Datagrunnlaget er ""ja"" dersom alle disse kriteriene er oppfylt: AFLI-forløp (forlopstype =1) + uten AV-knuter (abla_strat_av_his =0) + utfylt oppfølgingsskjema (followup_status -1, 0 eller 1)" +indik_prom_klineff_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";nei;"Datagrunnlaget er ""nei"" dersom minst et av kriteriene for ""ja"" mangler." +indik_prom_klineff;utledet_variabel;"Kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";ja;I datagrunnlaget og 'Når det gjelder arytmien er tilstanden din NÅ sammenlignet med for 1 år siden' er ' Bedre', 'Mye bedre' eller 'Helt bra' (q2 = 1, 2, 3) +indik_prom_klineff;utledet_variabel;"Kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";nei;I datagrunnlaget og 'Når det gjelder arytmien er tilstanden din NÅ sammenlignet med for 1 år siden' er ' Uforandret' eller 'Verre' (q2 = 4, 5) +indik_prom_klineff;utledet_variabel;"Kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";manglende;I datagrunnlaget, men spørsmålet er ikke besvart. +indik_prom_klineff;utledet_variabel;"Kvalitetsindikatoren ""Klinisk effekt 12 mnd etter prosedyren""";NA;Ikke i datagrunnlaget +indik_ferdig_komp_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Ferdig utfylt komplikasjonsskjema""";ja;"Datagrunnlaget er ""ja"" for alle prosedyrer" +indik_ferdig_komp;utledet_variabel;"Kvalitetsindikatoren ""Ferdig utfylt komplikasjonsskjema""";ja;I datagrunnlaget og komp_janei er enten 'ja' eller 'nei' +indik_ferdig_komp;utledet_variabel;"Kvalitetsindikatoren ""Ferdig utfylt komplikasjonsskjema""";nei;I datagrunnlaget men komp_janei mangler +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";AFLI;"Datagrunnlaget er ""AFLI"" dersom alle kriteriene er oppfylt: AFLI (forlopstype = 1) + abladert (abla_strat_ingen =0) + uten AV-knuter (abla_strat_av_his =0)" +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";VT;"Datagrunnlaget er ""VT"" dersom alle kriteriene er oppfylt: VT (forlopstype = 2) + abladert (abla_strat_ingen =0) + uten AV-knuter (abla_strat_av_his =0)" +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";AVRT;"Datagrunnlaget er ""AVRT"" dersom alle kriteriene er oppfylt: SVT (forlopstype = 3) + AVRT (aryt_i47_1_underkat =4) + abladert (abla_strat_ingen =0) + uten AV-knuter (abla_strat_av_his =0)" +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";AVNRT;"Datagrunnlaget er ""AVNRT"" dersom alle kriteriene er oppfylt: SVT (forlopstype = 3) + typisk/atypisk AVNRT (aryt_i47_1_underkat = 1 eller 2) + abladert (abla_strat_ingen =0) + uten AV-knuter (abla_strat_av_his =0)" +indik_akuttsuksess_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";nei;"Datagrunnlaget er ""nei"" for alle andre" +indik_akuttsuksess;utledet_variabel;"Kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";ja;Dersom i datagrunnlaget og akutt suksess 'Ja' (akutt_suksess = 1) +indik_akuttsuksess;utledet_variabel;"Kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";nei;Dersom i datagrunnlaget og akutt suksess 'Nei'/'Usikker' (akutt_suksess = 0 eller 2) +indik_akuttsuksess;utledet_variabel;"Kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";manglende;Dersom i datagrunnlaget men akutt suksess mangler (akutt_suksess = NA) +indik_akuttsuksess;utledet_variabel;"Kvalitetsindikatoren ""Vellykket prosedyre (akutt suksess)""";NA;Ikke i datagrunnlaget +indik_pacemaker_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Behov for pacemaker""";ja;"Datagrunnlaget er ""ja"" dersom alle disse kriteriene er oppfylt: SVT-forløp (forlopstype =3) + uten AV-knuter (abla_strat_av_his =0) " +indik_pacemaker_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Behov for pacemaker""";nei;"Datagrunnlaget er ""nei"" dersom minst et av kriteriene for ""ja"" mangler." +indik_pacemaker;utledet_variabel;"Kvalitetsindikatoren ""Behov for pacemaker""";ja;I datagrunnlaget og 'komplikasjon AV-blokk etterfulgt av innsetting av pacemaker' (komp_avblokk_pm = 1) +indik_pacemaker;utledet_variabel;"Kvalitetsindikatoren ""Behov for pacemaker""";nei;I datagrunnlaget men ikke 'komplikasjon AV-blokk etterfulgt av innsetting av pacemaker' (komp_avblokk_pm = 0) +indik_pacemaker;utledet_variabel;"Kvalitetsindikatoren ""Behov for pacemaker""";manglende;I datagrunnlaget og manglende 'komplikasjon AV-blokk etterfulgt av innsetting av pacemaker' (komp_avblokk_pm = NA) +indik_pacemaker;utledet_variabel;"Kvalitetsindikatoren ""Behov for pacemaker""";NA;Ikke i datagrunnlaget +indik_avbrudd_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";AFLI;"Datagrunnlaget er ""AFLI"" dersom alle kriteriene er oppfylt: AFLI -forløp (forlopstype = 1) + uten AV-knuter (abla_strat_av_his = 0)" +indik_avbrudd_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";VT, SVT, AV-knuter;"Datagrunnlaget er ""VT, SVT, AV-knuter"" dersom alle kriteriene er oppfylt: AFLI -forløp med AV-knuter (forlopstype = 1, abla_strat_av_his = 1) eller SVT/VT (forlopstype = 2,3 )" +indik_avbrudd_data;utledet_variabel;"Datagrunnlag for kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";nei;"Datagrunnlaget er ""nei"" ellers" +indik_avbrudd;utledet_variabel;"Kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";ja;I datagrunnlaget og ikke abladert (abla_strat_ingen = 1) på grunn av komplikasjon eller tekniske problemer (abla_strat_ingen_arsak = 4, 5) +indik_avbrudd;utledet_variabel;"Kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";nei;I datagrunnlaget og ikke abladert (abla_strat_ingen = 1) av andre grunner (abla_strat_ingen_arsak = 1, 2, 3, 9) +indik_avbrudd;utledet_variabel;"Kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";manglende;I datagrunnlaget og ikke abladert (abla_strat_ingen = 1) av manglende grunn (abla_strat_inge_arsak = NA) +indik_avbrudd;utledet_variabel;"Kvalitetsindikatoren ""Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner""";NA;Ikke i datagrunnlaget diff --git a/data/def_utledete_var.rda b/data/def_utledete_var.rda index 85605fc6..3e127423 100644 Binary files a/data/def_utledete_var.rda and b/data/def_utledete_var.rda differ diff --git a/inst/shinyApps/ablanor/server.R b/inst/shinyApps/ablanor/server.R index fc0ebfc2..7fd2d3dc 100644 --- a/inst/shinyApps/ablanor/server.R +++ b/inst/shinyApps/ablanor/server.R @@ -39,7 +39,6 @@ server <- function(input, output, session) { # Hide all tabs if LU -role if (userRole == "LU") { - shiny::hideTab(inputId = "tabs", target = "Start") shiny::hideTab(inputId = "tabs", target = "Utforsker") shiny::hideTab(inputId = "tabs", target = "Datadump") shiny::hideTab(inputId = "tabs", target = "Kodebok") diff --git a/man/utlede_kvalitetsindikatorer.Rd b/man/utlede_kvalitetsindikatorer.Rd new file mode 100644 index 00000000..191d4e6e --- /dev/null +++ b/man/utlede_kvalitetsindikatorer.Rd @@ -0,0 +1,224 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utlede_kvalitetsindikatorer.R +\name{utlede_kvalitetsindikatorer} +\alias{utlede_kvalitetsindikatorer} +\alias{utlede_dager_sensur} +\alias{indik_overlevelse30dg} +\alias{indik_tamponade} +\alias{indik_prom_klineff} +\alias{indik_ferdig_komplik} +\alias{indik_akuttsuksess} +\alias{indik_pacemaker} +\alias{indik_avbrudd} +\title{Kvalitetsindikatorer for AblaNor} +\usage{ +utlede_dager_sensur(df, dato_sensur) + +indik_overlevelse30dg(df) + +indik_tamponade(df) + +indik_prom_klineff(df) + +indik_ferdig_komplik(df) + +indik_akuttsuksess(df) + +indik_pacemaker(df) + +indik_avbrudd(df) +} +\arguments{ +\item{df}{data.frame med ablanor-data. Må inneholde ulike variabler for de +ulike funksjonene. F.eks. \code{forlopstype}, \code{abla_strat_av_his} og +\code{komp_tamp} for indikatoren "Komplikasjon tamponade for AFLI uten AV +knuter".} + +\item{dato_sensur}{dato for sensur til overlevelsesanalyser. Anbefaler +3mnd før datadump, da det kan ta så lang tid å få overført datoen fra +folkeregisteret.} +} +\description{ +Oppdaterte versjoner av kvalitetsindikatorer. I bruk fra og med våren 2022. +} +\details{ +For hver av kvalitetsindikatorene, legge til en variabel for datagrunnlag +(suffix 'data') og en for indikatoren ja/nei. + +\strong{Overlevelse 30 dager etter prosedyren} +\code{indik_overlevelse30dg} +\itemize{ + +\item nevneren \code{indik_overlevelse30dg_data} (datagrunnlag) har verdien +\emph{ja} dersom forløpstype er AFLI (\code{forlopstype} = 1) +uten AV-knuter (\code{abla_strat_av_his} = 0) og dersom tid til sensur er +over 30 dager (\code{dager_pros_sensur_gyldig} = \emph{ja]}). Variabelen har +verdi \emph{nei} for andre forløpstyper, for kort sensur-tid. Dersom +flere enn et forløp (AFLI, uten AV knuter, med gyldig tid) i et 30-dagers +intervall, brukes kun nyeste forløp og alle eldre forløp har verdi +\code{indik_overlevelse_30dg} = \emph{nei}. + +\item telleren \code{indik_overlevelse30dg} har verdien \emph{ja} dersom +pasienten er levende 30 dager etter prosedyren, var verdien \emph{nei} +dersom pasienten er død 0-29 dager etter prosedyren. +} + +\code{indik_overlevelse30dg} bruker hjelpe-funksjonen +\code{utlede_dager_sensur} som lager to nye variabler +\code{dager_pros_sensur} og \code{dager_pros_sensur_gyldig}. +\code{indik_overlevelse30dg} inneholder antall dager fra proseyre til +dødsdato for avdøde pasienter og antall dager fra proseydre til sensurdato +(dato for nedlastet datadump) for levende pasienter. +\code{indik_overlevelse30dg_gyldig} har verdien nei/manglende dersom for +kort sensur-tid eller datoer er manglende. + +\strong{Tamponade i forbindelse med prosedyren} +\code{indik_tamponade()} +\itemize{ +\item nevneren \code{indik_tamponade_data} (datagrunnlag) har verdien +\emph{ja} dersom forløpstype er AFLI (\code{forlopstype} = 1) +uten AV-knuter (\code{abla_strat_av_his} = 0). +\item telleren \code{indik_tamponade} har verdien \emph{ja} dersom +\code{indik_tamp_data} = \emph{ja} og \code{komp_tamp} = 1, +verdien \emph{nei} dersom \code{indik_tamp_data} = \emph{ja} og +\code{komp_tamp} = 0, +verdien \emph{manglende} dersom \code{indik_tamp_data} = \emph{ja} og +\code{komp_tamp} er manglende, +og verdien \emph{NA} dersom forløpet ikke er i datagrunnlaget +(\code{indik_tamp_data} = \emph{nei}). +} + +\strong{Klinisk effekt 12 måneder etter prosedyren} +\code{indik_prom_klineff} +\itemize{ + +\item nevneren \code{indik_prom_klineff_data} (datagrunnlag) har verdien +\emph{ja} dersom forløpstype er AFLI (\code{forlopstype} = 1) +uten AV-knuter (\code{abla_strat_av_his} = 0) og dersom oppfølgingsskjema +er utfylt. Variabelen har +verdi \emph{nei} for andre forløpstyper eller manglende oppfølging. + +\item telleren \code{indik_prom_klineff} har verdien \emph{ja} dersom +pasienten har svart \emph{Helt bra}, \emph{Mye bedre} eller \emph{Bedre} +sammenlignet med før prosedyre. Variabelen har verdien \emph{nei} dersom +pasienten svarer \emph{Uforandret} eller \emph{Verre}. Variabelen har verdien +\emph{manglende} dersom oppfølgingsskjemaet er fylt ut, men spørsmålet om +klinisk effekt er ubesvart. +} + +\strong{Ferdig utfylt komplikasjonsskjema} +\code{indik_ferdig_komplik} +\itemize{ + +\item nevneren \code{indik_ferdig_komp_data} har verdien \emph{ja} for alle +prosedyrer. +\item tellerne \code{indik_ferdig_komp} har verdien \emph{ja} dersom +spørsmålet \code{komp_janei} er utfylt med en av verdiene \emph{ja} eller +\emph{nei}, \code{indik_ferdig_komp} har verdien \emph{nei} dersom +\code{komp_janei} er manglende. +} + +\strong{Vellykket prosedyre (akutt suksess)} +\code{indik_akuttsuksess} +\itemize{ + +\item nevneren \code{indik_akuttsuksess_data} (datagrunnlag) har verdiene +\emph{AFLI}, \emph{VT}, \emph{AVRT} eller \emph{AVNRT} avhenging av +forløpstype (forlopstype og aryt_i47_1_underkat) og kun dersom pasienten er +abladert (\code{abla_strat_ingen} =0) og uten AV-knuter +(\code{abla_strat_av_his} = 0). Variabelen har +verdi \emph{nei} for andre forløpstyper, ikke abladert, eller AV-knuter. + +\item telleren \code{indik_akuttsuksess} har verdien \emph{ja} dersom +\code{akutt_suksess} = 1. +Variabelen har verdien \emph{nei} dersom \code{akutt_suksess} = 0 eller 2, +og verdien \emph{manglende} dersom \code{akutt_suksess} mangler. +} + +\strong{Behov for pacemaker} +\code{indik_pacemaker} +\itemize{ + +\item nevneren \code{indik_pacemaker_data} (datagrunnlag) har verdien +\emph{ja} dersom forløpstype er SVT (\code{forlopstype} = 3) +uten AV-knuter (\code{abla_strat_av_his} = 0). Variabelen har +verdi \emph{nei} for andre forløpstyper. + +\item telleren \code{indik_pacemaker} har verdien \emph{ja} dersom +pasienten har hatt komplikasjon AV-blokk etterfulgt av innsetting av +pacemaker (\code{komp_avblokk_pm} = 1). Variabelen har verdien \emph{nei} +eller og verdien \emph{manglende} dersom \code{komp_avblokk_pm} mangler. +} + +\strong{Prosedyreavbrudd på grunn av tekniske problemer eller komplikasjoner} +\code{indik_avbrudd()} +\itemize{ +\item nevneren \code{indik_avbrudd_data} (datagrunnlag) har +verdiene \emph{AFLI} eller \emph{VT, SVT, AV-knuter} avhengig av +forløpstype, og verdien \emph{nei} dersom forløpstype \emph{EFU}. +\item telleren \code{indik_avbrudd} har verdien \emph{ja} dersom +\code{indik_avbrudd_data} = \emph{AFLU} eller \emph{VT, SVT, AV-knuter} og +\code{abla_strat_ingen_arsak} = 4(tekniske problemer) eller 5(Komplikasjon), +verdien \emph{nei} dersom \code{indik_avbrudd_data} = \emph{ja} og +ingen avbrudd eller avbrudd av andre årsaker. +Verdien \emph{NA} dersom forløpet ikke er i datagrunnlaget. +} +} +\examples{ +# OVERLEVELSE +data.frame( + patient_id = rep(1, 3), + mceid = 1:3, + forlopstype = rep(1, 3), + abla_strat_av_his = rep(0, 3), + dato_pros = as.Date(c(rep("2020-10-15",2),"2021-10-15"), + format = "\%Y-\%m-\%d"), + deceased = c(0, 1, 0), + deceased_date = as.Date(c(NA, "2020-10-18", NA), + format = "\%Y-\%m-\%d")) \%>\% +ablanor::utlede_dager_sensur( + df=., + dato_sensur = as.Date("2021-10-20", format = "\%Y-\%m-\%d")) \%>\% +ablanor::indik_overlevelse30dg() + +# TAMPONADE + df <- data.frame(forlopstype = c(2, 3, 4, NA, 1, 1, 1, 1), + abla_strat_av_his = c(NA, 1, 0, 0, 1, 0, 0, 0), + komp_tamp = c(rep(0, 6), 1, 1)) +ablanor::indik_tamponade(df = df) + +# KLINISK EFFEKT +df <- data.frame(forlopstype = c(2, 3, 4, NA, 1, 1, 1, 1), + abla_strat_av_his = c(NA, 1, 0, 0, 1, 0, 0, 0), + followup_status = c(0, 0, 0, 1, 1, 1, 1, 1), + q2 = c(NA, NA, NA, 1:5)) +ablanor::indik_prom_klineff(df = df) + +# FERDIG UTFYLT KOMPLIKASJONER +ablanor::indik_ferdig_komplik(df = data.frame(komp_janei = c(NA, 0, 1))) + +# AKUTT SUKSESS +df <- data.frame( + abla_strat_ingen = c(1, NA, rep(0, 18)), + abla_strat_av_his = c(0, 0, 1, NA, rep(0, 16)), + forlopstype = c(rep(1, 4), NA, rep(1, 5), rep(2, 3), rep(3, 6), 4), + aryt_i47_1_underkat = c(rep(NA, 13), NA, 1:5, NA), + akutt_suksess = c(rep(NA, 5), NA, 9, 0, 1, 2, 0:2, 0:2, 0:2 , 1)) +ablanor::indik_akuttsuksess(df) + + + +#PACEMAKERBEHOV +df <- data.frame(forlopstype = c(2, 3, 4, NA, 1, 3, 3, 3), + abla_strat_av_his = c(NA, 1, 0, 0, 1, 0, 0, 0), + komp_avblokk_pm = c(NA, NA, NA, 0, 1, 0, 1, 0)) +ablanor::indik_pacemaker(df = df) + +# AVBRUDD + df <- data.frame(forlopstype = c(3, 4, NA, 1, 1, 1, 1, 1, 1, 1, 1), + abla_strat_av_his = c(1, 0, 0, 1, NA, 0, 0, 0, 0, 0, 0), + abla_strat_ingen = c(rep(0, 5), NA, 1, 1,1, 1, 0), + abla_strat_ingen_arsak = c(rep(NA, 6), 1, 4,5, NA, NA)) + ablanor::indik_avbrudd(df = df) + +} diff --git a/tests/testthat/test-utlede_kvalitetsindikatorer.R b/tests/testthat/test-utlede_kvalitetsindikatorer.R new file mode 100644 index 00000000..15dcb00e --- /dev/null +++ b/tests/testthat/test-utlede_kvalitetsindikatorer.R @@ -0,0 +1,702 @@ + +# TESTER for OVERLEVELSE +testthat::test_that("Ki overlevelse fungerer - sensur", { + + # dEL 1 UTLEDE SENSUR + df <- data.frame(dato_pros = as.Date(c(NA, rep("2020-10-15", 6), + "2021-09-20", + "2022-10-15", "2021-10-15"), + format = "%Y-%m-%d"), + deceased = c(0, NA, 1, 1, 1, 1, 0, 0, 0, 0), + deceased_date = as.Date(c(NA, NA, NA, + "2020-05-20", + "2020-10-15", + "2020-11-10", NA, NA, NA, NA), + format = "%Y-%m-%d")) + + df_out <- ablanor::utlede_dager_sensur( + df, + dato_sensur = as.Date("2021-10-20", format = "%Y-%m-%d")) + + + # forventer ikke utregnet tidsdifferanse her: + testthat::expect_true(all( + df_out %>% + dplyr::filter(is.na(.data$deceased_date), + .data$deceased %in% 1) %>% + dplyr::pull(.data$dager_pros_sensur) %>% + is.na() + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(is.na(.data$dato_pros)) %>% + dplyr::pull(.data$dager_pros_sensur) %>% + is.na() + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(is.na(.data$deceased)) %>% + dplyr::pull(.data$dager_pros_sensur) %>% + is.na() + )) + + # Forventer disse tidsdifferansene her: + testthat::expect_true(all( + df_out %>% + dplyr::filter(!is.na(.data$dager_pros_sensur)) %>% + dplyr::pull(.data$dager_pros_sensur) == + c(-148, 0, 26, 370, 30, -360, 5) + )) + + + # Forventede verdier for dager_pros_sensur_yldig + testthat::expect_true(all( + df_out %>% + dplyr::filter(is.na(.data$dager_pros_sensur)) %>% + dplyr::pull(.data$dager_pros_sensur_gyldig) == "manglende" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$dager_pros_sensur < 0) %>% + dplyr::pull(.data$dager_pros_sensur_gyldig) == "nei" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$dager_pros_sensur < 30, + .data$deceased %in% 0) %>% + dplyr::pull(.data$dager_pros_sensur_gyldig) == "nei" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$dager_pros_sensur >= 0, + .data$deceased %in% 1) %>% + dplyr::pull(.data$dager_pros_sensur_gyldig) == "ja" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$dager_pros_sensur >= 30, + .data$deceased %in% 0) %>% + dplyr::pull(.data$dager_pros_sensur_gyldig) == "ja" + )) + + # Forventer feil + testthat::expect_error( + ablanor::utlede_dager_sensur(df = data.frame(feil_navn = 1))) + + testthat::expect_error( + ablanor::utlede_dager_sensur(df = df, + dato_sensur = "ingen dato")) + + +}) + + +testthat::test_that("Ki overlevelse fungerer - sensur", { + + # dEL 2 : Indikator - et forløp per pasient + df <- data.frame( + mceid = 1:15, + forlopstype = c(2:4, NA, rep(1, 11)), + abla_strat_av_his = c(rep(0, 4), 1, rep(0, 10)), + patient_id = c(1:15), + deceased = c(rep(0, 10), rep(1, 5)), + dager_pros_sensur_gyldig = c(rep("ja", 5), + "nei", "manglende", rep("ja", 8)), + dager_pros_sensur = c(rep(40, 5), 29, NA, rep(40, 3), 28:32), + dato_pros = rep(as.Date("2020-10-20", format = "%Y-%m-%d"), 15)) + + + df_out <- ablanor::indik_overlevelse30dg(df = df) + + # Forventer ikke i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$forlopstype %in% 1) %>% + dplyr::pull(.data$indik_overlevelse30dg_data) == "nei" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$abla_strat_av_his %in% 0) %>% + dplyr::pull(.data$indik_overlevelse30dg_data) == "nei" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$dager_pros_sensur_gyldig %in% "ja") %>% + dplyr::pull(.data$indik_overlevelse30dg_data) == "nei" + )) + + # Forventer i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$forlopstype %in% 1, + .data$abla_strat_av_his %in% 0, + .data$dager_pros_sensur_gyldig %in% "ja") %>% + dplyr::pull(.data$indik_overlevelse30dg_data) == "ja" + )) + + # Forventert verdi av indikatoren + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_overlevelse30dg_data %in% "ja", + .data$deceased == 0) %>% + dplyr::pull(.data$indik_overlevelse30dg) == "ja" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_overlevelse30dg_data %in% "ja", + .data$deceased == 1, + .data$dager_pros_sensur >= 30) %>% + dplyr::pull(.data$indik_overlevelse30dg) == "ja" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_overlevelse30dg_data %in% "ja", + .data$deceased == 1, + .data$dager_pros_sensur < 30) %>% + dplyr::pull(.data$indik_overlevelse30dg) == "nei" + )) + + +}) + + + +testthat::test_that("Ki overlevelse fungerer - sensur", { + + # dEL 2 : Indikator - flere forløpe per pasient + df <- data.frame( + mceid = 1:10, + forlopstype = rep(1, 10), + abla_strat_av_his = rep(0, 10), + patient_id = c(1, 1, 1, 2, 2, 3, 3, 3, 4, 4), + deceased = c(rep(0, 5), rep(1, 5)), + deceased_date = as.Date(c(NA, NA, NA, NA, NA, + rep("2020-12-24", 3), + rep("2021-12-01", 2)), + format = "%Y-%m-%d"), + dato_pros = as.Date(c("2020-10-01", + "2020-10-02", + "2020-10-03", + "2020-10-01", + "2021-10-01", + "2019-12-24", + "2020-12-23", + "2020-12-24", + "2023-12-15", + "2021-10-01"), + format = "%Y-%m-%d")) + + df_out <- ablanor::utlede_dager_sensur( + df = df, + dato_sensur = as.Date("2020-10-31", format = "%Y-%m-%d")) %>% + ablanor::indik_overlevelse30dg(.) + + + + # Disse forløpene er ikke med i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(! .data$mceid %in% c(1, 4, 6, 8, 10)) %>% + dplyr::pull(.data$indik_overlevelse30dg_data) == "nei" + )) + + # Disse forløpene er med i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$mceid %in% c(1, 4, 6, 8, 10)) %>% + dplyr::pull(.data$indik_overlevelse30dg_data) == "ja" + )) + + # Forventede verdier + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$mceid %in% c(1, 4, 6, 10)) %>% + dplyr::pull(.data$indik_overlevelse30dg) == "ja" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$mceid %in% c(8)) %>% + dplyr::pull(.data$indik_overlevelse30dg) == "nei" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_overlevelse30dg_data == "nei") %>% + dplyr::pull(.data$indik_overlevelse30dg) %>% + is.na() + )) + +}) + + + +# Tester for TAMPONADE ---- +test_that("KI-TAMPONADE wokss", { + + df <- data.frame(forlopstype = c(2, 3, 4, NA, 1, 1, 1, 1, 1), + abla_strat_av_his = c(NA, 1, 0, 0, 1, 0, 1, 0, 0), + komp_tamp = c(rep(0, 6), 1, 1, NA)) + df_out <- ablanor::indik_tamponade(df = df) + + + # Forventer ikke i datagrunnlaget for disse: + testthat::expect_true(all( + df_out %>% + dplyr::filter(! .data$forlopstype %in% 1) %>% + dplyr::pull(.data$indik_tamp_data) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(! .data$abla_strat_av_his %in% 0) %>% + dplyr::pull(.data$indik_tamp_data) == "nei")) + + + # Forventer i datagrunnlaget for disse: + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$forlopstype %in% 1, + .data$abla_strat_av_his %in% 0) %>% + dplyr::pull(.data$indik_tamp_data) == "ja")) + + # Forventer ja/nei/manglende + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_tamp_data == "ja", + .data$komp_tamp == 0) %>% + dplyr::pull(.data$indik_tamp) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_tamp_data == "ja", + .data$komp_tamp == 1) %>% + dplyr::pull(.data$indik_tamp) == "ja")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_tamp_data == "ja", + is.na(.data$komp_tamp)) %>% + dplyr::pull(.data$indik_tamp) == "manglende")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_tamp_data == "nei") %>% + dplyr::pull(.data$indik_tamp) %>% + is.na())) + + # Forventer feilmelding + testthat::expect_error( + ablanor::indik_tamponade(data.frame(forlopstype = 1, + abla_strat_av_his = 0)) + ) + + +}) + + + + + + +# Test indikator: klinisk effekt 12mnd etter ----- +testthat::test_that("KI: Klinisk effekt fungerer", { + df <- data.frame( + forlopstype = c(2, 3, 4, 5, NA, rep(1, 10)), + abla_strat_av_his = c(rep(0, 5), 1, rep(0, 9)), + followup_status = c(rep(1, 6), NA, 0, -1, rep(1, 6)), + q2 = c(rep(4, 6), NA, 1, NA, 1:5, 3) + ) + + df_out <- ablanor::indik_prom_klineff(df) + + # Forventer ikke i datagrunnlag + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$forlopstype %in% 1) %>% + dplyr::pull(.data$indik_prom_klineff_data) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$abla_strat_av_his %in% 0) %>% + dplyr::pull(.data$indik_prom_klineff_data) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(is.na(.data$followup_status)) %>% + dplyr::pull(.data$indik_prom_klineff_data) == "nei")) + + + # Forventer i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(!is.na(.data$followup_status), + .data$abla_strat_av_his %in% 0, + .data$forlopstype %in% 1) %>% + dplyr::pull(.data$indik_prom_klineff_data) == "ja")) + + # Forventer at alle er enten ja eller nei (ingen NA) + testthat::expect_equal( + df_out %>% + dplyr::count(.data$indik_prom_klineff_data) %>% + dplyr::pull(.data$indik_prom_klineff_data), + c("ja", "nei")) + + # Forventer at dersom ikke i datagrunnlaget er alle NA + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_prom_klineff_data %in% "nei") %>% + dplyr::pull(.data$indik_prom_klineff) %>% + is.na())) + + # Forventet utkomme dersom i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_prom_klineff_data %in% "ja", + is.na(.data$q2)) %>% + dplyr::pull(.data$indik_prom_klineff) == "manglende")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_prom_klineff_data %in% "ja", + .data$q2 %in% 1:3) %>% + dplyr::pull(.data$indik_prom_klineff) == "ja")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_prom_klineff_data %in% "ja", + .data$q2 %in% 4:5) %>% + dplyr::pull(.data$indik_prom_klineff) == "nei")) + + + # Forventer feilmelding + testthat::expect_error( + ablanor::indik_prom_klineff(df = data.frame(forlopstpe = 1, + abla_strat_av_his = 0, + followup_status = NA)) + ) +}) + + +# Test indikator utfylt komplikasjoner +testthat::test_that("KI: ferdig utflyt komplikasjoenr", { + + df <- data.frame(komp_janei = c(NA, 0, 1)) + df_out <- ablanor::indik_ferdig_komplik(df) + + testthat::expect_true(all( + df_out %>% + dplyr::pull(.data$indik_ferdig_komp_data) == "ja" + )) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(is.na(komp_janei)) %>% + dplyr::pull(.data$indik_ferdig_komp) == "nei" + )) + testthat::expect_true(all( + df_out %>% + dplyr::filter(!is.na(komp_janei)) %>% + dplyr::pull(.data$indik_ferdig_komp) == "ja" + )) + + testthat::expect_error( + ablanor::indik_ferdig_komplik(df = data.frame(feil_variabel = 1)) + ) +}) + +# Test indikator: AKutt suksess ---- +testthat::test_that("KI: Akutt suksess fungerer", { + df <- data.frame( + abla_strat_ingen = c(1, NA, rep(0, 18)), + abla_strat_av_his = c(0, 0, 1, NA, rep(0, 16)), + forlopstype = c(rep(1, 4), NA, rep(1, 5), rep(2, 3), rep(3, 6), 4), + aryt_i47_1_underkat = c(rep(NA, 13), NA, 1:5, NA), + akutt_suksess = c(rep(NA, 5), NA, 9, 0, 1, 2, 0:2, 0:2, 0:2, 1) + ) + + + df_out <- ablanor::indik_akuttsuksess(df) + + # Forventer ikke i datagrunnlag + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$abla_strat_ingen %in% 0) %>% + dplyr::pull(.data$indik_akuttsuksess_data) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$abla_strat_av_his %in% 0) %>% + dplyr::pull(.data$indik_akuttsuksess_data) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(is.na(.data$forlopstype), + !.data$forlopstype %in% 1:3) %>% + dplyr::pull(.data$indik_akuttsuksess_data) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$forlopstype %in% 3, + !.data$aryt_i47_1_underkat %in% c(1, 2, 4)) %>% + dplyr::pull(.data$indik_akuttsuksess_data) == "nei")) + + # Forventer i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$abla_strat_ingen %in% 0, + .data$abla_strat_av_his %in% 0, + .data$forlopstype %in% 1) %>% + dplyr::pull(.data$indik_akuttsuksess_data) == "AFLI")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$abla_strat_ingen %in% 0, + .data$abla_strat_av_his %in% 0, + .data$forlopstype %in% 2) %>% + dplyr::pull(.data$indik_akuttsuksess_data) == "VT")) + + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$abla_strat_ingen %in% 0, + .data$abla_strat_av_his %in% 0, + .data$forlopstype %in% 3, + .data$aryt_i47_1_underkat %in% c(1, 2)) %>% + dplyr::pull(.data$indik_akuttsuksess_data) == "AVNRT")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$abla_strat_ingen %in% 0, + .data$abla_strat_av_his %in% 0, + .data$forlopstype %in% 3, + .data$aryt_i47_1_underkat %in% 4) %>% + dplyr::pull(.data$indik_akuttsuksess_data) == "AVRT")) + + # Forventer disse niv?ene (ingen NA) + testthat::expect_true(all( + df_out %>% + dplyr::count(.data$indik_akuttsuksess_data) %>% + dplyr::pull(.data$indik_akuttsuksess_data) %>% + as.character() == + c("AFLI", "VT", "AVRT", "AVNRT", "nei"))) + + # Forventer at dersom ikke i datagrunnlaget er alle NA + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_akuttsuksess_data %in% "nei") %>% + dplyr::pull(.data$indik_akuttsuksess) %>% + is.na())) + + # Forventet utkomme dersom i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$indik_akuttsuksess_data %in% "nei", + (is.na(.data$akutt_suksess) | + !.data$akutt_suksess %in% 0:2)) %>% + dplyr::pull(.data$indik_akuttsuksess) == "manglende")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$indik_akuttsuksess_data %in% "nei", + .data$akutt_suksess %in% c(0, 2)) %>% + dplyr::pull(.data$indik_akuttsuksess) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$indik_akuttsuksess_data %in% "nei", + .data$akutt_suksess %in% 1) %>% + dplyr::pull(.data$indik_akuttsuksess) == "ja")) + + + # Forventer feilmelding + testthat::expect_error( + ablanor::indik_akuttsuksess(df = data.frame(forlopstpe = 1, + abla_strat_av_his = 0, + akutt_suksess = NA)) + ) +}) + + +# Test indikator: Pacemakerbehov +testthat::test_that("KI: pacemakerbehov fungerer", { + + df <- data.frame( + forlopstype = c(1, 2, 4, 9, NA, rep(3, 5)), + abla_strat_av_his = c(rep(0, 5), 1, NA, rep(0, 3)), + komp_avblokk_pm = c(rep(1, 7), NA, 0, 1) + ) + + df_out <- ablanor::indik_pacemaker(df) + + # Forventer ikke i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$forlopstype %in% 3) %>% + dplyr::pull(.data$indik_pacemaker_data) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$abla_strat_av_his %in% 0) %>% + dplyr::pull(.data$indik_pacemaker_data) == "nei")) + + + # Forventer i datagrunnlaget + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$abla_strat_av_his %in% 0, + .data$forlopstype %in% 3) %>% + dplyr::pull(.data$indik_pacemaker_data) == "ja")) + + # Forventer disse verdiene i datagrunnlaget + testthat::expect_equal( + df_out %>% + dplyr::count(.data$indik_pacemaker_data) %>% + dplyr::pull(.data$indik_pacemaker_data), + c("ja", "nei")) + + # Forventer NA for alle dersom NEI + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_pacemaker_data == "nei") %>% + dplyr::pull(.data$indik_pacemaker) %>% + is.na())) + + # Forventede verdier dersom JA + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_pacemaker_data == "ja", + .data$komp_avblokk_pm %in% 0) %>% + dplyr::pull(.data$indik_pacemaker) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_pacemaker_data == "ja", + .data$komp_avblokk_pm %in% 1) %>% + dplyr::pull(.data$indik_pacemaker) == "ja")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_pacemaker_data == "ja", + is.na(.data$komp_avblokk_pm)) %>% + dplyr::pull(.data$indik_pacemaker) == "manglende")) + + # Forventer feilmelding + testthat::expect_error( + ablanor::indik_pacemaker( + df = data.frame(tullevariabel_med_feil_navn = 1))) + + +}) + + + + +# Tester for AVBRUDD ----- +test_that("KI-AVBRUDD wokrs", { + + df <- data.frame( + forlopstype = c(4, NA, rep(1, 7), 2, 3, 1, 2, 2, 2, 2), + abla_strat_av_his = c(0, 0, NA, rep(0, 6), NA, 1, 1, 0, 1, 0, 0), + abla_strat_ingen = c(rep(0, 3), NA, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, NA), + abla_strat_ingen_arsak = c(rep(NA, 4), 1, 4, 5, rep(NA, 5), 4, NA, 99, NA)) + + df_out <- ablanor::indik_avbrudd(df = df) + + + # Forventer ikke i datagrunnlaget for disse: + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$forlopstype %in% 4 | is.na(.data$forlopstype)) %>% + dplyr::pull(.data$indik_avbrudd_data) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter( + .data$forlopstype == 1, + is.na(.data$abla_strat_av_his)) %>% + dplyr::pull(.data$indik_avbrudd_data) == "nei")) + + + testthat::expect_true(all( + df_out %>% + dplyr::filter(is.na(.data$abla_strat_ingen)) %>% + dplyr::pull(.data$indik_avbrudd_data) == "nei")) + + + + # Forventer i datagrunnlaget for disse: + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$forlopstype %in% 1, + .data$abla_strat_av_his %in% 0, + !is.na(.data$abla_strat_ingen)) %>% + dplyr::pull(.data$indik_avbrudd_data) == "AFLI")) + + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$forlopstype %in% 2:3, + !is.na(.data$abla_strat_ingen)) %>% + dplyr::pull(.data$indik_avbrudd_data) == "VT, SVT, AV-knuter")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$forlopstype %in% 1:3, + !is.na(.data$abla_strat_ingen), + .data$abla_strat_av_his %in% 1) %>% + dplyr::pull(.data$indik_avbrudd_data) == "VT, SVT, AV-knuter")) + + + + # Forventer ja/nei/manglende + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$indik_avbrudd_data %in% "nei", + .data$abla_strat_ingen %in% 1, + .data$abla_strat_ingen_arsak %in% 4:5) %>% + dplyr::pull(.data$indik_avbrudd) == "ja")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$indik_avbrudd_data %in% "nei", + .data$abla_strat_ingen %in% 0) %>% + dplyr::pull(.data$indik_avbrudd) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$indik_avbrudd_data %in% "nei", + .data$abla_strat_ingen %in% 1, + .data$abla_strat_ingen_arsak %in% c(1, 2, 3, 9)) %>% + dplyr::pull(.data$indik_avbrudd) == "nei")) + + testthat::expect_true(all( + df_out %>% + dplyr::filter(!.data$indik_avbrudd_data %in% "nei", + .data$abla_strat_ingen %in% 1, + is.na(.data$abla_strat_ingen_arsak)) %>% + dplyr::pull(.data$indik_avbrudd) == "manglende")) + + + testthat::expect_true(all( + df_out %>% + dplyr::filter(.data$indik_avbrudd_data == "nei") %>% + dplyr::pull(.data$indik_avbrudd) %>% + is.na())) + + + # Forventer feilmelding + testthat::expect_error( + ablanor::indik_avbrudd(data.frame(forlopstype = 1, + abla_strat_av_his = 0)) + ) +})