Introduzione

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).


1. Importazione e Ricostruzione Dati

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")
Tabella 1: Distribuzione dei fattori prognostici per stadio GSS
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.


2. Analisi Descrittiva dei Fattori Prognostici

2.1 Sintesi Narrativa

Dalla tabella dei fattori prognostici, emergono i seguenti driver di gravità:

🔴 Sintomi Sistemici (Il fattore più forte)

  • GSS 1: 0% → GSS 3: 100%
  • Interpretazione: La presenza di sintomi sistemici è quasi esclusiva delle forme gravi. È il predittore più netto di severità.

🟠 Edema Esteso

  • GSS 1: 30% → GSS 3: 76%
  • Interpretazione: Avere un edema esteso più che raddoppia la probabilità di trovarsi in una classe di gravità alta. Il salto più significativo è tra GSS 1 e GSS 2 (da 30% a 79.6%).

🟡 Leucocitosi

  • GSS 1: 30% → GSS 3: 64%
  • Interpretazione: C’è un trend lineare positivo. Più alti sono i globuli bianchi, maggiore è la gravità (probabile correlazione con l’infiammazione sistemica).

🟢 Neurotossicità

  • GSS 1: 0% → GSS 3: 44%
  • Interpretazione: L’assenza di neurotossicità è tipica delle forme lievi, mentre compare significativamente nelle forme severe.

D-Dimero

  • GSS 1: 90% → GSS 3: 84%
  • Interpretazione: Curiosamente, il D-Dimero è alto in tutti i gruppi, addirittura leggermente più alto nel GSS 1. Questo suggerisce che il D-Dimero è un marcatore di avvenuto morso/envenomation ma, in questo specifico dataset, non discrimina bene tra gravità lieve e severa (bassa specificità prognostica per il GSS 3).

👤 Età

  • Osservazione controintuitiva: L’età media diminuisce lievemente con la gravità (50.3 anni nel GSS 1 vs 45.5 nel GSS 3). Questo dato meriterebbe approfondimento (forse i più giovani hanno reazioni immunitarie più violente o sono esposti a morsi più gravi per attività lavorative/ricreative).

2.2 Visualizzazione del Trend

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.


3. Calcolo del Rischio Relativo

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?”

3.1 Metodologia

Definiamo una funzione per calcolare:

  • P(GSS 3 | Fattore presente): Probabilità di essere severo se hai il fattore
  • P(GSS 3 | Fattore assente): Probabilità di essere severo se NON hai il fattore
  • Risk Ratio: Quanto aumenta il rischio (rapporto tra le due probabilità)
# 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")
Tabella 2: Impatto dei fattori sulla probabilità di GSS 3 (Severo)
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

3.2 Interpretazione Clinica della Tabella dei Rischi

🔴 Sintomi Sistemici

  • Se presente: 46.3% di probabilità di essere GSS 3
  • Se assente: 0%
  • Risk Ratio: ∞ (infinito, matematicamente)

Conclusione: L’aumento è “Inf” perché nessun paziente senza sintomi sistemici era nel gruppo GSS 3. È il marker più specifico di gravità severa.


🟠 Neurotossicità

  • Se presente: 40.7% di probabilità di essere GSS 3
  • Se assente: 22.6%
  • Risk Ratio: ~1.8x

Conclusione: La neurotossicità raddoppia quasi il rischio di essere in GSS 3.


🟡 Leucocitosi

  • Se presente: 36.4% di probabilità di essere GSS 3
  • Se assente: 20.0%
  • Risk Ratio: ~1.8x

Conclusione: La leucocitosi aumenta il rischio di circa 1.8 volte. È un marker infiammatorio sistemico correlato alla gravità.


🟢 Edema Esteso

  • Se presente: 29.7% di probabilità di essere GSS 3
  • Se assente: 24.0%
  • Risk Ratio: ~1.2x

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.


D-Dimero Alterato

  • Se presente: 27.6% di probabilità di essere GSS 3
  • Se assente: 33.3%
  • Risk Ratio: ~0.8x

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.


4. Visualizzazione Comparativa dei Risk Ratio

# 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).


5. Conclusioni e Raccomandazioni Cliniche

5.1 Gerarchia dei Fattori Prognostici

In ordine di importanza per predire il GSS 3:

  1. Sintomi Sistemici ⭐⭐⭐⭐⭐ → Marker definitivo (100% di sensibilità per GSS 3)
  2. Neurotossicità ⭐⭐⭐⭐ → Raddoppia il rischio
  3. Leucocitosi ⭐⭐⭐⭐ → Raddoppia il rischio, marker infiammatorio
  4. Edema Esteso ⭐⭐⭐ → Importante per distinguere GSS 1 da GSS 2-3
  5. D-Dimero Alterato ⭐ → Non discriminante per gravità

5.2 Score Prognostico Proposto

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
  • 0-2 punti: Rischio basso (GSS 1-2 probabile)
  • 3-5 punti: Rischio moderato (GSS 2-3)
  • ≥6 punti: Rischio alto (GSS 3 molto probabile)

5.3 Aspetti da Approfondire

  1. Età paradossale: Perché i pazienti più giovani hanno forme più gravi? Necessita di analisi multivariata.
  2. D-Dimero: Perché è così alto anche nei casi lievi? Possibile confondimento da altre comorbidità.
  3. Validazione esterna: Il modello richiede verifica su una coorte indipendente.

6. Informazioni Tecniche

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