Questo documento presenta un’analisi completa dei fattori prognostici associati al GSS (Grading Severity Score) nei pazienti con envenomation. L’obiettivo è identificare quali fattori clinici e di laboratorio predicono la gravità della condizione, classificata in tre livelli: GSS 1 (lieve), GSS 2 (moderato) e GSS 3 (severo).
Basandosi sui dati clinici raccolti, ricostruiamo il dataset aggregato per i tre livelli di GSS.
# Creazione manuale del dataframe basato sui dati clinici
df_gss <- data.frame(
Fattore = c("Casi (N)", "Età media", "Maschi (%)", "Femmine (%)",
"Leucocitosi (%)", "INR alterato (%)", "D-Dimero alterato (%)",
"Edema esteso (%)", "Neurotossicità (%)", "Sintomi sistemici (%)"),
GSS_1 = c(10, 50.3, 100, 0, 30, 0, 90, 30, 0, 0),
GSS_2 = c(54, 47.6, 72.2, 27.8, 46.3, 1, 77.8, 79.6, 29.6, 53.7),
GSS_3 = c(25, 45.5, 68, 32, 64, 1, 84, 76, 44, 100)
)
# Visualizzazione tabella grezza
kable(df_gss,
caption = "Tabella 1: Distribuzione dei fattori prognostici per stadio GSS",
col.names = c("Fattore", "GSS 1 (Lieve)", "GSS 2 (Moderato)", "GSS 3 (Severo)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE) %>%
row_spec(0, bold = TRUE, background = "#3498db", color = "white")
| Fattore | GSS 1 (Lieve) | GSS 2 (Moderato) | GSS 3 (Severo) |
|---|---|---|---|
| Casi (N) | 10.0 | 54.0 | 25.0 |
| Età media | 50.3 | 47.6 | 45.5 |
| Maschi (%) | 100.0 | 72.2 | 68.0 |
| Femmine (%) | 0.0 | 27.8 | 32.0 |
| Leucocitosi (%) | 30.0 | 46.3 | 64.0 |
| INR alterato (%) | 0.0 | 1.0 | 1.0 |
| D-Dimero alterato (%) | 90.0 | 77.8 | 84.0 |
| Edema esteso (%) | 30.0 | 79.6 | 76.0 |
| Neurotossicità (%) | 0.0 | 29.6 | 44.0 |
| Sintomi sistemici (%) | 0.0 | 53.7 | 100.0 |
Osservazione iniziale: Il dataset comprende 89 pazienti totali (10 GSS 1, 54 GSS 2, 25 GSS 3), con prevalenza di forme moderate.
Dalla tabella dei fattori prognostici, emergono i seguenti driver di gravità:
Isoliamo i fattori clinici percentuali per vedere come cambiano all’aumentare della gravità.
# Preparazione dati per il grafico (Tidy format)
factors_to_plot <- c("Leucocitosi (%)", "Edema esteso (%)",
"Neurotossicità (%)", "Sintomi sistemici (%)", "D-Dimero alterato (%)")
df_plot <- df_gss %>%
filter(Fattore %in% factors_to_plot) %>%
pivot_longer(cols = c("GSS_1", "GSS_2", "GSS_3"),
names_to = "GSS_Level",
values_to = "Percentuale")
# Ordiniamo i livelli del GSS
df_plot$GSS_Level <- factor(df_plot$GSS_Level,
levels = c("GSS_1", "GSS_2", "GSS_3"),
labels = c("GSS 1 (Lieve)", "GSS 2 (Moderato)", "GSS 3 (Severo)"))
# Grafico con miglioramenti estetici
ggplot(df_plot, aes(x = GSS_Level, y = Percentuale, group = Fattore, color = Fattore)) +
geom_line(size = 1.3, alpha = 0.8) +
geom_point(size = 4, alpha = 0.9) +
theme_minimal(base_size = 12) +
scale_color_brewer(palette = "Set1") +
labs(title = "Andamento dei Fattori Clinici all'aumentare del GSS",
subtitle = "Evidenza del trend di gravità crescente",
y = "Prevalenza del fattore (%)",
x = "Livello di Gravità (GSS)",
color = "Fattore Clinico") +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold", size = 14),
panel.grid.major = element_line(color = "gray90"),
panel.grid.minor = element_blank()) +
scale_y_continuous(breaks = seq(0, 100, 20), limits = c(0, 105))
Commento al Grafico: Si nota chiaramente come Sintomi sistemici, Neurotossicità e Leucocitosi abbiano un trend positivo ripido (aumentano col GSS). L’Edema esteso fa un salto notevole tra GSS 1 e GSS 2. Il D-Dimero rimane elevato e stabile in tutti i gruppi.
Questa è l’analisi più avanzata. Invece di chiedere “Quanti pazienti GSS 3 hanno la leucocitosi?”, calcoliamo: “Se un paziente ha la leucocitosi, qual è la sua probabilità di essere GSS 3 rispetto a chi non ce l’ha?”
Definiamo una funzione per calcolare:
# Funzione per calcolare il rischio
calculate_risk <- function(factor_name, pct1, pct2, pct3) {
# Numerosità dei gruppi
n1 <- 10 # GSS 1
n2 <- 54 # GSS 2
n3 <- 25 # GSS 3
# Calcolo numero di pazienti con il fattore per ogni gruppo
n_w_factor_1 <- (pct1/100) * n1
n_w_factor_2 <- (pct2/100) * n2
n_w_factor_3 <- (pct3/100) * n3
total_with_factor <- n_w_factor_1 + n_w_factor_2 + n_w_factor_3
total_without_factor <- 89 - total_with_factor
# Rischio di essere GSS 3 dato il fattore: P(GSS3 | Factor)
risk_if_present <- ifelse(total_with_factor > 0,
(n_w_factor_3 / total_with_factor) * 100,
NA)
# Rischio di essere GSS 3 dato che NON hai il fattore
n_gss3_without <- n3 - n_w_factor_3
risk_if_absent <- ifelse(total_without_factor > 0,
(n_gss3_without / total_without_factor) * 100,
NA)
# Risk Ratio (Di quanto aumenta il rischio)
risk_ratio <- ifelse(!is.na(risk_if_absent) & risk_if_absent > 0,
risk_if_present / risk_if_absent,
Inf)
return(data.frame(
Fattore = factor_name,
Prob_GSS3_se_Presente = round(risk_if_present, 1),
Prob_GSS3_se_Assente = round(risk_if_absent, 1),
Aumento_Rischio_Volte = round(risk_ratio, 2)
))
}
# Applicazione ai fattori chiave
rischi <- rbind(
calculate_risk("Sintomi Sistemici", 0, 53.7, 100),
calculate_risk("Neurotossicità", 0, 29.6, 44),
calculate_risk("Leucocitosi", 30, 46.3, 64),
calculate_risk("Edema Esteso", 30, 79.6, 76),
calculate_risk("D-Dimero Alterato", 90, 77.8, 84)
)
kable(rischi,
caption = "Tabella 2: Impatto dei fattori sulla probabilità di GSS 3 (Severo)",
col.names = c("Fattore Prognostico",
"Prob. GSS 3 se Presente (%)",
"Prob. GSS 3 se Assente (%)",
"Risk Ratio")) %>%
kable_styling(bootstrap_options = c("bordered", "striped"), full_width = FALSE) %>%
row_spec(0, bold = TRUE, background = "#e74c3c", color = "white") %>%
row_spec(which(rischi$Aumento_Rischio_Volte == Inf), background = "#fff3cd")
| Fattore Prognostico | Prob. GSS 3 se Presente (%) | Prob. GSS 3 se Assente (%) | Risk Ratio |
|---|---|---|---|
| Sintomi Sistemici | 46.3 | 0.0 | Inf |
| Neurotossicità | 40.8 | 22.6 | 1.81 |
| Leucocitosi | 36.4 | 20.0 | 1.82 |
| Edema Esteso | 29.2 | 25.0 | 1.17 |
| D-Dimero Alterato | 29.2 | 23.5 | 1.24 |
Conclusione: L’aumento è “Inf” perché nessun paziente senza sintomi sistemici era nel gruppo GSS 3. È il marker più specifico di gravità severa.
Conclusione: La neurotossicità raddoppia quasi il rischio di essere in GSS 3.
Conclusione: La leucocitosi aumenta il rischio di circa 1.8 volte. È un marker infiammatorio sistemico correlato alla gravità.
Conclusione: Sebbene l’edema esteso sia molto comune nei casi gravi (76%), è molto comune anche nel GSS 2 (79.6%). Pertanto, da solo, non distingue fortemente tra il grado 2 e 3, ma distingue molto bene tra grado 1 e gradi superiori.
Conclusione: Sorprendentemente, il D-Dimero alterato non aumenta il rischio di GSS 3. È un marker di attivazione coagulativa generale (presente nel 90% dei GSS 1), ma non è un predittore di gravità severa in questa coorte.
# Filtriamo i valori infiniti per il grafico
rischi_plot <- rischi %>%
filter(Aumento_Rischio_Volte != Inf)
ggplot(rischi_plot, aes(x = reorder(Fattore, Aumento_Rischio_Volte),
y = Aumento_Rischio_Volte,
fill = Aumento_Rischio_Volte)) +
geom_col(width = 0.7, alpha = 0.9) +
geom_hline(yintercept = 1, linetype = "dashed", color = "red", size = 1) +
geom_text(aes(label = paste0(Aumento_Rischio_Volte, "x")),
hjust = -0.2, size = 4, fontface = "bold") +
coord_flip() +
scale_fill_gradient(low = "#3498db", high = "#e74c3c", guide = "none") +
theme_minimal(base_size = 12) +
labs(title = "Risk Ratio: Aumento del Rischio di GSS 3 per Fattore",
subtitle = "Linea rossa = nessun aumento (RR = 1)",
x = "Fattore Prognostico",
y = "Risk Ratio (volte di aumento del rischio)") +
theme(plot.title = element_text(face = "bold", size = 14),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank()) +
ylim(0, max(rischi_plot$Aumento_Rischio_Volte) + 0.3)
Nota: I “Sintomi Sistemici” non sono mostrati nel grafico perché hanno un Risk Ratio infinito (assenti in GSS 1 e 2, presenti al 100% in GSS 3).
In ordine di importanza per predire il GSS 3:
Basandosi sui dati, si potrebbe costruire un sistema di allerta precoce con i seguenti criteri:
| Fattore | Punti |
|---|---|
| Sintomi sistemici presenti | +5 |
| Neurotossicità | +2 |
| Leucocitosi | +2 |
| Edema esteso | +1 |
sessionInfo()
## R version 4.4.1 (2024-06-14)
## Platform: x86_64-apple-darwin20
## Running under: macOS 15.7.2
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/4.4-x86_64/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.4-x86_64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.0
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## time zone: Europe/Rome
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] kableExtra_1.4.0 knitr_1.50 tidyr_1.3.1 ggplot2_4.0.0
## [5] dplyr_1.1.4
##
## loaded via a namespace (and not attached):
## [1] gtable_0.3.6 jsonlite_2.0.0 compiler_4.4.1 tidyselect_1.2.1
## [5] xml2_1.5.0 stringr_1.5.2 jquerylib_0.1.4 textshaping_1.0.4
## [9] systemfonts_1.3.1 scales_1.4.0 yaml_2.3.10 fastmap_1.2.0
## [13] R6_2.6.1 labeling_0.4.3 generics_0.1.4 tibble_3.3.0
## [17] svglite_2.2.2 bslib_0.9.0 pillar_1.11.1 RColorBrewer_1.1-3
## [21] rlang_1.1.6 cachem_1.1.0 stringi_1.8.7 xfun_0.53
## [25] sass_0.4.10 S7_0.2.0 viridisLite_0.4.2 cli_3.6.5
## [29] withr_3.0.2 magrittr_2.0.4 digest_0.6.37 grid_4.4.1
## [33] rstudioapi_0.17.1 lifecycle_1.0.4 vctrs_0.6.5 evaluate_1.0.5
## [37] glue_1.8.0 farver_2.1.2 rmarkdown_2.29 purrr_1.1.0
## [41] tools_4.4.1 pkgconfig_2.0.3 htmltools_0.5.8.1
Fine del Report