--- title: "Mål-værdier og procent-akser" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Mål-værdier og procent-akser} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4 ) ``` ## Den hyppigste fejl: 2% bliver til 200% Før BFHcharts 0.9.0 producerede dette stille en misvisende graf: ```r bfh_qic(data, ..., y_axis_unit = "percent", target_value = 2.0, # Brugerens hensigt: "2%" target_text = "↓ Mål: 2%" ) ``` `bfh_qic()` plottede target-linjen ved y = 2.0 — som på en procent-akse renderer som **200%**. Klinisk konsekvens: et mål der ser ud som umuligt at nå (eller, værre, som "altid nået"). Fra v0.9.0 valideres `target_value` mod skalaen implyeret af `multiply`: | `multiply` | Forventet `target_value` skala | Eksempel | |------------|-------------------------------|----------| | `1` (default) | Proportion `[0, 1.5]` | `target_value = 0.02` betyder 2% | | `100` | Procent `[0, 150]` | `target_value = 2.0` betyder 2% | Validering uden for området kaster en hård fejl med migration-hint. ## Kontrakten i praksis ### Option A: Proportion (default, `multiply = 1`) Data er proportioner i [0, 1]. Y-aksen formateres med `%`-suffix (BFHcharts multiplicerer med 100 ved tegning, men værdier er proportioner internt). ```{r option-a-fixed} library(BFHcharts) data <- data.frame( month = seq(as.Date("2024-01-01"), by = "month", length.out = 12), infections = c(15, 18, 12, 14, 16, 13, 11, 9, 10, 8, 7, 6), discharges = rep(100L, 12) ) # multiply = 1 (default), target som proportion bfh_qic(data, x = month, y = infections, n = discharges, chart_type = "p", y_axis_unit = "percent", target_value = 0.10, # 10% — proportion target_text = "↓ Mål: <10%" ) ``` ### Option B: Procent (`multiply = 100`) Data og target er begge i procent (0-100 skala). Y-aksen formateres uden konvertering. ```{r option-b-fixed} bfh_qic(data, x = month, y = infections, n = discharges, chart_type = "p", y_axis_unit = "percent", multiply = 100, target_value = 10, # 10% — procent target_text = "↓ Mål: <10%" ) ``` Begge giver samme visuelle resultat. Vælg den der matcher hvordan dine data er gemt (proportion vs procent). ## Direction-operatorer i `target_text` `target_text` understøtter directional indicators der **erstatter** target-linjen med en pil ved plot-kanten: | Symbol | Betydning | |--------|-----------| | `↑` | Højere er bedre (ingen line, kun pil opad) | | `↓` | Lavere er bedre (ingen line, kun pil nedad) | | `<` | Mål er øvre grænse | | `>` | Mål er nedre grænse | ```{r arrow-target} # Pil-target (ingen visible line) bfh_qic(data, x = month, y = infections, n = discharges, chart_type = "p", y_axis_unit = "percent", target_value = 0.10, target_text = "↓ Mål: 10%" # Pil-version ) ``` Når `target_text` indeholder `↑`, `↓`, `<`, eller `>`, suppresseres target-linjen i plottet for at undgå dobbelt-visualisering. Pilen placeres ved den right-edge label-pipeline. ## Hvornår er target en benchmark vs aspiration? Tre kategorier af mål, hver med forskellig statistisk fortolkning: ### Benchmark (sammenligning) Mål = ekstern reference (national gennemsnit, regional median). Brug fast linje uden directional pil. Ikke en kontrolgrænse — bare en visualiseringsreference. ```{r benchmark, eval = FALSE} bfh_qic(data, ..., target_value = 0.12, # National gennemsnit 12% target_text = "Nationalt gns." ) ``` ### Aspiration (mål) Mål = ønsket fremtidig tilstand. Ofte med directional pil (`↑`/`↓`). Vis at processen er på vej derhen, eller at fokuseret indsats kræves. ```{r aspiration, eval = FALSE} bfh_qic(data, ..., target_value = 0.05, target_text = "↓ Mål Q4 2025: 5%" ) ``` ### Lower-/upper-limit (kontrakt) Mål = absolut grænse (regulatorisk, etisk). Kombiner med `<` eller `>` for at markere retningen. Punkter der overstiger grænsen er **akut** action-trigger. ```{r limit, eval = FALSE} bfh_qic(data, ..., target_value = 0.15, target_text = "< Maks acceptabel: 15%" ) ``` ## Sanity-check af din konfiguration Hvis du er i tvivl, sammenlign target-værdi mod data-skala: ```{r sanity, eval = FALSE} # Hvad er din data-range? range(data$y) # Hvis [0, 0.2] → multiply = 1, target i samme skala range(data$y) # Hvis [0, 20] → multiply = 100, target i samme skala # Validér eksplicit stopifnot( target_value >= 0, target_value <= max(data$y) * 2 # Sanity check: target ikke 100x off ) ``` ## Migration fra pre-0.9.0 ```r # Gammel kode (silently misvisende): bfh_qic(data, ..., y_axis_unit = "percent", target_value = 2.0 # Plottet som 200% på percent-akse ) # Ny kode — Option A (anbefalet): bfh_qic(data, ..., y_axis_unit = "percent", target_value = 0.02 # 2% som proportion ) # Ny kode — Option B (hvis data allerede i procent): bfh_qic(data, ..., y_axis_unit = "percent", multiply = 100, target_value = 2.0 # 2% som procent ) ``` Valideringsfejlen vil identificere problemet med præcis migrationshjælp: ``` Error: target_value (2.0) ligger uden for forventet område [0, 1.5] for y_axis_unit = 'percent' med multiply = 1. Du mente sandsynligvis target_value = 0.02 (2% som proportion) eller target_value = 2.0 med multiply = 100 (2% som procent). ``` ## Target og auto-analyse (v0.12.0+) Et target sat på chartet via `target_text` eller `target_value` flyder automatisk til auto-analysen: ```{r target-flow, eval = FALSE} result <- bfh_qic(data, x = month, y = events, n = n, chart_type = "p", y_axis_unit = "percent", target_text = ">= 90%") # Auto-analyse ser target via fallback-kæden — ingen duplikering nødvendig bfh_export_pdf(result, "rapport.pdf", metadata = list(hospital = "BFH"), # target uden for metadata auto_analysis = TRUE) ``` Fallback-kæden er: `metadata$target` → `config$target_text` → `config$target_value`. Eksplicit `metadata$target` overrider stadig chartets target, hvis du ønsker at analysere mod en alternativ benchmark. ## Se også - `vignette("chart-types")` — vælg charttype først - `vignette("phases-and-freeze")` — håndtér interventioner og baseline - `?bfh_qic` — `@details` "Percent Target Contract" sektion - NEWS for v0.9.0 — fuld breaking-change beskrivelse