Lavoro nell'IT sanitario, rivedendo i processi di gestione dei dati di vari studi osservazionali. Un problema che ho più volte affrontato sono i dati scarsamente codificati, specialmente quando mancano alcuni valori.
Sfondo, salta se vuoi
Attualmente sto esaminando uno studio che raccoglie dati su pazienti affetti da una specifica malattia. I pazienti di solito entrano nello studio una volta confermata la malattia (alcuni mesi dopo l'epidemia). Uno dei parametri importanti è il risultato di un determinato esame del sangue nella fase acuta della malattia, vale a dire si spera il più vicino possibile al focolaio. A volte, tuttavia, quel test non è stato eseguito perché non c'era alcuna indicazione o il paziente si è dimenticato di portare una copia del risultato, ecc.
Un aspetto importante qui è che tutti i dati nel DB sono generati da (tonnellate di file di carta non ordinati) e spesso le persone non hanno il tempo di sfogliare tutto, quindi non entrano nel risultato del test del sangue perché non hanno ancora ottenuto .
Per "in qualche modo" codificare i motivi per cui un valore è assente, ho visto vari schemi:
-
Utilizza un campo TEXT (3) per i booleani e usa
n/a
per esprimere che "i dati non sono realmente disponibili" (ad esempio perché il test del sangue non è stato eseguito) eNULL
per esprimere "Forse i dati sono da qualche parte, non li ho ancora cercati". -
Utilizza un campo aggiuntivo nella stessa tabella , ad es. un campo booleano "bloodtest_perf" dove "perf" sta per "effettivamente eseguito".
Non mi piace il primo approccio perché consente di inserire "sì", "y", "ja", "SÌ", ecc. e si finisce per passare la maggior parte del tempo a pulire anziché analizzare i dati. Anche il secondo approccio non è molto meglio, perché si finisce con dati fittizi al meglio e dati inconsistenti nel peggiore dei casi:
__ TBL_TEST1 __________________________________
| patID | test1_perf | test1_date | test1_res |
+---------------------------------------------+
| 12345 | no | NULL | NULL |
| 12345 | yes | 2011-05-13 | 20.0 |
+---------------------------------------------+
La soluzione migliore che potrei inventare è creare un TBL_TEST1_METADATA
che contenga una voce iff test1
non sia stata eseguita, che poi specifica perché no, ma i clinici (con rudimentale MS -Accesso alla conoscenza) sono alle prese con questo approccio di normalizzazione.
Che cos'è una soluzione pragmatica ma efficace per questo problema?