--- title: "Faser og fastfrysning af baseline" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Faser og fastfrysning af baseline} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4 ) ``` ## To måder at håndtere ændringer `bfh_qic()` understøtter to relaterede men forskellige mekanismer for håndtering af interventioner og baseline-perioder: | Parameter | Hvad det gør | Klinisk brug | |-----------|-------------|--------------| | `part` | Splitter dataset i flere faser; hver fase får **egen** centerlinje + kontrolgrænser | Sammenligning før/efter intervention | | `freeze` | Beregner kontrolgrænser kun fra første N rækker; bruger samme grænser for alle efterfølgende | Etabler baseline, vis afvigelser efter | ## `part` — flere faser med separate kontrolgrænser Brug når du vil sammenligne to (eller flere) statistisk distinkte perioder, fx før og efter en kvalitetsforbedrings-intervention. Hver fase får egen centerlinje og egne kontrolgrænser. ```{r part-example} library(BFHcharts) # Pre-intervention: månedlig infektionsrate ~15% # Intervention rullet ud i marts 2024 # Post-intervention: rate falder til ~8% data <- data.frame( month = seq(as.Date("2024-01-01"), by = "month", length.out = 12), infections = c(15, 18, 14, 9, 8, 7, 8, 9, 7, 6, 8, 7), discharges = rep(100L, 12) ) # part = 3 splitter dataset efter periode 3 (marts) bfh_qic(data, x = month, y = infections, n = discharges, chart_type = "p", y_axis_unit = "percent", part = 3, chart_title = "Infektionsrate (intervention marts 2024)" ) ``` **Anvendelse**: - `part = 3` splitter efter 3. observation - `part = c(3, 9)` opretter 3 faser med splits ved positioner 3 og 9 - Hver fase beregner sin egen `p_bar`, `UCL`, `LCL` **Hvornår** bruges `part`: - Du har en **kendt intervention** med specifik dato - Du forventer at processen er statistisk anderledes efter - Du ikke ønsker at fase 1 forurener fase 2's kontrolgrænser ## `freeze` — fastlås baseline-grænser Brug når du vil etablere en stabil baseline og vise hvordan efterfølgende perioder afviger. I modsætning til `part` får alle perioder samme kontrolgrænser (beregnet fra de første N punkter). ```{r freeze-example} # Baseline = de første 6 måneder (jan-jun 2024) # Baseline-grænser bruges for hele datasættet — afsløre intervention-effekt bfh_qic(data, x = month, y = infections, n = discharges, chart_type = "p", y_axis_unit = "percent", freeze = 6, chart_title = "Infektionsrate (baseline jan-jun, frosset)" ) ``` **Anvendelse**: - `freeze = 6` beregner CL/UCL/LCL kun fra observationer 1-6 - Alle observationer 7+ tegnes mod **samme** grænser - Punkter under LCL post-baseline = signifikant forbedring **Hvornår** bruges `freeze`: - Du har en **historisk stabil** baseline du vil måle imod - Du **ikke** ønsker at post-intervention perioder skal "trække" centerlinjen - Du vil vise effektstørrelse af en intervention visuelt ## Kombineret: `part` + `freeze` Begge parametre kan kombineres når du har flere sekventielle interventioner: ```{r part-freeze-example, eval = FALSE} # Baseline: jan-jun 2024 (frosset) # Intervention 1: jul-sep 2024 # Intervention 2: okt-dec 2024 bfh_qic(data, x = month, y = infections, n = discharges, chart_type = "p", part = c(6, 9), freeze = 6 ) ``` Resultat: 3 faser; fase 1's grænser er frosne fra de første 6 punkter; fase 2 og 3 beregner deres egne grænser fra deres data. ## Almindelige fejl ### Fejl 1: Refreeze på hver datasæt-opdatering ```r # ❌ Forkert: dynamisk freeze gør grænser ustabile bfh_qic(data, ..., freeze = nrow(data) - 3) # Sidste 3 ekskluderet hver gang # ✅ Rigtigt: fast freeze-position fra original baseline bfh_qic(data, ..., freeze = 12) # 12 første måneder, fast ``` ### Fejl 2: Bruge `part` som "moving window" `part` er ikke en glidende vindue. Hver fase er **statistisk uafhængig** — data fra fase 1 påvirker ikke fase 2's kontrolgrænser. ### Fejl 3: For tidlig faseopsplitning Du har brug for ≥8 datapunkter per fase for meningsfulde kontrolgrænser. Under det: brug `run`-chart for fasen i stedet, eller udskyd fase-split til mere data er tilgængelig. ### Fejl 4: Faseopsplitning baseret på data (post-hoc) Bestem `part`-positioner **før** du ser data — baseret på kendte interventionstidspunkter. Splitter du efter at have set hvor data ændrer sig, har du committed cherry-picking. ## Klinisk eksempel: medicineringsfejl ```{r clinical-example} # Antal medicineringsfejl per 1000 ordinationer # Intervention: ny dobbeltkontrol-procedure indført okt 2024 data <- data.frame( month = seq(as.Date("2024-01-01"), by = "month", length.out = 18), errors = c( # Pre-intervention: ~12 fejl/1000 11, 13, 14, 12, 10, 13, 14, 11, 15, # Post-intervention: ~6 fejl/1000 7, 5, 6, 4, 7, 5, 4, 6, 5 ), prescriptions = rep(1000L, 18) ) # Vis effekt med frosset baseline bfh_qic(data, x = month, y = errors, n = prescriptions, chart_type = "u", y_axis_unit = "rate", freeze = 9, chart_title = "Medicineringsfejl per 1000 ordinationer", target_text = "↓ Mål: <8 fejl/1000", target_value = 8 ) ``` Punkter under LCL efter periode 9 demonstrerer signifikant forbedring; baseline fastfrosset så reduktion er visuelt tydelig. ## Strict baseline mode (PDF-eksport, v0.12.0+) Fra v0.12.0 defaulter `bfh_export_pdf()` til **strict-baseline-mode**: eksport afvises hvis `freeze < 8` eller hvis en fase har færre end 8 datapunkter. Begrundelsen er at PDF'er fra eksport-pipelinen lander på QI-leadership-borde hvor R-warnings aldrig når en menneskelig læser, og Anhøj & Olesen (2014) anbefaler `>= 8` baseline-punkter for pålidelig run-/crossing-detection. ```{r strict-baseline, eval = FALSE} result <- bfh_qic(data, x = month, y = errors, freeze = 5L, chart_type = "i") # Default: error før render bfh_export_pdf(result, "rapport.pdf") #> Error: freeze = 5: baseline har faerre end 8 punkter ... #> Saet strict_baseline = FALSE for at acceptere kortere baseline ... # Eksplicit opt-out (warning-only-adfærd): bfh_export_pdf(result, "rapport.pdf", strict_baseline = FALSE) # Batch med session-niveau opt-out: session <- bfh_create_export_session(strict_baseline = FALSE) bfh_export_pdf(result, "rapport.pdf", batch_session = session) ``` `bfh_qic()` selv bevarer warning-only-adfærd — interaktiv brug giver analytikeren mulighed for at se warnings og træffe en informed beslutning. Strict-mode rammer kun eksport-pipelinen. ## Se også - `vignette("chart-types")` — vælg den rigtige charttype først - `vignette("targets-and-percent")` — sat realistiske mål - `?bfh_qic` — `@param part`, `@param freeze` parameter-detaljer - `?bfh_export_pdf` — `@param strict_baseline` for fuld kontrakt