Skip to content

A magyar kórházi fertőzések 2015-2022. évi adatainak elemzése

License

Notifications You must be signed in to change notification settings

tamas-ferenci/NNSRElemzes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A magyar kórházi fertőzések 2015-2022. évi adatainak elemzése

Ferenci Tamás (https://www.medstat.hu/)

Összefoglaló gondolatok

  • A bíróság döntése nyomán elérhetővé vált a kórházi fertőzésekre vonatkozó magyar adatgyűjtés 2015 és 2016, majd pedig 2017 és 2022 közötti adatbázisa, melyben soha korábban nem látott részletezettségű, egyedi adatok vannak a kórházi fertőzéses esetekről: a betegről ugyan kevés információ van (még a neme és életkora sem szerepel, hogy ne legyen beazonosítható), viszont a fertőzés ténye, a kórház és a kórházi osztály meg van adva, több egyéb információ mellett.
  • Ez lehetővé teszi az egyes kórházak összehasonlítását, ami nagyon fontos feladat, mind a közvélemény, mind az egészségügyi ellátórendszer és annak irányításáért felelős szervek számára – azonban óvatosnak kell lenni.
  • Az egyik probléma, hogy nem biztos, hogy a jelentési fegyelem ugyanolyan minden kórházban: lehet, hogy ahol több kórházi ellátással összefüggő fertőzés fordult elő, ott nem baj van, hanem ellenkezőleg, több ilyen irányú vizsgálatot végeznek és lelkiismeretesebben jelentik a feltárt eseteket. Ez jelen esetben különösen kritikus problémakör, nehogy a rangsor épp ezeket a kórházakat büntesse, előnytelen színben tüntetve fel őket. Sajnos azonban – információ híján – erre korrigálni nem lehet (egyedül annyi mondható, hogy a hivatalos szervek nem hivatkozhatnak erre, hiszen az ő közleményeikben soha fel nem merült, hogy a magyar jelentési rendszer működésében bármiféle tökéletlenség lenne).
  • A másik probléma, hogy az egyes kórházak eltérnek az általuk ellátott betegek összetételében is (állapot súlyossága, társbetegségek, nem, életkor stb.), így egyáltalán nem biztos, hogy ahol több a fertőzés, ott valami baj van – az is lehet, hogy ott egyszerűen rosszabb állapotú, és így kórházi fertőzésre is hajlamosabb betegeket látnak el. Bár paradoxnak hangzik, de akár még az is előfordulhat, hogy ott jobb a helyzet, ahol több fertőzés fordul elő – ha a betegösszetétel annyival előnytelenebb.
  • Ez utóbbi probléma esetében azonban, ha nem is tökéletes megoldásra, de korrekcióra van lehetőség; jelen elemzés ezt a kérdést fogja körbejárni. A vizsgálat alapvetően két ötletre épít. Az egyik, hogy nem kórház-szintű fertőzés-gyakoriságot használ, hanem osztály szintjén számolja az előfordulást. Ez azért fontos, mert az egyes szakmák érzékenysége a kórházi fertőzésre nagyon eltér: egy intenzív ellátás sokkal nagyobb kockázatot hordoz ilyen szempontból, mint mondjuk egy szemészet (a végzett beavatkozások miatt is és a betegek állapota miatt is). Ez automatikusan előnytelenebb helyzetbe hozza azokat a kórházakat, ahol van intenzív ellátás, vagy ahol nagyobb intenzív osztály van. Ha azonban nem kórházat hasonlítunk kórházzal, hanem osztály szinten dolgozunk, az jóval homogénebb összehasonlítás lesz. Azonban még intenzív osztály és intenzív osztály (vagy épp szemészet és szemészet) között is nagy különbség lehet, úgyhogy fontos lenne még pontosabban korrigálni a betegösszetételre. Erre sajnos direkt lehetőség, legalábbis a nyilvánosan elérhető adatokból, nincsen – az adatbázisban még életkor és nem sincs, társbetegségek ugyan vannak, de a korrekcióhoz ismerni kellene a fertőzést el nem szenvedett kórházi betegek hasonló adatait is, ami viszont nem áll rendelkezésre – de egy indirekt lehetőség felvethető. Ez pedig az, hogy bár egy adott kórház adott osztályán kezelt betegek orvosi súlyosságáról nincs nyilvánosan elérhető adat, de „pénzügyi súlyosságáról”, azaz az utánuk elszámolt költségekről van. Nem feltételezhető, hogy a kétféle súlyosság pontosan ugyanaz, viszont az sem igaz, hogy semmi kapcsolat nincs köztük: a rosszabb állapotú, idősebb, esendőbb – és így kórházi fertőzésre is fogékonyabb – betegeknél vélhetően a kezelés is hosszabb, költségesebb, így ez utóbbi súlyosságot felhasználhatjuk, hogy ha nem is tökéletesen, de valamennyire korrigáljunk, így javítva a becslést.
  • A vizsgálatra ún. regressziós modellezéssel került sor, mely a biostatisztika legáltalánosabban használt eszköze ilyen helyzetek kezelésére. Miután a megfelelő modellt kiválasztottuk, megtehetjük, hogy a segítségével minden kórházra kiszámolunk egy olyan fertőzés-gyakoriságot, ami – a fenti limitációk erejéig – korrigálva van a kórházak eltérő betegösszetételére, ebből fakadóan jobban összehasonlíthatóvá teszi egymással a különböző kórházakat. (Természetesen a jelentési fegyelem problémáján ez sem tud segíteni.)
  • A modellezés során több döntést kell hozni, ezek némely esetben nem egyértelműek, ezért fontos, hogy minden ilyen döntési helyzetben az összes szóba jövő lehetőséget megvizsgáljuk. Ezt hívják érzékenységvizsgálatnak, hiszen kiderül belőle, hogy a végeredmény mennyire érzékeny arra, hogy milyen modellt választunk. Szerencsés esetben a különböző modellek eredményei nagyjából egybecsengenek, ami megnyugtató, hiszen ilyenkor mondhatjuk, hogy a válasz nem nagyon függ attól, hogy pontosan milyen modellezési stratégiát választottunk.
  • Nagyon fontos kérdés ezen adatok, vizsgálatok kapcsán a transzparencia, két okból is. Az egyik a bizalom: mint minden népegészségügyi rendszer esetében, itt is igaz, hogy a bizalom megteremtésének és fenntartásának a legjobb eszköze az, ha az adatok, elemzések nem felkent emberek belügyei, hanem minden állampolgár (azaz minden érintett!) számára – az adatvédelmi, személyiségi jogi szempontok betartásával – megismerhetőek, az elemzési folyamat és az eredmények nyilvánosak, bárki számára ellenőrizhetőek. Nem igaz, hogy a bizalmat rombolja az, ha rosszak az eredmények (sőt, bizonyos értelemben ez erősíti meg a legjobban, mert azt mutatja a lakosságnak, hogy még ezeket sem kell eltitkolni, tehát lehet hinni az adatoknak), ami rombolja a bizalmat, az az elhallgatás és a titkolózás, az – adatok híján kialakuló! – szájhagyományok és rémhírek, az „ehhez te úgysem értesz, ne üsd bele az orrod az okos szakemberek dolgába”-szemlélet. A másik szempont a hibajavítás: több szem többet lát, minél többen tekinthetnek bele az adatgyűjtési és adatelemzési folyamatba, annál valószínűbb, hogy kiderülnek a hibák, felmerülnek az esetleges jobb elemzési lehetőségek.
  • Sajnos ennek a szempontnak a jelenlegi magyar rendszer igen rosszul felel meg: kevés információt ad meg, azt is gyakran késve, kellő magyarázat nélkül, elégtelen részletezettséggel, a limitációk feltárása nélkül.
  • Remélhető, hogy ez a projekt ezzel szemben arra is gyakorlati, valós példát ad, hogy milyen előnyei vannak a transzparens hozzáállásnak: noha nagyon nehézkesen megszerzett, nehezen feldolgozható formátumú adatokból, a hivatalos szervek támogatása nélkül készült, már így is, első nekifutásra is olyan mélységű elemzést, és olyan részletezettségű eredményeket produkált, ami soha korábban nem jelent meg Magyarországon. Olyan adatokról beszélünk, amelyek ismerete közvetlenül felhasználható az egészségügyi rendszer javítására!
  • A transzparenciát saját magamra is érvényesítem: minden elemzést végző statisztikai kódot teljes terjedelemben, bárki számára nyilvánosan elérhetővé teszek ebben a dolgozatban. Pontosan a fenti két okból: azért, hogy erősítsem a bizalmat abban, hogy a végeredményeim helyesek (hiszen bárki ellenőrizheti azokat, a teljes számítással együtt), és azért, hogy az esetleges hibák, jobb elemzési lehetőségek kiderülhessenek. Ez utóbbi is nagyon fontos: egy ilyen kérdés soha nem „befejezett” téma, ez egy aktív kutatási terület, nem csak, hogy nem probléma, hanem kifejezett öröm számomra, ha valaki kijavítja, továbbfejleszti a munkámat, és még jobb elemzést készít; ezt is próbálom elősegíteni a statisztikai kódok közlésével és a hozzá fűzött magyarázatokkal.
  • A transzparenciával szemben gyakran felhozott érv, hogy az emberek „nem értik meg” vagy „félreértik” a számokat. Ezt az érvelést ilyen formában nem tartom elfogadhatónak. Nem azért, mert ne lenne igaz: igen, könnyen lehet, hogy lesz, aki nem érti meg, könnyen lehet, hogy félreértések adódnak, de erre nem az a megoldás, hogy akkor inkább a sötétségben tartunk mindenkit, hanem az, ha segítünk a megértésben! Igen, teljesen egyetértek, „pontos tájékoztatás” és „megfelelő tudás” nélkül félrevezetőek lehetnek az adatok, de erre nem az a megoldás, hogy akkor nem mondunk semmit, hanem az, ha pontos tájékoztatást adunk, megfelelő tudással. Értelmezést adunk az adatokhoz, közérthető magyarázatot nyújtunk, statisztikai korrekciókkal védekezünk a torzítások ellen (ahogy jelen elemzésben is történt). Ebben is igyekszik példát mutatni ez a vizsgálat: a lenti írás kísérletet tesz – az elemzésen túl – arra is, hogy az előbbieknek megfelelően egy közérthető magyarázatot adjon az adatok és az eredmények értelmezéséhez.
  • Az viszont legitim kérdés, hogy helyes-e a kórházak nevének közlése. Ezzel kapcsolatban két ellenérv vethető fel. Az egyik, hogy nem engedhető meg, hogy egy adatközlés olyan viselkedés-módosulást váltson ki, ami egészségügyi károkat okoz (magyarán: hogy a betegek elkezdjenek tömegesen egyik kórházból a másikba áramlani, összeomlasztva az ellátórendszert). A másik, hogy az adatközlés nehogy paradox ösztönzőként viselkedjen, tehát, hogy a lista élére került kórházak azzal reagáljanak, hogy akkor inkább innentől nem jelentenek rendesen, nehogy megint egy ilyen kimutatás élén landoljanak. A személyes véleményem, hogy a minőségbiztosítást az szolgálja jobban, ha a kórháznevek is nyilvánosak, így a fenti probléma valójában inkább a hosszú és rövid távú szempontok ütközésére példa. Valóban elképzelhető, hogy a transzparens modellre való átállásban lesz egy átmeneti, turbulens, fáradságos időszak, ám ennek révén juthatunk el egy olyan állapotba, mely – a fent vázolt okokból – sokkal jobban szolgálja mind a betegek, mind az orvosok és ápolók érdekeit. Éppen ezért véleményem szerint a megoldás nem az, hogy erre a nehezebb időszakra tekintettel elhalogatjuk az áttérést (nyilván a végtelenségig), hanem az, ha ezekre a problémákra tudatosan készülünk, például épp a felvilágosítással, amire próbál ez az írás is példát adni.
  • A másik szempont, amiben véleményem szerint példát mutat ez a projekt: az adatalapú elemzés és döntéshozatal szerepének, jelentőségének és erejének felmutatása. Ezt gyakran szokták emlegetni manapság, de sajnos kevés nyilvános példa van arra, hogy miért fontos ez, milyen információkat lehet előállítani megfelelő statisztikai módszerek alkalmazásával, és azok miért relevánsak. Az itteni eredmények nagyon erős példát adnak erre: egy fontos kérdésben segítenek a tisztánlátásban, megmutatva, hogy megfelelő szándék esetén hogyan segítheti az adatokra alapozott elemzés az egészségügyi ellátórendszer jobbítását, a hibák feltárását. Itt fontos rögtön hozzátenni, hogy a „hiba” szót a legáltalánosabban értelemben használom, és egyáltalán nem csak olyanokra gondolok, hogy egy kórházban probléma van mondjuk a fertőtlenítéssel: az is hiba, ha gyanúsan nagy különbségek vannak a kórházak között, és ezért felmerül, hogy nem korrigáltunk jól a betegösszetételre, vagy, ha itt sem találunk gondot, akkor talán a jelentési fegyelem kapcsán kell vizsgálódnunk? Akárhogy is, az adatok megmutatják, hogy valamit javítanunk kell, és, ami nem kevésbé fontos, abban is adhatnak iránymutatást, hogy mit.
  • Természetesen figyelembe kell venni a preventálhatóság kérdését: nem szabad azt a látszatot kelteni, hogy tökéletes elemzéssel meg lehetne szüntetni a kórházi fertőzéseket, de az is biztos, hogy lehet velük javítani; e javítások határának feltárása szintén izgalmas kérdés önmagában is.
  • Csak zárójelben teszem hozzá, de hátsó szándékom példát mutatni a biostatisztikus gondolkodásmódra is (különös hangsúllyal két szemponton: hogy miért fontos az adatok, adatforrások limitációinak megértése, valamint annak megmutatása, hogy nagyon gyakran nincsenek egyszerű, egymondatos, egy perc alatt elmondható válaszok a kérdésekre).
  • Zárásként fontos hangsúlyozni, hogy az egész kérdéskör véleményem szerint elsősorban nem az „ujjal mutogatásról”, a személyi felelősök kereséséről kell, hogy szóljon, nem arról, hogy „te elrontottad, mert nem mostál kezet, pedig kellett volna!”. Még ha igaz is, ez a megközelítés sokszor pont a lényeget téveszti szem elől: biztos, hogy a hibák csak és kizárólag ilyen egyéni szinten értelmezhetőek és értelmezendőek? Hogy ennek feltárásával a végére jártunk a problémának? Nem lehet, hogy a hibázás egész véletlenül összefüggésben van azzal, hogy hány beteg jut egy ápolóra az adott kórházban vagy osztályon? (Vagy akár az egész egészségügyi ellátórendszerben.) Hogy milyen az adott osztály biztonsági kultúrája, az infekciókontroll protokollok betartásának és betartatásának mértéke, mit látnak az egészségügyi dolgozók a régebb óta ott dolgozó munkatársaiktól, a feletteseiktől, mibe szocializálódtak bele, rendelkezésre áll-e kellő mennyiségű és minőségű fertőtlenítőszer és védőeszköz? Népszerű szóval élve: a rendszerszintű kérdések. Bár természetesen van szerepünk, de a hibák általában nem kizárólag az emberi hanyagság, tudatlanság, figyelmetlenség kontextusában értelmezhetőek: van egy környezet, mely lehet táptalaja is annak, hogy ilyen hibák megtörténjenek, de csökkentheti is ezek valószínűségét. Ennek a megértése kritikusan fontos ahhoz, hogy a kórházi rangsorok mögött meghúzódó okokat jobban lássuk és láttassuk, mert csak ez vezethet el minket ahhoz, hogy a helyzeten javíthassunk és megtaláljuk ehhez a legjobb megoldásokat. Az egyéni felelősségrevonás is lehet elkerülhetetlen, de önmagában ettől érdemi, tartós, önfenntartó javulás nem várható egy egészségügyi rendszerben. Akkor van lehetőségünk a beavatkozási lehetőségek jó megfogalmazására, ha a rendszer egészének is megértjük a viselkedését, azonosítjuk a hibákat megelőző és azokat elősegítő pontjait, mert így tudjuk a leghatékonyabban javítani a rendszer teljesítményét, ezzel szolgálva a betegek és az egész magyar lakosság érdekeit.

A kutatás előzményei: helyzetkép a magyar adatközlésről

Az egészségügyi ellátással összefüggő fertőzések (angol kifejezéssel és rövidítéssel healthcare-associated infection, HAI, általánosan használt leszűkítéssel „kórházi fertőzések”, orvosi szóval nosocomiális fertőzések) nyomonkövetése és átfogó, standardizált elemzése bő 20 éves múltra tekint vissza Magyarországon. 2002-ben, amerikai minta alapján született meg az első teljeskörű, precíz definíciója az ilyen fertőzéseknek, majd 2004. november 1-én indult el a szisztematikus adatgyűjtés az ún. Nemzeti Nosocomialis Surveillance Rendszer (NNSR) keretében. 2006-ban vált teljessé az induló éra eljárásrendje a standardizált módszerek teljeskörű leírásának megjelenésével. Ebben az időszakban kötelezően jelentendő volt minden multirezisztens kórokozó (MRK) okozta kórházi fertőzés és minden kórházi véráramfertőzés (VÁF), valamint minden kórházi járvány. 2009-ben született meg a mai napig hatályos, úttörő jellegű rendelet, mely a területet alapvetően szabályozza.

A következő nagy frissítésre 2014-ben került sor: ekkor jelent meg az új változata az alkalmazott definícióknak, mely leváltotta (és kibővítette) a korábbi verziót; ugyanebben az évben jelent meg az a rendelet is, ami a korábbi rendeletet kiegészítve szabályozta a jelentési rendet. Ekkor már a korábban felsoroltakon kívül a Clostridium difficile (mai nevén: Clostridiodies difficile, CDI) okozta fertőzéseket is kötelezően jelenteni kellett az előbbieken felül. Szintén kötelezővé vált az alkoholos kézfertőtlenítőszer-felhasználásra vonatkozó jelentés. (A kötelező jelentéseket több választható modul is kiegészíti.)

A mostani szempontunkból különösen fontos aspektus az adatok közlése. Hogy a helyzetet érzékeljük, egyelőre ne is beszéljünk a kórház-szintű adatokról, és maradjunk az aggregált adatok közlésének a kérdésénél, hiszen ez – elvileg – semmilyen kérdést vagy problémát nem vet fel, még az állami szervek szerint sem, így rutinszerűen kell közölniük azokat. Ezen adatok közlése eleinte valóban meglehetősen egységes rendben zajlott. A 2005-ös eredmények 2006 februárban (MRK), illetve áprilisban (VÁF) jelentek meg, a 2006-os eredmények 2007 júniusban (MRK), illetve szintén júniusban (VÁF), a 2007-es eredmények 2008-ban, majd pedig az említett 2009-es rendelet immár hivatalosan is szabályozta, hogy az adott évi jelentést mindig a következő év június 1-ig kell közzétenni (14. § (2) bekezdés). Ez megtörtént 2009-ben, 2010-ben, 2011-ben és 2012-ben. Ekkor azonban jött a csavar: a 2012-es adatokat nem adták ki 2013. június 1-ig. Erre semmiféle jogi lehetőség nem volt: egész egyszerűen elszabotálták a jogszabályt. Nem néhány napról beszélünk: csak 2015-ben (két évvel később!) jelent meg a teljes terjedelmű jelentés a 2012-es és 2013-as eredményekkel. Ezek adattartalma is megérne egy külön misét: ha semmi mást nem nézünk, a 2011-es jelentés még 53 oldal hosszú volt, az illegálisan visszatartott 2012-es – a két év késéssel történő megjelenés szerinti állapotában – 17 (!) oldal, de a 2013-as még ezt is alul tudta múlni a maga 13 oldalával… Ekkor úgy döntött az egészségügyi irányítás, hogy legalizálja az általa teremtett jogszabály-ellenes magatartást, és egy 2015-ös rendelettel egyszerűen lecserélte a határidőt június 1-ről szeptember 1-re. Azonban ez sem segített: a 2015-ről szóló jelentés megint nem jelent meg nem csak június 1-re, de szeptember 1-re sem. Indoklás ismét nem volt, végül októberben jött ki a jelentés. A jelek szerint látták, hogy ez így kevés lesz, ezért 2018-ban újabb módosítás jött, ekkor november 1-re módosították a határidőt.

A 2016-ot követő évekről jó összefoglalót ad a hivatalos honlap aktuális kinézete:

Az ábrán nem látszik (mert a honlapra még most sem tették ki a linket…), de a 2022-ről szóló jelentés határidőre megjelent. Az előző évek azonban izgalmasabbak: mint látszik, a 2021-ről szóló jelentés nemhogy a saját határidejére nem jelent meg, de kis híján a következő évi jelentés határidejére sem… A 2019-ről szóló jelentés még ezt is felül tudta múlni: a következő évi jelentés határideje utáni évben jelent meg. Az igazán szomorú azonban nem ez, hanem a konkrét dátum: ránézésre is elég furcsa lehet, hogy szinte egyezik a következő évi jelentés dátumával. Nos, a következő történt: a 2019-es és 2020-as jelentések kiadását megint elszabotálták (bocsánat, de erre nincs jobb szó: mindennemű indoklás nélkül egyszerűen nem tették közzé, a jogszabályi kötelezettség ellenére sem). 2021 novemberében, amikor már nem hogy a 2019-es, de már a 2020-as is meg kellett volna hogy jelenjen, és mindig nem tették közzé egyiket sem, egy szervezet adatigénylést nyújtott be ezekre vonatkozóan. Jellemző adalék a hivatalos szervek viselkedésére, hogy az erre adandó válasz 15 napos határidejét előbb 30 nappal meghosszabbították a leterheltségükre hivatkozással (egy darab PDF fájl elküldéséről beszélünk, ehhez volt szükségük még 30 napra, most arról nem beszélve, hogy pont ugyanannyi idő alatt lehetett volna elküldni a fájlt, mint amennyi idő alatt megírták, hogy hosszabbításra van szükségük az elküldéshez), aztán ennek lejárta után megint meghosszabbították ugyanerre hivatkozva, ezúttal 45 nappal, mindkét esetben a rendelkezésre álló határidő legutolsó napján, délután 4 óra körül értesítve a szervezetet a hosszabbításról (az ilyen beidőzítésnek valószínűleg önmagában nagyobb volt a munkaigénye, mint az egy darab fájl csatolásának és elküldésének lett volna), majd miután a második határidő is lejárt, és több határidő-kitolási lehetőségük nem volt, nemes egyszerűséggel többet nem válaszoltak nekik. Ezen a ponton a szervezet beperelte az NNK-t – és ezután került fel a két dokumentum, ezért szinte egyszerre.

Összefoglalva megállapítható, hogy 2004 és 2013 között rendben, és a jogszabályoknak megfelelően zajlott a jelentések közzététele, 2013 után azonban ismétlődően, nyílt jogszabály-szegések árán, rosszhiszeműen próbálták (és néha évekre sikerült is) eltitkolniuk a – köz érdekét szolgáló, és közpénzből összeállított – jelentéseket a közvélemény előtt.

Na de mi a helyzet a jelentések tartalmával? A válaszadást bonyolítja, hogy ez az évek során is alakult, de ha a legutóbbi, 2022-ről szóló jelentést vesszük alapul, akkor a következő dolgokat említeném meg (minden bizonnyal szubjektív válogatásként a részemről):

  • Elfogadva azt, hogy az adatok kórház szempontjából aggregáltak, ezen belül impresszív részletezettségűek (a 2022-es jelentésnek csak a kötelező modulról szóló része több mint 60 oldal hosszú), számos fontos, jól prezentált elemzéssel, releváns táblázatokkal, grafikonokkal, melyek kitűnően használhatóak szakmabeliek számára. Sok oldalról megvilágítják az adatokat, informatív, mély lebontásokkal.
  • Mindezek közvélemény számára történő érthetősége viszont enyhén szólva is kérdéses; minden további magyarázat helyett, kíváncsi volnék, hogy a következő mondatot hányan értik az átlagos újságolvasó állampolgárok közül: „A kórházankénti incidencia percentilisek az alábbi értékek között helyezkedtek el: P25 = 6,7; P50 = 14,4; P75 = 30,8. A kórházankénti incidencia-sűrűség percentilisek az alábbi értékek között helyezkedtek el: P25 = 9,5; P50 = 23,2; P75 = 50,9.”. (A jelentés sehol nem definiálja, hogy mit jelent az „incidencia”, mivel másabb az „incidencia-sűrűség”, mi az, hogy „percentilis”, meg „P25”.) Fel lehet persze úgy fogni, hogy ez egy szakmának szóló anyag, és akkor minden rendben van, csak akkor meg ez egy kihagyott lehetőség: ehhez képest már igazán kis munkával lehetett volna némi magyarázatot is hozzáfűzni, ami kevés energiabefektetésért cserében drámaian megjavította volna az anyag hozzáférhetőségét, értelmezhetőségét.
  • Az előbbi alpontjaként: miközben a részletezettség kitűnő, de ez azt csak még problémásabbá teszi, hogy nincs semmilyen összefoglaló az anyagban. Nincs egy rövid szöveges leírás, egy átfogó táblázat, mindent a megfelelő helyekről kell kinézni (amit megtalálni sem feltétlenül könnyű). Ha csak az egyik legkézenfekvőbb kérdést veszem, hogy „hányan haltak meg 2022-ben Magyarországon kórházi fertőzésben?”, arra is csak úgy lehet válaszolni, ha négy különböző helyet talál meg az ember (amikhez semmilyen mutató nincsen), és veszi ki onnan az adatokat, majd kézzel összeadja.
  • Az írás még csak érintőlegesen sem foglalkozik a limitációkkal. Egyetlen szó nincs a jelentési fegyelemről, egy hangot nem mond a tesztelési aktivitás kérdéseiről.

A jelentés kapcsán visszatérő kérdéskör, hogy nem közöl kórházankénti adatokat. Az erről szóló véleményemet már fent, az összefoglalóban is kifejtettem. Itt most csak annyit említenék meg, hogy miközben az az egyik legtipikusabb – és teljesen jogos – ellenérv e témában, hogy ezek a számok félrevezetőek a betegösszetételre való korrekció nélkül, valójában a jelentés is közöl, ha nem is kórházra, de régióra lebontott adatokat, amelyek pontosak ugyanúgy félrevezetőek korrekció nélkül (hiszen a betegösszetétel ugyanúgy eltérhet régiónként is!) – mégis, a jelentés mindennemű korrekció nélkül közzéteszi ezeket.

A kutatás eredményeinek magyarázata

Bevezetés

A különböző kórházak összehasonlítása a kórházi fertőzések előfordulásának gyakorisága szempontjából nem egyszerű feladat, ahol a „nem egyszerűség” egyik jelentős komponense épp az, hogy közben nagyon egyszerűnek tűnhet.

Rendelkezésre áll egy adatbázisunk (nevezzük NNK táblának), melyben minden sor egy bejelentett kórházi fertőzés, számos adatával, többek között a fertőzés kórházával, osztályával, időpontjával. Ebből egyszerű összeszámolással megkapjuk az egyes kórházakban előforduló fertőzések számát, ezután megnézzük, hogy ez melyik kórházban több, melyikben kevesebb, és végeztünk is a rangsorolással, nem? Jó, számít az, hogy az adott kórházban mennyi beteget láttak el, mert nem mindegy, hogy 10-ből lett 2 kórházi fertőzés vagy 10 ezerből, de akkor leosztjuk a fertőzések számát a betegek számával, és akkor már tényleg meg is vagyunk. (Valójában már ez sem ilyen egyszerű, ugyanis sok szempontból jogosabb nem a betegek számára, hanem az ápolási napok számára ráosztani a fertőzések számát. Tény, hogy van olyan kockázat, ami egy adott beteg esetében csak egyszer lép fel egy kórházi ellátási epizód során, de sokkal jellemzőbb, hogy az idő múlásával halmozódik a kockázat, többször kell kanült cserélni, hosszabb időt tölt bent a hólyagkatéter, ahol minden nap kockázat stb.) Maximum az a probléma, hogy ezek az adatok – betegforgalom, ápolási napok száma – nem érhetőek el az NNK adatbázisából, de szerencsére a NEAK-nál nyilvánosan közzétéve megvannak, így a rávetítés, akár betegszámra, akár ápolási napra történik, megoldható.

Sajnos azonban a helyzet nem ilyen egyszerű. Két, első ránézésre talán nem ordító, de sajnos nagyon is alapvető problémával kell megküzdeni.

Az eltérő betegösszetétel problémája

Az első gond az eltérő betegösszetétel ügye: az egyes kórházak nem ugyanolyan betegeket látnak el, van, ahol kórházi fertőzésre sokkal fogékonyabb, van, ahol kevésbé kockázatos betegek fordulnak meg. A kórházi fertőzések gyakorisága ugyanis első közelítésben tényezők két csoportjától függ: kórházra jellemző tényezőktől (egy ápolóra jutó betegek száma, korszerű infekciókontroll rendszerek alkalmazása, a fertőtlenítési protokollok betartása stb.) és a betegre jellemző tényezőktől (életkor, társbetegségek, mentális állapot stb.), ideértve azt is, hogy egyáltalán mit kell a beteggel csinálni, hiszen vannak inherensen nagyobb és kisebb kockázatú beavatkozások (az invazív beavatkozások például jellemzően nagyobb kockázatúak).

Ez eddig valószínűleg nem egy meglepő állítás, de arra talán kevesen gondolnának, hogy a dolognak milyen drámai hatása is lehet. Tekintsünk egy illusztratív példát. Két kórházat nézünk ugyanabban az évben; az egyszerűség kedvéért mondjuk, hogy a betegek kockázatossága csak két kategória egyikébe – kis és nagy – tartozhat (noha a valóságban ez nyilván folytonos). Az alábbi táblázat mutatja, hogy hány beteget láttak az egyes kórházakban a két kategóriából adott, állandó idő alatt, közülük hány kapott kórházi fertőzést, és ez alapján megadja a kórházi fertőzések betegszámra vetített gyakoriságát százalékként:

X kórház Y kórház
Kis kockázatú betegek 2% (100/5000) 3% (85/2800)
Nagy kockázatú betegek 10% (500/5000) 17% (34/200)
Összességében 6% (600/10000) 4% (119/3000)

Mit látunk? Azt, hogy X kórházban ritkább a kórházi fertőzés a kis kockázatú betegeknél (2% a 3%-kal szemben), ritkább a nagy kockázatú betegeknél (10% a 17%-kal szemben), de összességében mégis rosszabb a helyzet! (6% a 4%-kal szemben.) Sokan azt is mondhatnák, hogy ez lehetetlen, itt valami paradoxon, vagy matematikai hiba van („hogy lehet, hogy külön-külön mindkét kategóriában jobb, de összességében rosszabb?!”), de nem: ha valaki nem hiszi, adja össze a számokat, és ossza el egymással!

Mi a magyarázat? A nagyon eltérő betegösszetétel! X-ben az ellátott betegek fele nagy kockázatú volt, míg Y-ban mutatóban volt ilyen. Hiába jobb X mindkét kategóriában külön-külön, az, hogy ő gyűjti a zűrösebb eseteket, lehúzza az összesített eredményét – hiába teljesít amúgy még ott is jobban, mint Y, de ezek a betegek (állapotukból és nem a kórházból fakadóan!) rosszabb mutatókat produkálnak, így ha több van belőlük, az nagyban rontja a teljesítményt, még akkor is, ha egyébként az ő körükben is jobban teljesít a kórház. Végeredményben az a kórház teljesít jobban, ahol gyakoribbak a kórházi fertőzések!

Ez egy konkrét példa arra az általános jelenségre, amit a biostatisztikában – magyarul is elterjedten használt angol szóval – „confounding”-nak szoktak nevezni.

Végeredményben arra jutunk, hogy kórházak eredményeit nem lehet közvetlenül összehasonlítani, hiszen eltérő lehet a betegösszetétel, márpedig ezt nem róhatjuk fel a kórháznak. Visszautalva az első bekezdésre: az a gond, hogy a nyers szám egybeméri a kórházra és a betegre jellemző tényezőket, mi csak a kettő összegét látjuk, miközben mi valójában csak az előbbire vagyunk most kíváncsiak. Ha egyszer kórházak vizsgálatáról beszélünk, akkor valahogy meg kellene tisztítani az eredményeket egy utóbbitól, hogy tényleg a kórházat magát jellemző eredményt kapjuk.

Mit tudunk tenni? Jelen esetben az egyetlen lehetőség, hogy utólag olyan statisztikai módszereket alkalmazunk, amelyekkel ezekből az – első ránézésre félrevezető – adatokból is kiolvasható a valós kép. Nem kell hatalmas varázslásra gondolni feltétlenül: voltaképp már az előbbi táblázat is egy példa egy ilyen korrekcióra! Hiszen azzal, hogy különvettük a két kategóriát, máris feltártuk, statisztikai úton, a valós helyzetet. Problémát két dolog jelent: az egyik, hogy ehhez tudnunk kell, hogy mely tényezők hatnak egy beteg fertőzés iránti fogékonyságára, a másik, hogy erről információval kell rendelkeznünk. Hiszen, ha nem jut eszünkbe, hogy a cukorbetegség számít, akkor biztosan nem fogunk tudni korrigálni rá, de ha eszünkbe is jut, akkor is kell, hogy erről legyen információnk, tehát, tudjuk, hogy a betegek közül ki cukorbeteg és ki nem. (Visszatérve az előbbi példára: csak ez alapján tudjuk a fenti táblázatot megkonstruálni.) Az NNK adatbázisában ugyan van információ arról, hogy a fertőzöttek cukorbetegek voltak-e, de sajnos ez rajtunk nem segít: a fenti korrekcióhoz az összes felvett betegre vonatkozóan kellene tudnunk a cukorbetegség tényét! Hiszen itt a betegösszetételről van szó, arról, hogy milyen kockázatú betegeket lát el a kórház, ehhez azt kell tudnunk, hogy az összes betegük mekkora része cukorbeteg. Az, hogy fertőzöttek mekkora része cukorbeteg, ebben nem segít: lehet, hogy az összes az, de mégis kicsi a cukorbetegek aránya, vagy pont fordítva. (A táblázatra gondolva: nem tudjuk a perjel mögötti értékeket a kis és nagy kockázatú sorokban – és így persze százalékot sem tudunk számolni.)

Ezek az adatok a hivatalos szervek számára elérhetőek lehetnek, de sajnos nyilvános adatforrás nincsen rájuk, így mi most nem tudunk ilyen módon közelíteni a problémához. Zárójeles megjegyzés: elképzelhető, hogy az állami szervek is azt mondják, hogy ezt ők sem tudják, hiszen ilyen információt nem kell rutinszerűen jelenteni a kórházaknak (és aránytalan nehézséget jelentene a begyűjtése). Ez igaz, de van egy potenciális megoldás: az adminisztratív/finanszírozási adatok használata. Ilyeneket ugyanis minden kórház jelenleg is jelent; igen, az tény, hogy nem tartalmaz olyan fontos információkat, mint kapásból a társbetegségek, de vannak sikeres példák, mint a HUNVASCDATA-projekt, az ilyenek kikódolására és felhasználására. Azok számára, akik hozzáférnek ezen adatokhoz, ez szerintem egy megfontolandó lehetőség.

Azt mindenesetre megállapíthatjuk, hogy mi nem tudjuk a legjobb korrekciót megtenni, szükséges – nyilvánosan elérhető – adatok híján. Mi a második legjobb lehetőség?

Az egyik ötlet, hogy ne kórház, hanem szakma (belgyógyászat, szemészet stb.) szintjén vizsgálódjunk! Ez ugyanis jelentősen homogenizálja a betegeket: sokkal hasonlóbb betegcsoportot hasonlítunk össze, ha nem egész kórházat hasonlítunk egész kórházzal, hanem belgyógyászatot belgyógyászattal, szemészetet szemészettel stb. Természetesen ez a módszer sem tökéletes, hiszen belgyógyászat és belgyógyászat között is nagy különbség lehet az ellátott betegek összetétele szempontjából, de mindenesetre biztosan kisebb, mint egész kórházak között.

Szerencsénkre a dolog meg is valósítható: az NNK táblájában meg van adva az osztály, a NEAK tábla pedig közli a betegforgalmi adatokat szakma szerinti lebontásban is. (Pár apróbb zűrt azért meg kell oldani: az NNK táblájában a szakmák szöveges leírással szerepelnek, amik nem feltétlenül egyeznek tökéletesen a NEAK táblájával, ezért kézzel kell köztük megfeleltetést létesíteni; párat el is fogunk veszíteni, mert nem lehet tökéletesen megfeleltetni a kettőt egymásnak. A NEAK táblából csak az aktív ellátás adatai kerültek felhasználásra, így az NNK tábláját is ezekre az osztályokra kell szűkíteni; ez nem nagy veszteség. Lesznek adatösszekapcsolási gondok is, előfordul például, hogy egy kórház olyan osztályáról jelent kórházi fertőzést, amilyen osztálya a NEAK szerint az adott évben nem is volt a kórháznak… Ennek hátterében valószínűleg valamilyen banális adminisztratív hiba, elírás állhat, ez kideríthetetlen, de nincs is nagy jelentősége, mert nagyon kevés esemény veszik el ilyenek miatt. Szintén zűrök lehetnek a kórházak megfeleltetésével is, előfordul például, hogy egy kórház év közben integrálódik egy másikba – az ilyeneket nem tudjuk felhasználni, mert a törtévre nem lesz betegforgalmi adatunk, de ezek szintén minimális veszteséget okoznak csak.)

Ezek után tehát összehasonlíthatjuk az adatokat osztály-szinten is, sokkal jobb homogenitást elérve, és csökkentve az eltérő betegösszetételből fakadó nehézségeket. Egyetlen probléma van ezzel: nem egy eredményt kapunk, hanem sokat. Nem lehet olyat mondani, hogy X kórház itt áll Y-hoz képest, hanem csak azt tudjuk mondani, hogy „itt áll belgyógyászatban, itt szemészetben, itt szülészetben, itt urológián, itt fül-orr-gégészetben, itt neurológián, itt onkológián”… nem túl kényelmes! Tudunk ezen valahogy javítani? Tovább feltevések nélkül nem, hiszen előfordulhat, hogy tényleg más a sorrend belgyógyászatok között, szemészetek között, szülészetek között stb. Ha azonban elfogadjuk azt a feltevést, hogy a kórházak sorrendje azonos az egyes szakmákban, tehát, hogy egy jobban teljesítő kórház egységesen jobban teljesít minden szakmában, mert ez egy kórház-szintű jellemző, akkor kaphatunk sokkal látványosabb eredményt is.

Ezzel eljutunk a biostatisztika egyik kiemelten fontos módszeréhez, a regressziós modellezéshez. Az alapgondolat a következő (lényeges leegyszerűsítésekkel elmesélve): feltételezünk egy modellt, ami jelen esetben az lesz, hogy adott kórház adott osztályán előforduló fertőzések száma két tényező összege: az egyik abból fakad, hogy melyik kórházban vagyunk, a másik abból, hogy milyen szakmában. Mintha egy ilyen pontozást csinálnánk: ha intenzíven osztályon vagyunk, az 5 pont (mert az egy fertőzésre nagyon kockázatos szakma, sok az invazív beavatkozás, a betegek jellemzően súlyos, kritikus állapotúak), az urológia 2 pont, a szemészet 1 pont és így tovább. A modell figyelembe veszi az ellátott betegek, vagy az ápolási napok számát is, most csak az egyszerűség kedvéért nem szerepel ez a leírásban.

Ami még izgalmasabb, hogy természetesen ugyanez igaz lesz a kórházra is: ha X kórházban vagyunk, az 3 pont, ha Y-ban, az 1, ha Z-ben az 5 és így tovább, és így tovább. Tehát, ha X kórházban vagyunk, akkor önmagában, pusztán abból fakadóan, hogy az adott kórházban vagyunk (bármelyik osztályon is!) több kórházi fertőzésünk lesz várhatóan, mint Y-ban. Fontos meglátni, hogy ez a modell tényleg felhasználja az előző bekezdés végén szereplő feltevést, hiszen épp azt mondtuk az imént, hogy minden szakmában 3-at jelent az, ha X-ben vagyunk (nem lehet, hogy belgyógyászatban 4-et, de szemészetben csak 2-t). Tehát a kórházak sorrendje, feltevésünk szerint, ugyanaz minden szakma esetében. Fontos ismét hangsúlyozni, hogy ez egy feltevés, ami nem biztos, hogy igaz, de ha – akárcsak közelítőleg – teljesül, akkor lényegesen kényelmesebbé teszi a munkát.

Ez a modell megvalósítja a fenti célunkat: ha kiolvassuk a kórházakhoz írt pontokat, akkor az épp a sorrendjüket fogja jelenteni! X-nél jobb az Y, de rosszabb a Z stb. De ez a kijelentés – és most jön a lényeg! – immár úgy értendő, hogy az eltérő osztály-összetétel hatását kiszűrve, hiszen ezek a számok magukra a kórházakra jellemző értékek, függetlenítve attól, hogy adott kórházban van-e intenzív, van-e szemészet, kis forgalmú intenzív van, vagy nagy forgalmú stb. Márpedig pont ez volt a célunk, hogy kiszűrjük az eltérő osztály-összetétel hatását, tehát, hogy adott kórházban milyen osztály van vagy nincs. (Igazából ugye az volt a célunk, hogy kiszűrjük az eltérő betegösszetétel hatását, de mostani közelítésünkben ezt az osztály-összetétellel ragadjuk meg.) Ezzel a módszerrel most már nem kerülnek hátrányosabb helyzetbe azok a kórházak például ahol van intenzív, hiszen ez az érték csak a kórház hatása, az osztályok hatását leválasztottuk.

Egyetlen kérdés van még nyitva: hogyan kapjuk meg a pontokat? Honnan tudjuk, hogy az intenzív 5 pont (nem 4 vagy 6), hogy X kórház 3 pont (nem 2 vagy 4)…? A válasz az, hogy felhasználjuk a tényadatokat! Hiszen ne feledjük, mi tudjuk, hogy a valóságban adott kórház adott osztályán hány fertőzés fordult elő. Egyfelől tehát megvannak ezek a számok, másfelől minden pontszám-kiosztásra megvan az, hogy a modell mit becsülne a kérdéses kórház kérdéses osztályára az adott pontozás mellett. (Összeadjuk a kórház pontszámát és az osztály pontszámát.) Egyszerűen megkeressük azt a pontozást, ami mellett a modell szerint becsült fertőzés-számok a legközelebb vannak a ténylegesekhez! Az a nagyon szép, és ez a regressziószámítás egyik központi eredménye, hogy mindig megtalálható, és egyébként nem is túl bonyolultan az a pontszám-kiosztás, amely mellett a modell által becsült fertőzés-számok matematikailag garantáltan a lehető legközelebb vannak a táblában szereplő, tehát tényleges számokhoz. Ezt fogjuk elfogadni legjobb becslésnek a pontszámokra vonatkozóan! És ebből már kiolvashatjuk az előző bekezdés megállapításait.

Ezzel tulajdonképpen végeztünk is, legalábbis ha megelégszünk az osztály-szintre leásó korrekcióval. A modell eredményeként megvan a kórházakra vonatkozó sorrend, hiszen ez maga a pontszám-kiosztás lesz. Érdemes azonban egy második lépést is tenni, nem azért, mert tartalmilag változtat, hanem mert jobban értelmező, közérthetőbb, látványosabb eredményt szolgáltat – a pontszámok közlése ugyanis nem feltétlenül ilyen. Ha azonban megvan ez a modellünk, akkor megkérhetjük arra is, hogy becsülje meg, hogy mi várható, egy adott kórház, adott osztályán hány eset lesz. Csak fogni kell a pontokat, és összeadni. És ez miért lesz nekünk jó? Azért, mert megtehetjük ilyen módon a modellel, hogy megbecsültetjük, hogy ha minden kórházban pontosan ugyanazok az osztályok lennének, és mindegyikben pontosan ugyanannyi lenne a betegforgalom, akkor mennyi lenne a kórházi fertőzések száma. Ennek eredményeként egy konkrét, előfordulási gyakoriságként mért, tehát könnyen értelmezhető számot kapunk, ami ugyanolyan gyakoriság lesz, mint a naiv számítás eredménye – csak épp ebben már szűrve lesz a fenti torzítás! Hiszen mi volt a probléma? Az, hogy az egyes kórházakban más az osztályok szerinti összetétel. Viszont a fenti módon kapott fertőzés-előfordulás egy olyan virtuális helyzetre vonatkozik, hogy akkor mi lenne, ha ebben nem lenne különbség, tehát ezt a számot már nem rontja el ez a probléma! Lényegében az történt, hogy első fázisban kiszedtük az információkat a tényadatokból, majd második fázisban ezen információk alapján gyártottunk egy olyan számot, ami kényelmesen értelmezhető, de immár jól össze is hasonlítható – a valóságban ezt nem látjuk, de a modellünk meg tudja nekünk, matematikai módszerekkel, mondani!

Végezetül egyetlen utolsó lépést tehetünk még, hogy javítsuk a helyzet. Mert mi a még mindig fennálló fő probléma? Hogy az osztályok sem tökéletesen homogének, intenzív és intenzív vagy épp szemészet és szemészet között is lehet különbség az ország egyes kórházai között. Itt jön kapóra egy ötlet, amit bevethetünk.

Ennek megértéséhez egy nagyon rövid – és még annál is jobban leegyszerűsített – kitérőt tennünk kell a magyar fekvőbeteg-szakellátás finanszírozásának rejtelmeibe. Ez egy igen komplex világ, sok száz jogszabállyal (és annál is több informális ismerettel), amiből nekünk egy momentum fontos: a finanszírozás egyik eleme, egyébként alapeleme, úgy határozódik meg, hogy a kórházak jelentik, hogy milyen betegeket láttak el. Természetesen az összes létező betegség összes létező súlyosságának összes létező ellátása kezelhetetlenül sok lenne, így ezek átfogóbb kategóriákba, úgynevezett homogén betegségcsoportokba (röviden HBCs) vannak sorolva; ebből mindössze szűk 800 van. Például az egyik ilyen HBCs a „szövődményes gyomor-bél fekély”; jogszabályban pontosan meg van adva, hogy ez milyen diagnózissal felvett betegekre számolható el (például „gyomorfekély heveny átfúródással” meg még vagy tucatnyi hasonló diagnózis – ezek vannak egy csoportba összevonva). A HBCs-ket úgy alakították ki, hogy orvosilag és gazdaságilag is homogének legyenek, tehát az egy HBCs-be tartozó betegek orvosilag is hasonlóak, és nagyjából ugyanolyan költségességű az ellátásuk. Itt jön be ugyanis a finanszírozás: minden ilyen HBCs-hez tartozik egy úgynevezett súlyszám, ami az ellátás költségességét írja le, az előbbi példában ez 0,96. A konkrét számértéknek semmi jelentősége, ez egy relatív mutató: ha valaminek az értéke 4, akkor az kétszer költségesebb, mint aminek 2. A legnagyobb súlyszámú HBCs jelenleg a 999 gramm születési tömeg alatti újszülött ellátása (32,4), a legalacsonyabb a I-es kategóriába sorolt kissebészeti beavatkozás (0,03). Ezek a súlyszámok úgy képződnek, hogy összeszedik, hogy egy ilyen csoportba tartozó „átlagos” beteg ellátása milyen költségekkel jár: mennyit kell gyógyszerre költeni, röntgenre, altatásra, mennyire veszi igénybe a sterilizálót, a varrodát, mennyi a ápolók bére és így tovább, és így tovább. (Például a szövődményes gyomor-bél fekély nem tartalmaz CT-t vagy MRI-t, de kétszer annyi gyógyszerköltséget tartalmaz, mint a nem szövődményes változata.) Igen, ez az „átlagos” beteg, de a homogenitás pont azt jelenti, hogy ebben elvileg kicsi a szórás, ezért nem okozunk nagy bajt, ha az átlagot használjuk. Ezek alapján minden kórház összegyűjt valamennyi súlyszámot az év során, ha összeadja az összes általa ellátott beteg súlyszámait. Az utolsó lépés pedig, hogy meghirdetik, hogy egy súlyszám hány forintot ér, így a kettőt összeszorozva megkapja a finanszírozásának ezen komponensét. Természetesen, ahogy volt róla szó, ez a leírás milliónyi, gyakorlatban fontos finomságot nem érint, de a mi mostani céljainkra elég ennyit tudni.

Na de mi köze ennek az egésznek a kórházi fertőzések vizsgálatához? Az, hogy a NEAK évente közli minden kórház minden osztályára vonatkozóan, hogy mennyi volt az ott ellátott betegek átlagos súlyszáma. Ezt case-mix index-nek hívják (röviden: CMI), ami ezt az értéket az országos átlaghoz viszonyítva adja meg. Látható tehát, hogy ez lényegében a betegek „financiális súlyosságát” jelzi: minél nagyobb a CMI, átlagosan annál nagyobb súlyszámú, tehát költségigényesebb ellátásai voltak az adott osztálynak. És itt jön az ötlet: mi volna, ha ezt megfeleltetnék a „medikális súlyosságnak”? Igen, a kettő természetesen nem ugyanaz, de azért vélhetően van együttmozgás köztük. Bár ez utóbbit kellene használnunk, de arról nincs adat, viszont az előbbiről van. Ha pedig azt a feltevést is hozzátesszük, hogy az orvosi súlyosság együttmozog a kórházi fertőzésekre való fogékonysággal (amire szintén igaz, hogy ha nem is tökéletes az együttjárás, de van kapcsolat), akkor egy újabb nagy épést tettünk: tudjuk jellemezni ugyanazon osztályok eltérő betegösszetételeit is a különböző kórházak között! Egyszerűen vesszük a CMI-t, és ezzel írjuk le az osztály betegösszetételét. Tökéletes ez a megoldás? Egész biztosan nem. Két áttételezési lépés is megjelenik (a finanszírozás összefügg az orvosi súlyossággal, az orvosi súlyosság összefügg a fertőzésre való fogékonysággal); konkrét példaként gondoljunk arra, hogy egy egyébként teljesen egészséges 30 éves vakbél-műtétje pontosan ugyanabba a finanszírozási kategóriába fog esni, mint egy cukorbeteg, rákos 80 éves vakbél-műtétje, miközben a fertőzési kockázatuk nagyon eltér. Azt azonban nem is állítom, hogy a dolog tökéletes – azt viszont igen, hogy a semminél bizonyosan több, így ha nem is oldjuk meg teljeskörűen a problémát, de mindenesetre javítunk a helyzeten.

Természetesen a CMI eloszlása elég jellegzetes szakmák között, az intenzíveknek nagyobb mint a szemészeteknek. De – nagyon fontos – nekünk nem ez számít, hiszen ezzel eddig is el tudtunk számolni, mivel leástuk osztályszintre, hanem az, hogy intenzív, szemészet stb. szakmákon belül is van szóródás – amivel eddig nem tudtunk mit kezdeni, de most már meg tudjuk ragadni! Ezt teszi lehetővé a CMI felhasználása, ezzel remélhetőleg még jobban közelítve az elemzést a valósághoz.

Nyitva maradt még az év kérdése. Első ránézésre úgy tűnhet, hogy ez is egyszerűen belehelyezhető a modellbe ugyanúgy, mint kórház és osztály – minden év kap egy pontszámot, és akkor az év hatását, magyarul a hosszú távú trendet is le tudtuk mérni, ami ráadásul önmagában is érdekes! A dolog majdnem működik, egy apró bökkenő van: a súlyszámok nem állandóak. Ezt a NEAK időről-időre újrakalibrálja (ennek lehet oka, hogy a költségviszonyok megváltoznak, de sejtésem szerint inkább arról van szó, hogy a magától vélhetően felfelé kúszó CMI-t próbálják visszaráncigálni). A probléma magja ugyanis, hogy az országos átlagnak 1,000-nak kell lennie, innentől kezdve viszont – sajnos – elvileg lehetetlen, hogy ki tudja fejezni a hosszabb távú trendeket: hiába végeznek – példának okáért – egyre bonyolultabb beavatkozásokat, ha közben a súlyszám lefelé módosítása pont ez eltünteti. Ezzel a jelenséggel sajnos nem tudunk mit kezdeni (az egyetlen megoldási lehetőség az lenne, ha állandó súlyokkal számolnánk újra a kórházak adatait, viszont ehhez ismernünk kellene az egyes HBCs-kben jelentett esetszámokat külön-külön is). Ezért, jobb híján, a számításokat minden évre külön-külön, egymástól függetlenül futtattam le. Ennek azonban van egy nagyon fontos következménye: az éven belüli eredmények összehasonlíthatóak (a fenti limitációk erejéig), de a különböző évek számai nem lesznek egymással összevethetőek!

Egyetlen megjegyzés a legvégére. Valójában a fenti modellek megalkotásakor van mozgástér. Hogyan építsük be a modellbe a CMI-t, a konkrét számértékét használjuk, vagy az eltérést az adott szakma átlagától? Feltételezzük, hogy a CMI hatása lineáris (eggyel nagyobb CMI mindig ugyanúgy hat a fertőzési kockázatra), vagy elképzelhető, hogy bonyolultabb az összefüggés alakja? Pontosan milyen statisztikai modellt használjuk, Poisson-t vagy negatív binomálisat (bármit is jelentsenek ezek a szavak)…? Igen, lehet véleményezni, hogy ebből mi a legjobb (nekem van is véleményem, és ezeket fogom közölni végeredményként), de ha a legapróbb bizonytalanság is van ezekben a választásokban, akkor fontos lehet még egy dolog: az érzékenységvizsgálat. Ennek lényege, hogy a számításokat az összes lehetséges módon és kombinációban elvégezzük, aminek lehet értelme; jelen esetben ez 21 modellt jelentett. Hogy ez miért fontos? Két okból. Az egyik, hogy ha bárki nem értene egyet velem abban, hogy melyik a legjobb, akkor megteheti, hogy kinézi a szerinte legjobbhoz tartozó eredményeket, függetlenül attól, hogy én mit gondolok. Ez ráadásul bizalmi okokból is fontos: így nem érheti szó a ház elejét, hogy valamit el akarnék titkolni, és valami sötét hátsó szándékból választottam azt a modellt legjobbnak, amit. A másik szempont, hogy az érzékenységvizsgálatból kiderül, hogy az eredményekben mekkora szóródás van a használt módszertantól függően (mennyire érzékeny az eredmény a módszertanra – innen az elnevezés), ha pedig ráadásul van akkora szerencsénk, hogy ez kicsi, tehát a különböző elemzési módszerekkel kapott eredmények nagyjából hasonlóak, akkor az megnyugtató, hiszen azt mondja, hogy az eredmény nem múlik nagyban azon, hogy pontosan melyik eszközt használja az elemző. Úgy is szokták mondani: az eredmény robusztus a használt módszertanra nézve. Igen, van döntés arról, hogy melyik a legjobb eszköz, de azért nyugodtabban alszik az ember, ha tudja, hogy nagyon nagyban nem változna a sorrend akkor sem, ha más eszközt választott volna. De ha nagyobb szóródás van, akkor is hasznos az érzékenységvizsgálat, mert mutatja az eredmények tartományát (magyarán, hogy mennyire múlik az eredmény a használt elemzési módszeren).

A jelentési fegyelem problémája

A másik problémakörről sokkal-sokkal kevesebbet lehet írni, de ez nem jelenti azt, hogy ne lenne fontos, ellenkezőleg.

Ez a kérdés a jelentési fegyelem problémája: a gond az, hogy az NNK táblájában valójában persze nem a megtörtént fertőzések szerepelnek, hanem a bejelentett fertőzések. A kettő – sajnos – nem teljesen ugyanaz: egyrészt a megtörtént fertőzést észlelni kell, másrészt az észlelt fertőzést be kell jelenteni. Mindkét lépésnél elfordulhat, hogy esetek kiesnek, különféle jó- vagy kevésbé jóhiszemű okokból. (Ez természetesen nem valamiféle magyar sajátosság, a világon mindenhol így van, maximum a mértéke a kérdés.)

Hogy erről miért lehet sokkal kevesebbet írni? Ez talán a legfontosabb jellemzője ennek a kérdésnek: hogy semmiféle számszerű információ nem érhető el róla, még csak áttételesen sem, így – az előző problémakörrel szemben – semmiféle utólagos, statisztikai korrekció nem lehetséges. Az egyetlen amit meg tudunk tenni, de ez viszont nagyon fontos, hogy rögzítjük: minden közölt eredményt ennek fényében kell értelmezni, mert ez minden eredményben megjelenik.

A dolog azért is kritikus, és ezt nem lehet elégszer hangsúlyozni, mert ez nem csak valamiféle „véletlen eltéréseket” okozhat az eredményben, hanem rossz esetben egy egészen perverz helyzetet is létrehozhat: hogy az a kórház tűnik fel rossz fényben, aminek valójában az a „hibája”, hogy odafigyel a fertőzésekre és lelkiismeretesen jelenti őket, míg az fog remek eredményeket produkálóként megjelenni, aki valójában trehány, vagy rosszabb esetben lelkiismeretlen. Nem szabad, hogy egy ilyen rangsor pont ez utóbbi viselkedést jutalmazza meg, és az előbbit büntesse; ezért is nagyon fontos arra törekedni, hogy a jelentési fegyelem minél jobb legyen az országban, és ha nem is tökéletes, ne legyenek benne szisztematikus eltérések.

(Természetesen ha a hatóság álláspontja az, hogy az adatgyűjtés remek az országban, akkor erre nem hivatkozhat – de tudományos kutatóként mindig gondolni kell arra, hogy tényleg tökéletes-e helyzet.)

Záró gondolatok

Összességében remélem, hogy az elkészült elemzés két, fontos dologra is példát mutat, sőt, jó esetben akár megtermékenyítőleg is hathat a jövőben.

Az egyik a transzparencia szerepe. Többféle okot is fel szoktak hozni, amikor amellett érvelnek, hogy miért fontos a transzparencia a népegészségügyben, ezek közül háromra is kitűnő illusztrációt szolgáltat a jelen projekt:

  • Az egyik a „több szem többet lát” helyzet: az, hogy az adatokhoz nem csak egy szűk kör fér hozzá, lehetővé tesz új, adott esetben jobb módszertanú, alaposabb vagy épp innovatívabb elemzéseket. Fontos a „több szem többet lát” mondat: nem arról van szó, hogy a hivatalos szervek szükségképp rossz vagy korlátozott elemzést készítenek, de egyszerűen a több elemző nagyobb lehetőség a jobb elemzési módszerek megtalálására. (Ez a hivatalos szerveknek is segítség!) Ahogy korábban is mondtam, ez a szempont erre az elemzésre magára is igaz: nem hogy nem baj, hanem kimondottan örülök, ha valaki jobb, célszerűbb módszert javasol a probléma vizsgálatára az én elemzésem végiggondolása alapján!
  • A második szempont a minőségbiztosítás. Ez igaz az elemzésre is – mert abban is transzparensnek kell lenni, az elemzést végző program közzététele segíti, hogy kiderüljenek a benne elkövetett esetleges hibák. (Ez is igaz jelen elemzésre is: én magam is teljes egészében, bárki számára elérhetően közölni fogom az elemzéshez használt kódomat ebben az írásban.) De igaz ez a végeredmény közzétételére is: a kórházak közti rangsor közzététele segíti a hibák feltárását, a javítási lehetőségek kihasználását azáltal, hogy objektív információt szolgáltat; ezen felül az eredmények közlése és visszacsatolása motivál is a jobb teljesítményre. Abban van igazság, hogy az ilyen rangsorok bajt is okozhatnak, ha a közvélemény nem helyesen értelmezné a számokat, de erre nem az a válasz, hogy akkor nem készítünk ilyet, hanem az, hogy jól készítünk ilyet, például megfelelő magyarázatokkal ellátott, kontextusba helyezett, megfelelően korrigált (lásd például a fentieket!) eredményeket közlünk. Ha rövid távon jobbnak is tűnik az információk visszatartása, meggyőződésem, hogy hosszú távon csak a lakosságot bevonó, partnerként kezelő, nyílt és őszinte kommunikáció vezet sikerre a népegészségügyben.
  • És itt érünk el a harmadik ponthoz: a transzparencia a talán legerősebb eszközünk a bizalom megteremtéséhez és fenntartásához a népegészségügyben. Nem igaz, hogy a bizalmat rombolja az, ha rosszak az eredmények (sőt, bizonyos értelemben ez erősíti meg a legjobban, mert azt mutatja a lakosságnak, hogy még ezeket sem kell eltitkolni, tehát lehet hinni az adatoknak), ami rombolja a bizalmat, az az elhallgatás és a titkolózás, az – adatok híján kialakuló! – szájhagyományok és rémhírek, az „ehhez te úgysem értesz, ne üsd bele az orrod az okos szakemberek dolgába”-szemlélet.

A másik szempont: az adatokra alapozott elemzés. Ez a vizsgálat példa arra is, hogy melyik az az irány, ami általában is nagy potenciált rejt véleményem szerint: igyekezni kell a helyzetértékeléseket, elemzéseket minél inkább a „megérzések” és „benyomások” talajáról áthelyezni adatokkal alátámasztható, tényeken alapuló, objektív megállapításokra. (Ez maguknak a kórházaknak is ugyanúgy fontos, hiszen e nélkül ők sem tudhatják, hogy milyen jól dolgoznak, hol lehetne javítani, hogyan viszonyulnak a többi kórházhoz!) Az ilyen típusú, adatokon alapuló elemzések nagyon jól segítik a hibák feltárását is. Itt fontos rögtön hozzátenni, hogy a „hiba” szót a legáltalánosabban értelemben használom, és egyáltalán nem csak olyanokra gondolok, hogy egy kórházban van valami probléma mondjuk a fertőtlenítéssel: az is hiba, ha gyanúsan nagy különbségek vannak a kórházak között, és ezért felmerül, hogy nem korrigáltunk jól a betegösszetételre, vagy, ha itt sem találunk gondot, akkor talán a jelentési fegyelem kapcsán kell vizsgálódnunk? Akárhogy is, az adatok megmutatják, hogy valamit javítanunk kell, és, ami nem kevésbé fontos, abban is adhatnak iránymutatást, hogy mit.

Természetesen figyelembe kell venni a preventálhatóság kérdését: nem szabad azt a látszatot kelteni, hogy tökéletes elemzéssel meg lehetne szüntetni a kórházi fertőzéseket, de az is biztos, hogy lehet velük javítani; e javítások határának feltárása szintén izgalmas kérdés önmagában is.

Fontos e ponton közbeszúrni, hogy az egész kérdéskör véleményem szerint elsősorban nem az „ujjal mutogatásról”, a személyi felelősök kereséséről kell, hogy szóljon, nem arról, hogy „te elrontottad, mert nem mostál kezet, pedig kellett volna!”. Még ha igaz is, ez a megközelítés sokszor pont a lényeget téveszti szem elől: biztos, hogy a hibák csak és kizárólag ilyen egyéni szinten értelmezhetőek és értelmezendőek? Hogy ennek feltárásával a végére jártunk a problémának? Nem lehet, hogy a hibázás egész véletlenül összefüggésben van azzal, hogy hány beteg jut egy ápolóra az adott kórházban vagy osztályon? (Vagy akár az egész egészségügyi ellátórendszerben.) Hogy milyen az adott osztály biztonsági kultúrája, az infekciókontroll protokollok betartásának és betartatásának mértéke, mit látnak az egészségügyi dolgozók a régebb óta ott dolgozó munkatársaiktól, a feletteseiktől, mibe szocializálódtak bele, rendelkezésre áll-e kellő mennyiségű és minőségű fertőtlenítőszer és védőeszköz? Népszerű szóval élve: a rendszerszintű kérdések. Bár természetesen van szerepünk, de a hibák általában nem kizárólag az emberi hanyagság, tudatlanság, figyelmetlenség kontextusában értelmezhetőek: van egy környezet, mely lehet táptalaja is annak, hogy ilyen hibák megtörténjenek, de csökkentheti is ezek valószínűségét. Ennek a megértése kritikusan fontos ahhoz, hogy a kórházi rangsorok mögött meghúzódó okokat jobban lássuk és láttassuk, mert csak ez vezethet el minket ahhoz, hogy a helyzeten javíthassunk és megtaláljuk ehhez a legjobb megoldásokat. Az egyéni felelősségrevonás is lehet elkerülhetetlen, de önmagában ettől érdemi, tartós, önfenntartó javulás nem várható egy egészségügyi rendszerben. Akkor van lehetőségünk a beavatkozási lehetőségek jó megfogalmazására, ha a rendszer egészének is megértjük a viselkedését, azonosítjuk a hibákat megelőző és azokat elősegítő pontjait, mert így tudjuk a leghatékonyabban javítani a rendszer teljesítményét, ezzel szolgálva a betegek és az egész magyar lakosság érdekeit.

E kettő, tehát egyfelől a transzparencia, másfelől az elemzések, döntések adatokra alapozásának az összekapcsolódása egy olyan pont, melyben véleményem szerint hatalmas lehetőség rejlik a magyar egészségügy fejlesztésére, ezáltal a betegek, és általában a magyar lakosság életminőségének a javítására.

Statisztikai és számítástechnikai részletek

Ez a fejezet az elemzés technikai részleteit ismerteti, a végeredményeket a következő, Eredmények fejezet mutatja be; akit a módszertani részletek nem érdekelnek, erre a linkre kattintva egyből odaugorhat.

A lenti kódok a számítás teljes reprodukcióját lehetővé teszik, egyetlen kivétellel: a legelső lépés, a nyers adatok betöltése nem reprodukálható, ugyanis a nyers adatokat tartalmazó táblákat – szándékosan – nem teszem elérhetővé. Ezek fellelhetőek az interneten (valójában tehát ez a lépés is reprodukálható, csak nem innen), mivel a bírósági ítélet rendelkezett a nyilvánosságra hozatalukról. Ilyen értelemben tehát jogilag aggálytalanul közzétehetném én is, elvi okokból nem teszem meg: e táblák tételes adatokat tartalmaznak, amelyek nyilvánosságra hozatala még szerintem is – noha a transzparencia elkötelezett híve vagyok – számos kérdést vet fel, így mutatni akarom, hogy lehetnek ilyen jellegű, adatvédelmi limitációk még a legtranszparensebb rendszerben is. Természetesen fontos, hogy megfelelő garanciák mellett a kutatók a tételes adatokhoz is hozzáférhessenek, de ez a döntésem jelen esetben érdemi limitációt nem jelent, ugyanis az aggregált adatokat elemi szinten is nyilvánosságra hozom (valamennyi kórház valamennyi osztályán megadom például a fertőzések számát, minden egyes évre), amiből minden kérdés megválaszolható – de mégis, aggregált, és nem tételes adatról van szó.

A számítási eredményeket azonban teljeskörűen hozzáférhetővé teszem, hiszen ezek már kizárólag csak aggregált adatokat mutatnak.

Adatok betöltése

Az elemzéseket az R statisztikai környezet alatt végeztem.

Elsőként betöltjük a szükséges csomagokat; használni fogjuk többek között a data.table-t (1.15.0 verzió) és a ggplot2-t (3.4.4 verzió) :

library(data.table)
library(ggplot2)

Beállítjuk a seed értékét, hogy az elemzés teljesen reprodukálható legyen (egyes ábrák jitter-eltek lesznek, ezért fog ez számítani):

set.seed(1)

Ezután betöltjük a nyers adatokat is, ügyelve az egységes formázásra:

RawData <- rbindlist(lapply(list.files("./RawData/", full.names = TRUE), function(f)
  data.table(readxl::read_excel(f, sheet = 1, guess_max = 100000), check.names = TRUE)[
    , .(hospital_department_of_admission = Felvételes.osztály, hospital_code = Kórházkód,
        hospital_name = Kórház.neve, type = substring(f, 16, 18),
        year = if(exists("Év")) as.numeric(Év) else as.numeric(substring(f, 20, 23)))]))
RawData$hospital_code <- stringr::str_pad(RawData$hospital_code, 6, "left", "0")

Betegforgalmi adatok betöltése és összekapcsolása

Elsőként betöltjük a betegforgalmi adatokat (a már említett projekt alapján):

KhAdatok <- readRDS(url(paste0("https://raw.githubusercontent.com/tamas-ferenci/",
                               "GondolatokAMagyarKorhaziAdatokElemzeserolEsNehany",
                               "EgeszsegpolitikaiMegjegyzes/main/KorhaziAgyszamEs",
                               "Betegforgalom.rds")))
KhAdatok$KorhazNev <- trimws(KhAdatok$KorhazNev)

Szükségünk lesz egy – kézzel elkészített – táblára, mely összekapcsolja az NNK-nál szereplő osztály-megnevezéseket a NEAK tábla szakmáival:

DeptCodeLink <- fread("DepartmentCodesLink.csv", dec = ",")
DeptCodeLink[SzakmaKod==""]$SzakmaKod <- NA

Ellenőrizzük le, hogy nincs olyan osztályunk, ami ne szerepelne a táblában:

sum(!unique(RawData$hospital_department_of_admission)%in%
      DeptCodeLink$hospital_department_of_admission)
## [1] 0

Az persze lehet, hogy valaminek nincsen párja:

data.frame(Osztaly = unique(merge(
  RawData, DeptCodeLink)[is.na(SzakmaKod)]$hospital_department_of_admission))
Osztaly
011_Rehab_ Belgyógyászat
01_Krónikus_ Belgyógyászat
022_Rehab_ Sebészet
02_Krónikus_ Sebészet
033_Rehab_Traumatológia
03_Krónikus_Traumatológia
04_Krónikus_Szűlészet-nőgyógyászat
055_Rehab_ Csecsemő- és gyermekgyógyászat
05_Krónikus_ Csecsemő- és gyermekgyógyászat
06_Krónikus_ Fül- orr- gége
08_Krónikus_ Borgyógyászat
08_Krónikus_ Bőrgyógyászat
099_Rehab_ Neurológia
09_Krónikus_ Neurológia
100_Rehab_ Ortopédia
10_Krónikus_ Ortopédia
12_Krónikus_ Onkológia
144_Rehab_ Reumatológia
14_ Krónikus_Reumatológia
188_Rehab_ Pszichiátria
18_Krónikus_ Pszichiátria
199_Rehab_ Tüdőgyógyászat
19_Krónikus_ Tüdogyógyászat
19_Krónikus_ Tüdőgyógyászat
21_Krónikus ápolás
22_Mozgászervi rehabilitáció
23_Ápolás
277_Rehab_ Angiológia, phlebológia, lymphológia
27_Krónikus_ Angiológia, phlebológia, lymphológia
311_Rehab_ Gasztroenterológia
31_Krónikus_ Gasztroenterológia
355_Rehab_ Stroke
35_Krónikus_ Stroke
37_Krónikus_ Nephrológia
400_Rehab_ Kardiológia
40_Krónikus_ Kardiológia
Felvételi osztály
G19_Krónikus_ Gyemek-tüdőgyógyászat
Krónikus ellátás - Belgyógyászati jellegű
Krónikus ellátás - Egyéb jellegű
Krónikus ellátás - Sebészeti jellegű
LTC - Hosszú ápolás, krónikus ápolás
LTC - Hosszú ápolás/krónikus ellátás
MEDTR - Mozgásszervi rehabilitáció
MIX - Ellátási típusok kombinációja
Mátrix osztály
OTH - Egyéb nem felsorolt
RHB - Rehabilitáció
RHB - Rehabilitáció (beleértve a mozgásszervit)
Rehabilitáció
Rehabilitációs ellátás - Belgyógyászati jellegű
Rehabilitációs ellátás - Egyéb jellegű
Rehabilitációs ellátás - Sebészeti jellegű
SURONCO - Onkológiai sebészet
SURSTODEN - Sztomatológia / Fogászat
Stroke
Tartós ápolás
Utókezelő

Ez egy veszteség lesz, de egy tudatosan vállalt veszteség: ezek krónikus osztályok (amelyekhez nem vettünk ki NEAK-adatot), illetve nem jól beazonosítható, egyértelműen össze nem kapcsolható osztályok. (Ez a fenti lista segítségével le is ellenőrizhető.) A veszteség csakugyan nem nagy: az eredeti 124448 eseményből 113903 esemény marad, azaz a veszteség mindössze 10545 esemény (0.1%). Végezzük el az egyesítést:

RawData <- merge(RawData, DeptCodeLink)[!is.na(SzakmaKod)]

Ezt követően betöltjük a – szintén kézzel elkészített – táblát a kórházak összekapcsolásához. Erre azért van szükség, mert az NNK táblában lévő kódok sajnos nem azonosak a NEAK táblában szereplő kódokkal, így ezt kézzel kell megoldanunk:

HospCodeLink <- fread("HospitalCodesLink.csv", dec = ",")
HospCodeLink <- melt(HospCodeLink, id.vars = "hospital_code")[
  , .(hospital_code, year = as.numeric(substring(variable, 5)), KorhazRovid = value)]
HospCodeLink$KorhazRovid <- stringr::str_pad(HospCodeLink$KorhazRovid, 4, "left", "0")
HospCodeLink$hospital_code <- stringr::str_pad(HospCodeLink$hospital_code, 6, "left", "0")
HospCodeLink <- merge(HospCodeLink, unique(KhAdatok[, .(year = Ev, KorhazRovid, KorhazNev)]),
                      by = c("year", "KorhazRovid"), all.x = TRUE)

Ezt szintén kapcsoljuk össze az adattáblánkkal:

RawData <- merge(RawData, HospCodeLink, by = c("hospital_code", "year"))

Érdemes elmenteni az adatokat egy külön fájlba, hogy kézzel ellenőrizni tudjuk, hogy jól sikerült-e az összekapcsolás:

fwrite(unique(RawData[, .(hospital_code, year, hospital_name, KorhazNev, KorhazRovid)])[
  tolower(hospital_name)!=tolower(KorhazNev)], "KhNevekOsszekapcsolas.csv", dec = ",",
  sep =";", bom = TRUE)

Végezetül készítsünk egy táblát a kórházak későbbiekben használt elnevezéseiről; erre azért van szükség, mert lehet, hogy a név megváltozott az évek során – most használjuk az időben első nevet, ami az adott NEAK kódhoz tartozik. A kórházak névváltozása nagyon elterjedt, és pont ezért jó a NEAK kód, mert az ilyen esetekben is állandó marad. Sajnos azonban ez sem igaz kivétel nélkül mindig, néha a kód is megváltozik (pl. a SOTE 2022 előtt „Semmelweis Egyetem” volt 0140 kóddal, de 2022-ben már „Semmelweis Egyetem Klinikai Központ”, 01H7 kóddal). Ezeket az eseteket kézzel javítjuk (itt is a kronologikusan első nevet használva):

KorhazNevek <- KhAdatok[Ev>=2015, .(KorhazRovid, KorhazNevEgyseges = KorhazNev)][
  !duplicated(KorhazRovid)]
KorhazNevek[KorhazNevEgyseges=="Semmelweis Egyetem Klinikai Központ"]$KorhazNevEgyseges <-
  "Semmelweis Egyetem"
KorhazNevek[KorhazNevEgyseges=="Pécsi Tudományegyetem Klinikai Központ"]$KorhazNevEgyseges <-
  "Pécsi Tudományegyetem"
KorhazNevek[KorhazNevEgyseges=="Budai Egészségközpont Zrt."]$KorhazNevEgyseges <-
  "Budai Egészségközpont Kft."
KorhazNevek[KorhazNevEgyseges=="Szent Damján Görögkatolikus Kórház"]$KorhazNevEgyseges <-
  "Felső-Szabolcsi Kórház, Kisvárda"

Incidencia-számolás és adattisztítás

Az adatbázisunkban összesen 113891 eset van tehát, az alábbi megoszlásban:

dcast(`Év` ~ type, data = RawData[, .N, .(`Év` = year, type)], value.var = "N")
Év CDI MRK VAF
2015 5387 3539 3318
2016 4457 4123 3246
2017 4805 4187 3354
2018 5093 4677 3904
2019 5150 5002 4406
2020 5087 4332 4231
2021 7294 5559 5640
2022 7123 5364 4613

Első lépésben számoljuk ki a jelentett fertőzéses esetek számát év, kórház és osztály szinten (mindhárom fertőzés-típusra), majd ezt a táblát egyesítsük mind a betegforgalmi, mind az elnevezési táblákkal:

Res <- merge(merge(setkey(RawData, KorhazRovid, SzakmaKod, year, type)[
  CJ(unique(KorhazRovid), unique(SzakmaKod), unique(year), unique(type)), .N, by = .EACHI],
  KhAdatok[, .(year = Ev, KorhazRovid, KorhazNev, SzakmaKod, SzakmaMegnev,
               MukodoAtlagAgy, TeljesitettApolasiNapSzam, ElbocsatottBetegSzam)],
  by = c("year", "KorhazRovid", "SzakmaKod"), all.x = TRUE),
  KorhazNevek, by = "KorhazRovid", all.x = TRUE)

Az itt szereplő esetek száma természetesen ugyanúgy 113891.

Lesz veszteség azért, mert a kórházban valójában csak krónikus ellátás van, de ez az osztály-névből ez nem derült ki, illetve, mert az adott kórház az adott évben nem is létezett (ez kicsit extrémnek hangzik, de ilyen is előfordul). Példaként az első néhány ilyen:

head(RawData[is.na(KorhazNev)])
hospital_code year hospital_department_of_admission hospital_name type SzakmaKod KorhazRovid KorhazNev
029453 2019 MEDRHEU - Rheumatológia Szent Kozma és Damján Rehabilitációs Szakkórház MRK 14 0108 NA
01210K 2019 MEDOTH - Egyéb belgyógyászati Károlyi Sándor Kórház MRK 01 0121 NA
01210K 2019 MEDOTH - Egyéb belgyógyászati Károlyi Sándor Kórház MRK 01 0121 NA
01210K 2019 MEDOTH - Egyéb belgyógyászati Károlyi Sándor Kórház MRK 01 0121 NA
01210K 2021 MEDOTH - Egyéb belgyógyászati Károlyi Sándor Kórház MRK 01 0121 NA
051000 2020 MEDGEN - Általános belgyógyászat Kazincbarcikai Kórház Nonprofit Korlátolt Felelősségű Társaság CDI 01 0564 NA

Ezek száma és megoszlása:

Veszt1 <- Res[is.na(KorhazNev)&N>0, .(N1 = sum(N)), .(`Év` = year, type)]
dcast(`Év` ~ type, data = Veszt1, value.var = "N1")
Év CDI MRK VAF
2015 23 34 14
2016 10 2 4
2017 15 5 7
2018 12 13 13
2019 18 25 6
2020 49 34 26
2021 176 166 69
2022 106 96 46

Ez összesen tehát 969 eset; ezeket hagyjuk el:

Res <- Res[!is.na(KorhazNev)]

Ellenőrizzük le, hogy van-e olyan eset, amit olyan osztályról jelentettek, amivel a kórház elvileg nem is rendelkezik:

nrow(Res[is.na(SzakmaMegnev)&N>0])
## [1] 0

Végezetül van pár eset, ahol olyan osztály jelentett fertőzést, ami létezik ugyan, de elvileg nem volt betegforgalma:

Res[TeljesitettApolasiNapSzam==0&N>0]
KorhazRovid year SzakmaKod type N KorhazNev SzakmaMegnev MukodoAtlagAgy TeljesitettApolasiNapSzam ElbocsatottBetegSzam KorhazNevEgyseges
0154 2016 06 CDI 1 Országos Onkológiai Intézet Fül-orr-gégegyógyászat 3.4 0 0 Országos Onkológiai Intézet
0154 2016 06 MRK 31 Országos Onkológiai Intézet Fül-orr-gégegyógyászat 3.4 0 0 Országos Onkológiai Intézet
0154 2016 06 VAF 7 Országos Onkológiai Intézet Fül-orr-gégegyógyászat 3.4 0 0 Országos Onkológiai Intézet
0901 2016 19 VAF 1 Kenézy Gyula Kórház és Rendelőintézet, Debrecen Tüdőgyógyászat 0.0 0 0 Kenézy Gyula Kórház és Rendelőintézet, Debrecen
0940 2016 18 MRK 1 Debreceni Egyetem Klinikai Központ Pszichiátria 0.0 0 0 Debreceni Egyetem Klinikai Központ
0940 2019 18 CDI 2 Debreceni Egyetem Klinikai Központ Pszichiátria 0.0 0 0 Debreceni Egyetem Klinikai Központ
0940 2020 18 CDI 2 Debreceni Egyetem Klinikai Központ Pszichiátria 0.0 0 0 Debreceni Egyetem Klinikai Központ
0940 2020 18 MRK 6 Debreceni Egyetem Klinikai Központ Pszichiátria 0.0 0 0 Debreceni Egyetem Klinikai Központ
0940 2020 18 VAF 2 Debreceni Egyetem Klinikai Központ Pszichiátria 0.0 0 0 Debreceni Egyetem Klinikai Központ

Ezek szintén nem jelentenek nagy veszteséget:

Veszt3 <- Res[TeljesitettApolasiNapSzam==0, .(N3 = sum(N)), .(`Év` = year, type)]
dcast(`Év` ~ type, data = Veszt3, value.var = "N3")
Év CDI MRK VAF
2015 0 0 0
2016 1 32 8
2017 0 0 0
2018 0 0 0
2019 2 0 0
2020 2 6 2
2021 0 0 0
2022 0 0 0

Ez tehát 53 eset; hagyjuk el ezeket is:

Res <- Res[TeljesitettApolasiNapSzam!=0]

Ezzel előállítottunk egy tisztított, további feldolgozásra alkalmas adatbázist. Ellenőrizzük, hogy jól dolgoztunk-e ennek során! Bár az adatbázisban már csak 112869 esetünk van, de a két lépés során összesen 1022 esetet hagytunk el, így szerencsére megkapjuk a teljes számot, ami 113891, ahogy azt már láttuk is. Ellenőrizzük le, hogy a részletesebb lebontások is stimmelnek:

merge(merge(merge(Res[, .(N = sum(N)), .(`Év` = year, type)], Veszt1, by = c("Év", "type"),
                  all.x = TRUE),
            Veszt3,  by = c("Év", "type"), all.x = TRUE)[
              , .(`Év`, type, MegmaradtN = N, Veszteseg1 = ifelse(is.na(N1), 0, N1),
                  Veszteseg3 = ifelse(is.na(N3), 0, N3))],
      RawData[, .N, .(`Év` = year, type)], by = c("Év", "type"))[
        , .(`Év`, type, MegmaradtN, Veszteseg1, Veszteseg3,
            TeljesN = MegmaradtN + Veszteseg1 + Veszteseg3, N,
            Differencia = N-(MegmaradtN + Veszteseg1 + Veszteseg3))]
Év type MegmaradtN Veszteseg1 Veszteseg3 TeljesN N Differencia
2015 CDI 5364 23 0 5387 5387 0
2015 MRK 3505 34 0 3539 3539 0
2015 VAF 3304 14 0 3318 3318 0
2016 CDI 4446 10 1 4457 4457 0
2016 MRK 4089 2 32 4123 4123 0
2016 VAF 3234 4 8 3246 3246 0
2017 CDI 4790 15 0 4805 4805 0
2017 MRK 4182 5 0 4187 4187 0
2017 VAF 3347 7 0 3354 3354 0
2018 CDI 5081 12 0 5093 5093 0
2018 MRK 4664 13 0 4677 4677 0
2018 VAF 3891 13 0 3904 3904 0
2019 CDI 5130 18 2 5150 5150 0
2019 MRK 4977 25 0 5002 5002 0
2019 VAF 4400 6 0 4406 4406 0
2020 CDI 5036 49 2 5087 5087 0
2020 MRK 4292 34 6 4332 4332 0
2020 VAF 4203 26 2 4231 4231 0
2021 CDI 7118 176 0 7294 7294 0
2021 MRK 5393 166 0 5559 5559 0
2021 VAF 5571 69 0 5640 5640 0
2022 CDI 7017 106 0 7123 7123 0
2022 MRK 5268 96 0 5364 5364 0
2022 VAF 4567 46 0 4613 4613 0

Láthatjuk tehát, hogy minden stimmel!

Lesznek kórházak és szakmák, melyeknél – adott fertőzés-típus és adott év esetén – egyetlen eset sem fordul elő. Ezeket hagyjuk ki az adatbázisból, hiszen most úgysem tudjuk őket semmilyen módon modellezni:

Res <- merge(Res, Res[, .(V1 = sum(N)), .(type, KorhazRovid, year)], by = c("type", "KorhazRovid", "year"))[V1!=0][,-"V1"]
Res <- merge(Res, Res[, .(V1 = sum(N)), .(type, SzakmaKod, year)], by = c("type", "SzakmaKod", "year"))[V1!=0][,-"V1"]

Ezzel fertőzéses esetet természetesen nem veszítünk, ápolási napot ugyan igen, de még így is megőriztük az ápolási napok nagyon nagy hányadát:

merge(Res[, .(sum(TeljesitettApolasiNapSzam)), .(year, type)],
      KhAdatok[, .(sum(TeljesitettApolasiNapSzam)), .(year = Ev)], by = "year")[
        , .(year, type, `Megmaradt ápolási nap [100 ezer nap]` = round(V1.x/1e5, 2),
            `Teljes ápolási nap [100 ezer nap]` = round(V1.y/1e5, 2),
            `Arány a teljeshez képest [%]` = round(V1.x/V1.y*100, 1))]
year type Megmaradt ápolási nap [100 ezer nap] Teljes ápolási nap [100 ezer nap] Arány a teljeshez képest [%]
2015 CDI 96.87 105.25 92.0
2015 MRK 99.72 105.25 94.7
2015 VAF 88.54 105.25 84.1
2016 CDI 96.72 104.16 92.9
2016 MRK 97.80 104.16 93.9
2016 VAF 97.27 104.16 93.4
2017 CDI 92.39 99.63 92.7
2017 MRK 94.48 99.63 94.8
2017 VAF 92.70 99.63 93.0
2018 CDI 92.23 98.22 93.9
2018 MRK 91.17 98.22 92.8
2018 VAF 91.59 98.22 93.2
2019 CDI 89.91 96.07 93.6
2019 MRK 91.30 96.07 95.0
2019 VAF 88.20 96.07 91.8
2020 CDI 72.59 77.93 93.1
2020 MRK 71.27 77.93 91.4
2020 VAF 69.89 77.93 89.7
2021 CDI 73.30 77.50 94.6
2021 MRK 73.51 77.50 94.9
2021 VAF 71.87 77.50 92.7
2022 CDI 75.98 79.12 96.0
2022 MRK 74.35 79.12 94.0
2022 VAF 73.62 79.12 93.1

Ezen javítások és visszaellenőrzések után jöhet a következő lépés, az incidencia számolása. Ehhez elsőként definiáljuk egy segédfüggvényt, ami a konfidenciaintervallumokat számolja gyorsan:

binomCI <- function(x, n, conf.level = 0.95) {
  list(lci = if(x == 0) 0 else qbeta((1 - conf.level)/2, x, n - x + 1),
       uci = if(x == n) 1 else qbeta(1 - (1 - conf.level)/2, x + 1, n - x))
}

Majd számoljuk is ki az incidenciákat, osztály-szinten, betegre és ápolási napra is vonatkoztatva, 95%-os konfidenciaintervallummal együtt:

Res$IncPerDay <- Res$N/Res$TeljesitettApolasiNapSzam*1e5
Res <- cbind(Res, rbindlist(lapply(1:nrow(Res), function(i)
  binomCI(Res$N[i], Res$TeljesitettApolasiNapSzam[i])))*1e5)
names(Res)[names(Res)=="lci"] <- "IncPerDayLCI"
names(Res)[names(Res)=="uci"] <- "IncPerDayUCI"
Res$IncPerPatient <- Res$N/Res$ElbocsatottBetegSzam*1e4
Res <- cbind(Res, rbindlist(lapply(1:nrow(Res), function(i)
  binomCI(Res$N[i], Res$ElbocsatottBetegSzam[i])))*1e4)
names(Res)[names(Res)=="lci"] <- "IncPerPatientLCI"
names(Res)[names(Res)=="uci"] <- "IncPerPatientUCI"

Mentsük ki az eredményeket (CSV és RDS formátumokban is):

fwrite(Res, "Res.csv", dec = ",", sep =";", bom = TRUE)
saveRDS(Res, "Res.rds")

A nyers incidenciák vizualizációja

Hogy benyomást szerezzünk az adatokról, nézzünk rá a nyers incidenciákra! Egyetlen megjegyzés az ábrákhoz: néhány esetben a konfidenciaintervallumok nagyon szélesek; hogy ezek ne nyomják teljesen össze a függőleges skálát, az ilyenek tetejei kifutnak az ábrákról.

A nyers incidenciákat ábrázolhatjuk ápolási napra vonatkoztatva (a lenti gyorsan futó ábra természetesen csak illusztráció, ami az első 5 ábrát mutatja a több tucatból; a teljes eredményt kimentjük PDF formátumban, hogy tanulmányozható legyen):

SzakmaTipusCombs <- unique(Res[, .(type, SzakmaMegnev)])[order(type, SzakmaMegnev)]

p <- lapply(1:nrow(SzakmaTipusCombs), function(i) {
  plotdat <- Res[type==SzakmaTipusCombs$type[i]&SzakmaMegnev==SzakmaTipusCombs$SzakmaMegnev[i]]
  plotdat <- merge(plotdat, plotdat[, .(obs = .N), .(KorhazNevEgyseges)],
                   by = "KorhazNevEgyseges")
  ggplot(plotdat,
         aes(x = year, y = IncPerDay, ymin = IncPerDayLCI, ymax = IncPerDayUCI)) +
    facet_wrap(~KorhazNevEgyseges, labeller = label_wrap_gen(width = 45)) +
    geom_point() + geom_line(data = plotdat[obs>1]) + geom_errorbar(linewidth = 0.3) +
    labs(title = paste(SzakmaTipusCombs$SzakmaMegnev[i], " - ", SzakmaTipusCombs$type[i]),
         y = "Nyers incidencia [/100 ezer ápolási nap]", x = "Év") +
    coord_cartesian(
      ylim = c(0, max(Res[type==SzakmaTipusCombs$type[i]&
                            SzakmaMegnev==SzakmaTipusCombs$SzakmaMegnev[i]]$IncPerDay))) +
    theme(legend.position = "bottom", legend.title = element_blank())
})

cairo_pdf("OsztalyokKulonPerDay.pdf", onefile = TRUE, width = 16, height = 9)
for(i in 1:length(p)) print(p[[i]])
invisible(dev.off())

for(i in 1:5) print(p[[i]])

Vagy vonatkoztathatunk betegszámra is (ez talán kevésbé szerencsés megoldás, ahogy volt is róla korábban szó, de PDF formátumban elérhetőek ezek az eredmények is):

p <- lapply(1:nrow(SzakmaTipusCombs), function(i) {
  plotdat <- Res[type==SzakmaTipusCombs$type[i]&SzakmaMegnev==SzakmaTipusCombs$SzakmaMegnev[i]]
  plotdat <- merge(plotdat, plotdat[, .(obs = .N), .(KorhazNevEgyseges)],
                   by = "KorhazNevEgyseges")
  ggplot(plotdat,
         aes(x = year, y = IncPerPatient, ymin = IncPerPatientLCI, ymax = IncPerPatientUCI)) +
    facet_wrap(~KorhazNevEgyseges, labeller = label_wrap_gen(width = 45)) +
    geom_point() + geom_line(data = plotdat[obs>1]) + geom_errorbar(linewidth = 0.3) +
    labs(title = paste(SzakmaTipusCombs$SzakmaMegnev[i], " - ", SzakmaTipusCombs$type[i]),
         y = "Nyers incidencia [/10 ezer beteg]", x = "Év") +
    coord_cartesian(
      ylim = c(0, max(Res[type==SzakmaTipusCombs$type[i]&
                            SzakmaMegnev==SzakmaTipusCombs$SzakmaMegnev[i]]$IncPerPatient))) +
    theme(legend.position = "bottom", legend.title = element_blank())
})

cairo_pdf("OsztalyokKulonPerPatient.pdf", onefile = TRUE, width = 16, height = 9)
for(i in 1:length(p)) print(p[[i]])
invisible(dev.off())

Vigyázat, a fenti ábrák két szempontból is félrevezetőek lehetnek! Egyrészt sugallhatják azt, hogy egymáshoz hasonlítsuk a kórházakat – miközben a betegösszetétel eltérhet közöttük, ahogy azt hosszasan meg is beszéltük. De ha jobban meggondoljuk, van még egy gond: nem csak a különböző kórházak ugyanazon évi adatai nem hasonlíthatóak feltétlenül egymáshoz, hanem ugyanazon kórház különböző évi adatai sem! Hiszen akár időben is változhat a betegösszetétel vagy az elvégzett beavatkozások jellege, még ugyanazon kórház ugyanazon osztályára is; bár ez minden bizonnyal kisebb súlyú probléma, mint az előbbi. Ezért nagyon fontos a „nyers” felirat az ábrán; pont ezeket az aspektusokat igyekszünk majd korrigálni a későbbiekben. (Valójában egy harmadik probléma is van, szintén volt róla szó, a jelentési fegyelem, ez is eltérhet kórházak között, de ez is változhat időben még ugyanazon kórházra is; sajnos ennek korrekciójára nincsen semmilyen eszközünk.)

Ezek jelentik lényegében a legteljesebben rétegzett adatokat (még az évet is külön vettük); mondhatjuk, hogy később majd ezeket kell modelleznünk a jobban interpretálható eredmény elérése érdekében.

A case mix index (CMI) adatok

Elsőként töltsük be az adatokat, majd aggregáljuk az általunk használt szakmákra (erre azért van szükség, mert a NEAK case mix index táblája finomabb felbontású szakmakódokat használ):

CMIData <- readRDS("KorhaziTeljesitmeny.rds")
CMIData <- CMIData[, .(SulyszamOsszesen = sum(SulyszamOsszesen), TeljesEset = sum(TeljesEset)),
                   .(Ev, KorhazRovid, SzakmaKod)]
CMIData$CMI <- CMIData$SulyszamOsszesen/CMIData$TeljesEset

Ellenőrizzük le, hogy minden szükséges adat megvan:

nrow(merge(Res, CMIData[, .(year = Ev, KorhazRovid, SzakmaKod, CMI)],
           by = c("year", "KorhazRovid", "SzakmaKod"), all = TRUE)[is.na(CMI)])
## [1] 0

Állítsuk elő a későbbiekhez szükséges átlag-adatokat (évente és szakmánként) is:

CMIAvgData <- CMIData[, .(Ev, KorhazRovid, SzakmaKod, SulyszamOsszesen, TeljesEset, CMI)][
  TeljesEset!=0][, .(CMI_avg = Hmisc::wtd.mean(CMI, TeljesEset),
                     CMI_SD = sqrt(Hmisc::wtd.var(CMI, TeljesEset))), .(Ev, SzakmaKod)]

Egyesítsük a nagy táblánkkal:

Res <- merge(Res, CMIData[, .(year = Ev, KorhazRovid, SzakmaKod, CMI)],
             by = c("year", "KorhazRovid", "SzakmaKod"))
Res <- merge(Res, CMIAvgData[, .(year = Ev, SzakmaKod, CMI_avg, CMI_SD)],
             by = c("year", "SzakmaKod"))

Majd számoljuk ki az eltérés értékeket, a sima eltérést és a $z$-score-t is:

Res$CMIdev <- Res$CMI - Res$CMI_avg
Res$zCMI <- (Res$CMI - Res$CMI_avg)/Res$CMI_SD

Érdemes megnézni a CMI-értékek eloszlását szakmánként (az MRK kiválasztása természetesen jelentőség nélkül, csak az a fontos, hogy rászűrjünk valamelyikre, hogy ne legyen háromszorozódva minden pont):

p <- ggplot(Res[type=="MRK"], aes(x = factor(year), y = CMI)) + geom_jitter(width = 0.2) +
  facet_wrap(~SzakmaMegnev) + geom_point(aes(y = CMI_avg), color = "red") + labs(x = "Év") +
  scale_x_discrete(guide = guide_axis(angle = 45))
p

Logaritmikus skálán:

p + scale_y_log10() + annotation_logticks(sides = "l")

Érdemes megnézni a különféleképp számolt CMI-k eloszlását is. Sima eltérés:

ggplot(Res[type=="MRK"], aes(x = factor(year), y = CMIdev)) + geom_jitter(width = 0.2) +
  facet_wrap(~SzakmaMegnev) + labs(x = "Év") + scale_x_discrete(guide = guide_axis(angle = 45))

Ezt érdemes úgy is megnézni, hogy a függőleges tengely skálázásánál megengedjük, hogy ne egységes legyen:

ggplot(Res[type=="MRK"], aes(x = factor(year), y = CMIdev)) + geom_jitter(width = 0.2) +
  facet_wrap(~SzakmaMegnev, scales = "free") + labs(x = "Év") +
  scale_x_discrete(guide = guide_axis(angle = 45))

A $z$-score:

ggplot(Res[type=="MRK"], aes(x = factor(year), y = zCMI)) + geom_jitter(width = 0.2) +
  facet_wrap(~SzakmaMegnev) + labs(x = "Év") +
  scale_x_discrete(guide = guide_axis(angle = 45))

Modellezés

Elsőként alakítsuk faktorrá a kategoriális változókat:

Res$KorhazNevFactor <- factor(Res$KorhazNevEgyseges)
Res$SzakmaMegnevFactor <- factor(Res$SzakmaMegnev)
Res$yearFactor <- factor(Res$year)

Definiáljunk egy segédfüggvényt az ábrázoláshoz:

plotter <- function(fit, title = NULL) {
  temp <- gratia::parametric_effects(fit)
  temp <- rbind(temp[temp$term=="KorhazNevFactor",][
    order(temp[temp$term=="KorhazNevFactor",]$partial),], temp[temp$term!="KorhazNevFactor",])
  temp$level <- factor(temp$level, as.character(levels(temp$level))[temp$level])
  khindex <- which(sort(unique(temp$term))=="KorhazNevFactor")
  szakmaindex <- which(sort(unique(temp$term))=="SzakmaMegnevFactor")
  evindex <- which(sort(unique(temp$term))=="yearFactor")
  p1 <- gratia::draw(temp, fun = exp)
  p1[[khindex]] <- p1[[khindex]] + coord_flip() + labs(x = "", y = "IRR", title = "Kórház")
  p1[[szakmaindex]] <- p1[[szakmaindex]] + coord_flip() + labs(x = "", y = "IRR",
                                                               title = "Szakma")
  # p1[[evindex]] <- p1[[evindex]] + coord_flip() + labs(x = "", y = "IRR", title = "Év")
  if(any(grepl("CMI", gratia::parametric_terms(fit)))|any(grepl("CMI", gratia::smooths(fit)))) {
    p2 <- if(length(gratia::smooths(fit))>0)
      gratia::draw(fit, fun = exp) + labs(title = "CMI - spline", y = "IRR") else
        p1[[grep("CMI", sort(unique(temp$term)))]] + labs(title = "CMI - lineáris", y = "IRR")
    res <- patchwork::wrap_plots(p1[[khindex]], p1[[szakmaindex]], p2, design = c("AA
                                                                BB
                                                                CC"), heights = c(0.5, 0.3, 0.2))
  } else res <- patchwork::wrap_plots(p1[[khindex]], p1[[szakmaindex]], ncol = 1, #p1[[evindex]], ncol = 1,
                                      heights = c(0.5, 0.5)) #0.3, 0.2))
  if(!is.null(title)) res <- res + patchwork::plot_annotation(title = title)
  res
}

Ezután elvégezhetjük a modellek becslését! Minden esetben általánosított lineáris modellt használunk, kórház és szakma magyarázó változókkal, interakció nélkül. Amint volt róla szó, a CMI-s korrekciót nem tudjuk a különböző évekre összevethető módon megtenni, így a modellt évenként külön-külön futtatjuk. Végezetül pedig, hogy ápolási időre vetítsünk, azt offszetként adjuk meg. A három kórházi fertőzés-típust teljesen külön kezeljük.

A legelegánsabb az, ha az összes modellt egy lépésben becsültetjük meg. A rengeteg lehetőség miatt érdemes a számítást több processzormagra párhuzamosítani (ez szerencsére könnyen megtehető, hiszen az egyes paraméter-kombinációk futtatásai egymástól teljesen függetlenek):

pargrid <- CJ(type = unique(Res$type), year = unique(Res$year),
              formulas = c("", "CMI", "CMIdev", "zCMI", "s(CMI)", "s(CMIdev)", "s(zCMI)"),
              families = c("P", "QP", "NB"))

cl <- parallel::makeCluster(parallel::detectCores()-1)
parallel::clusterExport(cl, c("Res", "pargrid"), envir = environment())

fits <- parallel::parLapply(cl, 1:nrow(pargrid), function(i) {
  mgcv::gam(as.formula(paste0("N ~ KorhazNevFactor + SzakmaMegnevFactor + ",
                              pargrid$formulas[i], "+ offset(log(TeljesitettApolasiNapSzam))")),
            data = Res[Res$type==pargrid$type[i]&Res$year==pargrid$year[i],],
            family = switch(pargrid$families[i], "P" = poisson(), "QP" = quasipoisson(),
                            "NB" = mgcv::nb()))
})

parallel::stopCluster(cl)

# saveRDS(fits, "fits.rds")
# fits <- readRDS("fits.rds")

Amint látható, megvizsgáljuk azt a lehetőséget, ha a CMI-t egyáltalán nem használjuk fel, azt, ha nyers értékként, ha eltérésként, illetve ha $z$-score-ként használjuk fel, ez utóbbi három esetet megnézzük lineárisan és spline-nal kibontva is. (Természetesen a CMI teljes kihagyása jó eséllyel torzítást okoz, illetve növel, így ez csak a teljesség kedvéért szerepel, vagy, ha valaki nem fogadná el azt, hogy a CMI bármennyire is mérőszáma lehet a kórházi fertőzésekre fogékonyabb betegösszetételnek.) Az eredményváltozó eloszlásaként megpróbáljuk a Poisson-t, a kvázi-Poisson-t és a negatív binomiálisat.

Az összes megbecsült modell ábráját csak elmentjük PDF formátumban:

# if(!file.exists("Modellek.pdf")) {
cairo_pdf("Modellek.pdf", onefile = TRUE, width = 16, height = 9)
for(i in 1:length(fits))
  print(plotter(fits[[i]], title = paste(pargrid$type[i], " - ", pargrid$families[i], " - ",
                                         pargrid$formulas[i], " - ", pargrid$year[i])))
invisible(dev.off())
# }

A jól értelmezhető eredményekhez (fertőzés-gyakoriság ugyanazon, standardizált betegpopulációnál) elsőként határozzuk meg ezt a betegpopulációt mint a vizsgált időszakban a szakmánkénti átlagos betegforgalom, átlagos CMI mellett:

StdSzakma <- KhAdatok[Ev%in%unique(Res$year), .(StdMukodoAtlagAgy = mean(MukodoAtlagAgy),
                                                StdTeljesitettApolasiNapSzam =
                                                  mean(TeljesitettApolasiNapSzam),
                                                StdElbocsatottBetegSzam =
                                                  mean(ElbocsatottBetegSzam)),
                      .(SzakmaMegnevFactor = factor(SzakmaMegnev))]

predgrid <- merge(as.data.frame(unique(Res[, .(type, year, SzakmaMegnevFactor)])),
                  as.data.frame(unique(Res[, .(type, year, KorhazNevFactor)])),
                  by = c("type", "year"))

predgrid <- data.table(merge(predgrid,
                             StdSzakma[, .(SzakmaMegnevFactor,
                                           TeljesitettApolasiNapSzam =
                                             StdTeljesitettApolasiNapSzam,
                                           CMI = 1, CMIdev = 0, zCMI = 0)],
                             by = "SzakmaMegnevFactor"))

Ennek használatával kényelmesen, egy lépésben elkészíthetjük a predikciókat:

ress <- rbindlist(lapply(1:length(fits), function(i)
  data.table(predgrid[type==pargrid$type[i]&year==pargrid$year[i]],
             with(predict(fits[[i]], predgrid[type==pargrid$type[i]&year==pargrid$year[i]],
                          type = "link", se.fit = TRUE),
                  data.frame(lci = exp(fit - qnorm(0.975)*se.fit),
                             fit = exp(fit), uci = exp(fit + qnorm(0.975)*se.fit))))[
                               , .(lci = sum(lci)/sum(TeljesitettApolasiNapSzam)*1e5,
                                   fit = sum(fit)/sum(TeljesitettApolasiNapSzam)*1e5,
                                   uci = sum(uci)/sum(TeljesitettApolasiNapSzam)*1e5,
                                   type = pargrid$type[i], year = pargrid$year[i],
                                   formula = pargrid$formulas[i], family = pargrid$families[i]),
                               .(KorhazNevFactor)]))

Ezeket az eredményeket mentsük is el:

fwrite(ress, "StdHospRes.csv", dec = ",", sep =";", bom = TRUE)
saveRDS(ress, "StdHospRes.rds")

Eredmények

Minden fertőzés-típusnál elsőként az érzékenységvizsgálat eredményét közlöm: ezen az ábrán minden pötty egy (korrigált) gyakoriság, 100 ezer ápolási napra vetítve; az egyes pöttyök abban térnek el, hogy pontosan milyen statisztikai modellel történt a számítás. Az ábrának két szerepe van, az egyik, hogy bár van álláspontom arról, hogy ezen módszerek közül melyik a legjobb, de ha valaki ezt nem így gondolná, akkor az ábra, illetve a mögötte lévő adatok segítségével bármely más módszer eredményét is alapul veheti. A másik, talán még fontosabb, hogy ha ránézve az ábrára azt látjuk, hogy az értékek nagyjából hasonlóak, hogy a kórházak sorrendje körülbelül azonos a különböző típusú pontok szerint, akkor megnyugodhatunk e tekintetben, mondhatjuk ugyanis, hogy a végeredmény nem múlik nagyon azon, hogy pontosan milyen módszert választottunk. Ez megnyugtató, különösen, ha a választás a módszerek között nem tökéletesen egyértelmű, hiszen ez azt mondja, hogy szerencsére nincs is nagy jelentősége (robusztus az eredmény erre nézve).

Az érzékenységvizsgálat után jön maga a végeredmény: ezen az egyes kórházak eredményei láthatóak azon módszer alapján, mely véleményem szerint a legjobb (hozzátéve, hogy jó esetben ennek nincs nagy jelentősége, lásd előbb). Ez tehát lényegében az előző ábra, de csak az egyik típusú pontokat megjelenítve. Egy kiegészítéssel: ezen már megjelenik a 95%-os konfidenciaintervallum is. Ennek az értelmezése némileg bonyolultabb, most annyit emelnék ki, hogy a feltüntetett értékben lévő bizonytalanságot mutatja meg: minél szélesebb a konfidenciaintervallum, annál bizonytalanabb az érték. (Mit értünk bizonytalanság alatt? A fertőzés gyakorisága egy arány. Nagyon-nagyon intuitív példaként gondoljunk arra, hogy ha 10 betegből 1 fertőződik meg, illetve ha 10 000-ből 1000, az ugyanúgy 10%-os arány, mégis, az első esetben sokkal bizonytalanabbak leszünk ebben. A statisztika lehetővé teszi ezen „érzés” pontos megragadását.)

Egyetlen megjegyzés az eredmények prezentálásához. Előfordulhatnak esetek, ahol egy kórház adatai extrém bizonytalanok lesznek, mert nagyon kis számokból kell becsülni (kis kórházak, kevés beteggel, kevés fertőzéssel). Ez „statisztikai értelemben” nem jelent problémát: ettől még minden rendben le fog futni, korrekt eredményt ad, sőt, a konfidenciaintervallum pont hogy ki fogja ez fejezni, azáltal, hogy nagyon széles lesz. A probléma nem ez, hanem az, hogy az ilyen eredményeknek nincs sok értelmük – a széles konfidenciaintervallum magyarra lefordítva azt jelenti, hogy „nem igazán tudjuk hol van az érték”. Az ilyen eredményeket a fent kimentett táblázat tartalmazza, de az ábrákról érdemes lesz lehagyni őket (nem csak azért, mert nem hordoznak információt, de gyakran az ábrát magát is elrontanák, mert a széles konfidenciaintervallumok nagyon széles tartományú tengelyeket tennének szükségessé, amin meg az összes többi kórház nem fog jól látszani). Én most – némileg érzésre – azt mondtam, hogy az a túlságosan bizonytalannak minősített, és ezért az ábrán nem közölt az az eredmény, ahol az abszolút bizonytalanság (tehát a konfidenciaintervallum alsó és felső szélének a különbsége) nagyobb mint 500, vagy ahol az abszolút bizonytalanság nagyobb mint 100 úgy, hogy a relatív bizonytalanság (az abszolút bizonytalanság osztva a legjobb becsléssel) nagyobb mint 5. Jelöljük meg ezeket az eseteket:

ress$suppressed <- ((ress$uci - ress$lci) > 500) |
  (((ress$uci - ress$lci) > 100) & ((ress$uci - ress$lci)/ress$fit > 5))

CDI

Az érzékenységvizsgálat (a lenti gyorsan futó ábra természetesen csak illusztráció, az eredményt kimentjük PDF formátumban is, hogy tanulmányozható legyen):

p <- lapply(unique(ress$year), function(y)
  ggplot(merge(ress[family!="QP"&type=="CDI"&year==y&!suppressed],
               ress[formula=="zCMI"&family=="NB"&type=="CDI"&year==y&!suppressed,
                    .(KorhazNevFactor, fitorder = fit)], by = "KorhazNevFactor"),
         aes(y = forcats::fct_reorder(KorhazNevFactor, fitorder), x = fit,
             color = formula, shape = family)) +
    geom_point() + labs(x = "Incidencia [/100 ezer ápolási nap]", y = "", title = y))

cairo_pdf("ErzekenysegCDI.pdf", onefile = TRUE, width = 16, height = 9)
for(i in 1:length(p)) print(p[[i]])
invisible(dev.off())

for(i in 1:length(p)) print(p[[i]])

Az eredmény:

ggplot(merge(ress[formula=="zCMI"&family=="NB"&type=="CDI"&!suppressed],
             ress[formula=="zCMI"&family=="NB"&type=="CDI"&!suppressed&year==2015,
                  .(KorhazNevFactor, fitorder = fit)], by = "KorhazNevFactor"),
       aes(y = forcats::fct_reorder(KorhazNevFactor, fitorder),
           x = fit, xmin = lci, xmax = uci)) +
  geom_point() + geom_errorbar() + labs(x = "Incidencia [/100 ezer ápolási nap]", y = "") +
  facet_wrap(~year, scales = "free_x") +
  scale_x_continuous(limits = c(0, ceiling(max(ress[formula=="zCMI"&family=="NB"&type=="CDI"&
                                                      !suppressed]$uci))))

MRK

Az érzékenységvizsgálat (a lenti gyorsan futó ábra természetesen csak illusztráció, az eredményt kimentjük PDF formátumban is, hogy tanulmányozható legyen):

p <- lapply(unique(ress$year), function(y)
  ggplot(merge(ress[family!="QP"&type=="MRK"&year==y&!suppressed],
               ress[formula=="zCMI"&family=="NB"&type=="MRK"&year==y&!suppressed,
                    .(KorhazNevFactor, fitorder = fit)], by = "KorhazNevFactor"),
         aes(y = forcats::fct_reorder(KorhazNevFactor, fitorder), x = fit,
             color = formula, shape = family)) +
    geom_point() + labs(x = "Incidencia [/100 ezer ápolási nap]", y = "", title = y))

cairo_pdf("ErzekenysegMRK.pdf", onefile = TRUE, width = 16, height = 9)
for(i in 1:length(p)) print(p[[i]])
invisible(dev.off())

for(i in 1:length(p)) print(p[[i]])

Az eredmény:

ggplot(merge(ress[formula=="zCMI"&family=="NB"&type=="MRK"&!suppressed],
             ress[formula=="zCMI"&family=="NB"&type=="MRK"&!suppressed&year==2015,
                  .(KorhazNevFactor, fitorder = fit)], by = "KorhazNevFactor"),
       aes(y = forcats::fct_reorder(KorhazNevFactor, fitorder),
           x = fit, xmin = lci, xmax = uci)) +
  geom_point() + geom_errorbar() + labs(x = "Incidencia [/100 ezer ápolási nap]", y = "") +
  facet_wrap(~year, scales = "free_x") +
  scale_x_continuous(limits = c(0, ceiling(max(ress[formula=="zCMI"&family=="NB"&type=="MRK"&
                                                      !suppressed]$uci))))

VÁF

Az érzékenységvizsgálat (a lenti gyorsan futó ábra természetesen csak illusztráció, az eredményt kimentjük PDF formátumban is, hogy tanulmányozható legyen):

p <- lapply(unique(ress$year), function(y)
  ggplot(merge(ress[family!="QP"&type=="VAF"&year==y&!suppressed],
               ress[formula=="zCMI"&family=="NB"&type=="VAF"&year==y&!suppressed,
                    .(KorhazNevFactor, fitorder = fit)], by = "KorhazNevFactor"),
         aes(y = forcats::fct_reorder(KorhazNevFactor, fitorder), x = fit,
             color = formula, shape = family)) +
    geom_point() + labs(x = "Incidencia [/100 ezer ápolási nap]", y = "", title = y))

cairo_pdf("ErzekenysegVAF.pdf", onefile = TRUE, width = 16, height = 9)
for(i in 1:length(p)) print(p[[i]])
invisible(dev.off())

for(i in 1:length(p)) print(p[[i]])

Az eredmény:

ggplot(merge(ress[formula=="zCMI"&family=="NB"&type=="VAF"&!suppressed],
             ress[formula=="zCMI"&family=="NB"&type=="VAF"&!suppressed&year==2015,
                  .(KorhazNevFactor, fitorder = fit)], by = "KorhazNevFactor"),
       aes(y = forcats::fct_reorder(KorhazNevFactor, fitorder),
           x = fit, xmin = lci, xmax = uci)) +
  geom_point() + geom_errorbar() + labs(x = "Incidencia [/100 ezer ápolási nap]", y = "") +
  facet_wrap(~year, scales = "free_x") +
  scale_x_continuous(limits = c(0, ceiling(max(ress[formula=="zCMI"&family=="NB"&type=="VAF"&
                                                      !suppressed]$uci))))

A három típus egybevetése

Mindezek alapján össze is vethetjük az egyes kórházak eredményeit a három fertőzéstípusnál:

gpairs_lower <- function(g){
  g$plots <- g$plots[-(1:g$nrow)]
  g$yAxisLabels <- g$yAxisLabels[-1]
  g$nrow <- g$nrow -1
  
  g$plots <- g$plots[-(seq(g$ncol, length(g$plots), by = g$ncol))]
  g$xAxisLabels <- g$xAxisLabels[-g$ncol]
  g$ncol <- g$ncol - 1
  
  g
}

pairsdat <- dcast(ress[formula=="zCMI"&family=="NB"], KorhazNevFactor + year ~ type,
                  value.var = "fit")

p <- GGally::ggpairs(pairsdat[, -(1:2)], mapping = aes(color = factor(pairsdat$year)),
                     diag = "blank")
p

# gpairs_lower(p)

About

A magyar kórházi fertőzések 2015-2022. évi adatainak elemzése

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages