Questo documento presenta l’analisi statistica dei fattori prognostici associati alla neurotossicità in una coorte di 220 pazienti.
Obiettivo: Identificare quali variabili cliniche sono significativamente correlate con lo sviluppo di neurotossicità.
# Dimensioni del campione
n_totale <- 220
n_neurotox <- 41
n_non_neurotox <- 179
cat("Pazienti totali:", n_totale, "\n")
## Pazienti totali: 220
cat("Con neurotossicità:", n_neurotox, "(", round(n_neurotox/n_totale*100, 1), "%)\n")
## Con neurotossicità: 41 ( 18.6 %)
cat("Senza neurotossicità:", n_non_neurotox, "(", round(n_non_neurotox/n_totale*100, 1), "%)\n")
## Senza neurotossicità: 179 ( 81.4 %)
La prevalenza di neurotossicità nel campione è del 18.6%.
# Creare manualmente il dataset dai dati forniti
dati_raw <- data.frame(
Variabile = c("LEUCOCITOSI", "AUMENTO D-DIMERO", "EDEMA ESTESO",
"SINTOMI SISTEMICI", "SESSO MASCHILE", "SEDE ARTO SUPERIORE",
"GSS ≥ 2", "IPOTENSIONE, SHOCK"),
Neurotox_Si = c(17, 19, 23, 32, 30, 23, 37, 12),
Neurotox_No = c(27, 23, 83, 46, 128, 116, 101, 3)
)
kable(dati_raw, caption = "Dati grezzi: Frequenze assolute")
| Variabile | Neurotox_Si | Neurotox_No |
|---|---|---|
| LEUCOCITOSI | 17 | 27 |
| AUMENTO D-DIMERO | 19 | 23 |
| EDEMA ESTESO | 23 | 83 |
| SINTOMI SISTEMICI | 32 | 46 |
| SESSO MASCHILE | 30 | 128 |
| SEDE ARTO SUPERIORE | 23 | 116 |
| GSS ≥ 2 | 37 | 101 |
| IPOTENSIONE, SHOCK | 12 | 3 |
# Calcolare proporzioni percentuali
dati_raw$Prop_Neurotox <- round(dati_raw$Neurotox_Si / n_neurotox * 100, 1)
dati_raw$Prop_Non_Neurotox <- round(dati_raw$Neurotox_No / n_non_neurotox * 100, 1)
dati_raw$Differenza <- round(dati_raw$Prop_Neurotox - dati_raw$Prop_Non_Neurotox, 1)
kable(dati_raw[, c("Variabile", "Prop_Neurotox", "Prop_Non_Neurotox", "Differenza")],
caption = "Prevalenza delle variabili nei due gruppi (%)",
col.names = c("Variabile", "Con Neurotox (%)", "Senza Neurotox (%)", "Differenza (%)"))
| Variabile | Con Neurotox (%) | Senza Neurotox (%) | Differenza (%) |
|---|---|---|---|
| LEUCOCITOSI | 41.5 | 15.1 | 26.4 |
| AUMENTO D-DIMERO | 46.3 | 12.8 | 33.5 |
| EDEMA ESTESO | 56.1 | 46.4 | 9.7 |
| SINTOMI SISTEMICI | 78.0 | 25.7 | 52.3 |
| SESSO MASCHILE | 73.2 | 71.5 | 1.7 |
| SEDE ARTO SUPERIORE | 56.1 | 64.8 | -8.7 |
| GSS ≥ 2 | 90.2 | 56.4 | 33.8 |
| IPOTENSIONE, SHOCK | 29.3 | 1.7 | 27.6 |
# Funzione per calcolare statistiche
calcola_statistiche <- function(a, b, n1, n2) {
tab <- matrix(c(a, n1-a, b, n2-b), nrow = 2, byrow = TRUE)
test_fisher <- fisher.test(tab)
or <- (a * (n2-b)) / ((n1-a) * b)
log_or <- log(or)
se_log_or <- sqrt(1/a + 1/(n1-a) + 1/b + 1/(n2-b))
or_ci_low <- exp(log_or - 1.96 * se_log_or)
or_ci_high <- exp(log_or + 1.96 * se_log_or)
return(list(
p_fisher = test_fisher$p.value,
odds_ratio = or,
or_ci_low = or_ci_low,
or_ci_high = or_ci_high
))
}
# Applicare a tutte le variabili
stats <- lapply(1:nrow(dati_raw), function(i) {
calcola_statistiche(
dati_raw$Neurotox_Si[i],
dati_raw$Neurotox_No[i],
n_neurotox,
n_non_neurotox
)
})
# Creare dataframe risultati
risultati <- data.frame(
Variabile = dati_raw$Variabile,
N_Neurotox = dati_raw$Neurotox_Si,
Prev_Neurotox = dati_raw$Prop_Neurotox,
N_Non_Neurotox = dati_raw$Neurotox_No,
Prev_Non_Neurotox = dati_raw$Prop_Non_Neurotox,
Odds_Ratio = round(sapply(stats, function(x) x$odds_ratio), 2),
OR_CI_Low = round(sapply(stats, function(x) x$or_ci_low), 2),
OR_CI_High = round(sapply(stats, function(x) x$or_ci_high), 2),
p_value = round(sapply(stats, function(x) x$p_fisher), 4)
)
# Aggiungere significatività
risultati$Significatività <- ifelse(risultati$p_value < 0.001, "***",
ifelse(risultati$p_value < 0.01, "**",
ifelse(risultati$p_value < 0.05, "*", "ns")))
# Ordinare per p-value
risultati <- risultati[order(risultati$p_value), ]
kable(risultati,
caption = "Risultati dell'analisi univariata",
col.names = c("Variabile", "N (Neuro)", "% (Neuro)", "N (No Neuro)",
"% (No Neuro)", "OR", "IC 95% inf", "IC 95% sup", "p-value", "Sig."))
| Variabile | N (Neuro) | % (Neuro) | N (No Neuro) | % (No Neuro) | OR | IC 95% inf | IC 95% sup | p-value | Sig. | |
|---|---|---|---|---|---|---|---|---|---|---|
| 2 | AUMENTO D-DIMERO | 19 | 46.3 | 23 | 12.8 | 5.86 | 2.76 | 12.45 | 0.0000 | *** |
| 4 | SINTOMI SISTEMICI | 32 | 78.0 | 46 | 25.7 | 10.28 | 4.56 | 23.15 | 0.0000 | *** |
| 7 | GSS ≥ 2 | 37 | 90.2 | 101 | 56.4 | 7.14 | 2.44 | 20.89 | 0.0000 | *** |
| 8 | IPOTENSIONE, SHOCK | 12 | 29.3 | 3 | 1.7 | 24.28 | 6.45 | 91.31 | 0.0000 | *** |
| 1 | LEUCOCITOSI | 17 | 41.5 | 27 | 15.1 | 3.99 | 1.89 | 8.39 | 0.0004 | *** |
| 3 | EDEMA ESTESO | 23 | 56.1 | 83 | 46.4 | 1.48 | 0.75 | 2.93 | 0.3003 | ns |
| 6 | SEDE ARTO SUPERIORE | 23 | 56.1 | 116 | 64.8 | 0.69 | 0.35 | 1.38 | 0.3695 | ns |
| 5 | SESSO MASCHILE | 30 | 73.2 | 128 | 71.5 | 1.09 | 0.51 | 2.33 | 1.0000 | ns |
Legenda significatività:
*** p < 0.001 (altamente significativo)** p < 0.01 (molto significativo)* p < 0.05 (significativo)ns non significativofattori_sig <- risultati[risultati$p_value < 0.05, ]
kable(fattori_sig[, c("Variabile", "Odds_Ratio", "OR_CI_Low", "OR_CI_High", "p_value")],
caption = "Fattori di rischio statisticamente significativi (p < 0.05)",
row.names = FALSE)
| Variabile | Odds_Ratio | OR_CI_Low | OR_CI_High | p_value |
|---|---|---|---|---|
| AUMENTO D-DIMERO | 5.86 | 2.76 | 12.45 | 0e+00 |
| SINTOMI SISTEMICI | 10.28 | 4.56 | 23.15 | 0e+00 |
| GSS ≥ 2 | 7.14 | 2.44 | 20.89 | 0e+00 |
| IPOTENSIONE, SHOCK | 24.28 | 6.45 | 91.31 | 0e+00 |
| LEUCOCITOSI | 3.99 | 1.89 | 8.39 | 4e-04 |
for(i in 1:nrow(fattori_sig)) {
var <- fattori_sig$Variabile[i]
or <- fattori_sig$Odds_Ratio[i]
ic_low <- fattori_sig$OR_CI_Low[i]
ic_high <- fattori_sig$OR_CI_High[i]
p <- fattori_sig$p_value[i]
prev_neuro <- fattori_sig$Prev_Neurotox[i]
prev_no <- fattori_sig$Prev_Non_Neurotox[i]
cat("\n#### ", var, "\n\n")
cat("- **Prevalenza**: ", prev_neuro, "% (con neurotox) vs ", prev_no, "% (senza neurotox)\n")
cat("- **Odds Ratio**: ", or, " (IC 95%: ", ic_low, "-", ic_high, ")\n")
cat("- **p-value**: ", p, "\n")
cat("- **Interpretazione**: I pazienti con ", tolower(var), " hanno **",
round(or, 1), " volte** maggiori probabilità di sviluppare neurotossicità rispetto a chi non presenta questa caratteristica.\n\n")
}
# Preparare dati per il grafico
risultati$Variabile_ord <- factor(risultati$Variabile,
levels = rev(risultati$Variabile))
# Creare forest plot
ggplot(risultati, aes(x = Odds_Ratio, y = Variabile_ord)) +
geom_vline(xintercept = 1, linetype = "dashed", color = "red", size = 0.8) +
geom_errorbarh(aes(xmin = OR_CI_Low, xmax = OR_CI_High,
color = Significatività), height = 0.3, size = 1) +
geom_point(aes(color = Significatività), size = 4) +
scale_color_manual(values = c("***" = "#d62728", "**" = "#ff7f0e",
"*" = "#2ca02c", "ns" = "gray60")) +
scale_x_log10(breaks = c(0.1, 0.5, 1, 2, 5, 10, 20, 30)) +
labs(title = "Forest Plot: Odds Ratio per Neurotossicità",
subtitle = "Con Intervalli di Confidenza al 95%",
x = "Odds Ratio (scala logaritmica)",
y = "",
color = "Significatività statistica") +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 16),
plot.subtitle = element_text(size = 12, color = "gray40"),
legend.position = "bottom",
panel.grid.major.y = element_line(color = "gray90"),
panel.grid.minor = element_blank()
) +
annotate("text", x = 0.15, y = 0.5, label = "Protettivo",
color = "blue", size = 3.5, fontface = "italic") +
annotate("text", x = 20, y = 0.5, label = "Rischio",
color = "red", size = 3.5, fontface = "italic")
La linea rossa verticale rappresenta OR = 1 (nessun effetto). I valori a destra indicano fattori di rischio, quelli a sinistra fattori protettivi.
# Preparare dati per grafico a barre
dati_long <- data.frame(
Variabile = rep(risultati$Variabile, 2),
Gruppo = rep(c("Con Neurotossicità", "Senza Neurotossicità"), each = nrow(risultati)),
Prevalenza = c(risultati$Prev_Neurotox, risultati$Prev_Non_Neurotox)
)
# Riordinare per differenza
ordine <- risultati$Variabile[order(risultati$Prev_Neurotox - risultati$Prev_Non_Neurotox,
decreasing = TRUE)]
dati_long$Variabile <- factor(dati_long$Variabile, levels = ordine)
ggplot(dati_long, aes(x = Variabile, y = Prevalenza, fill = Gruppo)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("Con Neurotossicità" = "#d62728",
"Senza Neurotossicità" = "#1f77b4")) +
coord_flip() +
labs(title = "Confronto delle Prevalenze tra i Due Gruppi",
x = "",
y = "Prevalenza (%)",
fill = "") +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 16),
legend.position = "bottom",
panel.grid.major.y = element_blank()
) +
geom_text(aes(label = paste0(Prevalenza, "%")),
position = position_dodge(width = 0.9),
hjust = -0.1, size = 3)
top3 <- head(risultati[risultati$Odds_Ratio > 1, ], 3)
kable(top3[, c("Variabile", "Odds_Ratio", "p_value")],
caption = "I 3 fattori di rischio più forti per neurotossicità",
row.names = FALSE,
col.names = c("Variabile", "Odds Ratio", "p-value"))
| Variabile | Odds Ratio | p-value |
|---|---|---|
| AUMENTO D-DIMERO | 5.86 | 0 |
| SINTOMI SISTEMICI | 10.28 | 0 |
| GSS ≥ 2 | 7.14 | 0 |
cat("\n### Fattori Fortemente Associati a Neurotossicità:\n\n")
fattori_forti <- risultati[risultati$p_value < 0.01 & risultati$Odds_Ratio > 1, ]
for(i in 1:nrow(fattori_forti)) {
cat(i, ". **", fattori_forti$Variabile[i], "** (OR = ",
fattori_forti$Odds_Ratio[i], ", p ",
ifelse(fattori_forti$p_value[i] < 0.001, "< 0.001",
paste("=", fattori_forti$p_value[i])), ")\n")
}
1 . ** AUMENTO D-DIMERO ** (OR = 5.86 , p < 0.001 ) 2 . ** SINTOMI SISTEMICI ** (OR = 10.28 , p < 0.001 ) 3 . ** GSS ≥ 2 ** (OR = 7.14 , p < 0.001 ) 4 . ** IPOTENSIONE, SHOCK ** (OR = 24.28 , p < 0.001 ) 5 . ** LEUCOCITOSI ** (OR = 3.99 , p < 0.001 )
cat("\n### Interpretazione Complessiva:\n\n")
cat("L'analisi univariata ha identificato ", nrow(fattori_sig),
" variabili significativamente associate alla neurotossicità.\n\n")
L’analisi univariata ha identificato 5 variabili significativamente associate alla neurotossicità.
if(nrow(fattori_forti) > 0) {
cat("I fattori più fortemente predittivi sono:\n\n")
for(i in 1:min(3, nrow(fattori_forti))) {
cat("- **", fattori_forti$Variabile[i], "**: aumenta il rischio di ",
round((fattori_forti$Odds_Ratio[i] - 1) * 100, 0), "%\n")
}
}
I fattori più fortemente predittivi sono:
cat("\n### Raccomandazioni:\n\n")
cat("1. Monitorare attentamente i pazienti con i fattori di rischio identificati\n")
cat("2. Considerare strategie preventive per i pazienti ad alto rischio\n")
cat("3. Valutare analisi multivariata per identificare predittori indipendenti\n")
Per un’analisi più robusta, si raccomanda:
sessionInfo()
## R version 4.4.1 (2024-06-14)
## Platform: x86_64-apple-darwin20
## Running under: macOS 15.7.1
##
## 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] knitr_1.50 ggplot2_4.0.0 dplyr_1.1.4
##
## loaded via a namespace (and not attached):
## [1] vctrs_0.6.5 cli_3.6.5 rlang_1.1.6 xfun_0.53
## [5] generics_0.1.4 S7_0.2.0 jsonlite_2.0.0 labeling_0.4.3
## [9] glue_1.8.0 htmltools_0.5.8.1 sass_0.4.10 scales_1.4.0
## [13] rmarkdown_2.29 grid_4.4.1 evaluate_1.0.5 jquerylib_0.1.4
## [17] tibble_3.3.0 fastmap_1.2.0 yaml_2.3.10 lifecycle_1.0.4
## [21] compiler_4.4.1 RColorBrewer_1.1-3 pkgconfig_2.0.3 rstudioapi_0.17.1
## [25] farver_2.1.2 digest_0.6.37 R6_2.6.1 tidyselect_1.2.1
## [29] pillar_1.11.1 magrittr_2.0.4 bslib_0.9.0 withr_3.0.2
## [33] gtable_0.3.6 tools_4.4.1 cachem_1.1.0
Data analisi: 2025-11-11
Versione R: R version 4.4.1 (2024-06-14)