--- title: "Vælg den rigtige SPC-charttype" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Vælg den rigtige SPC-charttype} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4 ) ``` ## Hvorfor charttypen er vigtig Forkert charttype giver misvisende konklusioner. En infektionsrate visualiseret som i-chart (individuelle målinger) ignorerer at varians afhænger af antal patienter i nævneren. En andelsmåling (proportion) i en c-chart antager at maximum er uendeligt — hvilket aldrig er sandt for proportioner ≤ 1. Denne vignette mapper kliniske spørgsmål til charttyper og giver beslutningsregler. ## Beslutningstræ ``` Hvad måler du? │ ├── Tællinger (counts) │ │ │ ├── Konstant areal/eksponering (fx fald per måned, alle samme afdeling)? │ │ → c-chart (Poisson, tællinger med konstant forventning) │ │ │ └── Varierende eksponering (fald per 1000 patientdage)? │ → u-chart (Poisson, rate per eksponering) │ ├── Proportioner (events / total) │ │ │ ├── Klassisk binomial (fx genindlæggelser / udskrivninger)? │ │ → p-chart │ │ │ ├── Procent på y-akse (præsentation i %)? │ │ → pp-chart (Laney p', overdispersion-korrigeret) │ │ │ └── Rate i procent (sygefravær % af planlagt tid)? │ → up-chart (Laney u') │ ├── Kontinuerte målinger │ │ │ ├── Subgrouped data (fx 5 målinger per dag)? │ │ → xbar-chart (mean) + s-chart (variation) │ │ │ ├── Individuelle målinger (én måling per periode)? │ │ → i-chart + mr-chart (moving range) │ │ │ └── For lille n eller ikke-normal fordeling? │ → run-chart (kun centerlinje, ingen kontrolgrænser) │ └── Tid eller antal mellem hændelser │ ├── Tid mellem (dage mellem fald)? │ → t-chart (Nelson-transformation for skæv fordeling) │ └── Antal mellem (vagter siden sidste fejl)? → g-chart (geometrisk fordeling) ``` ## Per chart-type: hvornår, hvorfor ### `p` — proportion (binomial) Klassisk: `p = events / total`. Bruges når data er binær per observation (fx infektion ja/nej for hver patient) og du vil måle andelen. ```{r p-example} library(BFHcharts) # 12 måneder, infektioner per 1000 udskrivninger 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 = c(950, 1020, 980, 1050, 1010, 990, 970, 1030, 1000, 985, 995, 1015) ) bfh_qic(data, x = month, y = infections, n = discharges, chart_type = "p", y_axis_unit = "percent", chart_title = "Infektionsrate" ) ``` **Krav**: `n` (denominator) skal være ikke-NULL og positiv. `events <= n` for hver række. ### `u` — rate per eksponering (Poisson) Bruges når events tælles per "eksponeringsenhed" (patientdage, vagter, behandlinger). I modsætning til `p` har `u` ikke et øvre bound (rates kan i princippet overstige 1). ```{r u-example, eval = FALSE} # Fald per 1000 patientdage bfh_qic(data, x = month, y = falls, n = patient_days, chart_type = "u", y_axis_unit = "rate" ) ``` ### `c` — konstant-eksponering tællinger Bruges når eksponering er praktisk konstant (samme afdeling, samme periodelængde). Simpler end u-chart men kræver konstans-antagelsen. ### `i` — individuelle kontinuerte målinger For målinger hvor du har én værdi per periode (fx daglig ventetid). Brug **altid** sammen med `mr`-chart for at se variation mellem konsekutive målinger. ### `xbar` + `s` — subgrouped kontinuerte data Når hver periode har flere målinger (fx 5 patienter målt per dag). `xbar` viser gennemsnit, `s` viser within-group variation. Kraftigt par når subgroup-størrelsen er stabil. ### `run` — for lille n eller ikke-normalitet Hvis du har <12 datapunkter, eller fordelingen er kraftigt skæv, er kontrolgrænser upålidelige. Run-chart giver kun centerlinje + Anhøj-regler — fang systematiske ændringer uden fejlagtig falsk-positiv. ### `t` og `g` — tid/antal mellem hændelser Til sjældne events. `t` (dage mellem) bruger Nelson-transformation for at håndtere skæv eksponentiel fordeling. `g` (count mellem) for diskret tælling. ## Anti-patterns: når SPC misleder | Mønster | Problem | |---------|---------| | Bruge `i` til andele | Ignorerer denominator → forkerte kontrolgrænser | | Bruge `c` til varierende eksponering | Antager konstant baseline → falske signaler | | Skifte chart-type efter at have set data | Bias (cherry-picking) — bestem på forhånd | | Genberegne baseline efter intervention | Brug `freeze` til at låse pre-intervention CL | | <12 datapunkter med kontrolgrænser | Brug `run` indtil du har ≥12-15 punkter | ## Sample size guidance | Chart-type | Minimum n | Anbefalet n | |------------|-----------|-------------| | `p`, `u` | 8 | 20+ med n_i > 10 | | `c` | 8 | 20+ med c_bar > 5 | | `i`, `mr` | 12 | 20+ | | `xbar`, `s`| 8 subgroups| 20+ subgroups, n_i ≥ 4 | | `t`, `g` | 8 events | 25+ events | | `run` | 8 | 12+ | ## Reference - Provost LP & Murray SK (2011). *The Health Care Data Guide*. Jossey-Bass. - Mohammed MA et al. (2008). "Plotting basic control charts." *BMJ Quality & Safety* 17:137-145. - Anhøj J & Olesen AV (2014). "Run charts revisited." *PLOS ONE* 9(11):e113825. ## Se også - `vignette("phases-and-freeze")` — håndtér interventioner og baseline - `vignette("targets-and-percent")` — target-værdi og procent-akser - `?bfh_qic` — fuld parameter-dokumentation