here::here("code", "_common.R") |>
source()
# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(cmdstanr, posterior, brms, bayestestR, insight)
66 Stima bayesiana della grandezza dell’effetto
66.1 Introduzione
Nel capitolo precedente abbiamo affrontato il problema del confronto tra due gruppi, stimando la differenza tra i punteggi di QI nei figli di madri con o senza diploma. Abbiamo visto come il paradigma bayesiano consenta di formulare inferenze probabilistiche su tale differenza, restituendo una distribuzione a posteriori che riflette l’incertezza residua dopo aver osservato i dati.
In questo capitolo approfondiamo un aspetto cruciale dell’inferenza psicologica: la valutazione della rilevanza pratica di un effetto. Non ci interessa solo se la differenza esiste, ma se è sufficientemente ampia da essere considerata sostanziale nel contesto della ricerca. È qui che entra in gioco la nozione di grandezza dell’effetto (effect size), che fornisce un’unità comparabile per esprimere l’intensità di una relazione o la magnitudine di una differenza.
66.2 Standardizzare la differenza: Cohen’s d
Nel confronto tra due gruppi, una misura diffusa della grandezza dell’effetto è Cohen’s d, che standardizza la differenza tra le medie rispetto alla variabilità osservata:
\[ d = \frac{\mu_1 - \mu_2}{\sigma}, \]
dove \(\mu_1\) e \(\mu_2\) sono le medie dei due gruppi e \(\sigma\) è una stima comune della deviazione standard. In ambito bayesiano, possiamo calcolare questa quantità per ciascun campione a posteriori, ottenendo così una distribuzione intera di valori plausibili per Cohen’s d, non un valore unico.
66.3 Calcolo di Cohen’s d con brms
Partiamo dal modello già stimato nel capitolo precedente:
Estraiamo i campioni a posteriori della differenza tra gruppi (b_mom_hs
) e della deviazione standard residua:
post <- as_draws_df(fit_1)
d_samples <- post$b_mom_hs / post$sigma
66.3.1 Visualizzazione dell’incertezza
66.3.2 Statistiche riassuntive
bayestestR::describe_posterior(d_samples, ci = 0.89)
#> Summary of Posterior Distribution
#>
#> Parameter | Median | 89% CI | pd | ROPE | % in ROPE
#> --------------------------------------------------------------------
#> Posterior | 0.59 | [0.41, 0.78] | 100% | [-0.10, 0.10] | 0%
Otteniamo così non solo la stima puntuale dell’effetto, ma anche:
- l’ampiezza dell’intervallo di credibilità,
- la simmetria o asimmetria della distribuzione,
- la probabilità che l’effetto sia positivo, o superi soglie rilevanti.
66.4 Interpretare la grandezza dell’effetto
Secondo convenzioni psicometriche, i valori di d si interpretano come segue:
Valore di d | Descrizione qualitativa |
---|---|
≈ 0.2 | Effetto piccolo |
≈ 0.5 | Effetto medio |
≥ 0.8 | Effetto grande |
Tuttavia, l’approccio bayesiano consente di andare oltre queste soglie arbitrarie. Possiamo calcolare, ad esempio:
Queste quantità rispondono a domande come:
Qual è la probabilità che la differenza osservata tra i gruppi sia sostanziale, non solo statisticamente distinguibile da zero?
66.5 Riflessioni conclusive
L’effetto di una variabile indipendente non va soltanto rilevato: va quantificato. Cohen’s d, in ambito bayesiano, diventa uno strumento potente perché viene trattato come variabile aleatoria. Invece di fornire un numero fisso, fornisce una gamma di valori plausibili, con le relative probabilità. Questo ci consente di:
- rappresentare l’incertezza sulla grandezza dell’effetto in modo diretto e continuo,
- formulare ipotesi probabilistiche (es. “c’è il 90% di probabilità che l’effetto sia almeno medio”),
- comunicare risultati con maggiore trasparenza, evitando interpretazioni binarie.
In un contesto come quello psicologico, dove la variabilità è la regola e non l’eccezione, parlare in termini di distribuzioni anziché di soglie fisse significa rispettare la complessità del fenomeno studiato. E soprattutto, significa ancorare l’inferenza non solo ai dati osservati, ma alla struttura dell’incertezza che li accompagna.
Informazioni sull’Ambiente di Sviluppo
sessionInfo()
#> R version 4.5.0 (2025-04-11)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sequoia 15.5
#>
#> Matrix products: default
#> BLAS: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
#>
#> locale:
#> [1] C/UTF-8/C/C/C/C
#>
#> time zone: Europe/Rome
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] insight_1.3.0 bayestestR_0.16.0 brms_2.22.0 Rcpp_1.0.14
#> [5] posterior_1.6.1 cmdstanr_0.9.0 thematic_0.1.6 MetBrewer_0.2.0
#> [9] ggokabeito_0.1.0 see_0.11.0 gridExtra_2.3 patchwork_1.3.0
#> [13] bayesplot_1.12.0 psych_2.5.3 scales_1.4.0 markdown_2.0
#> [17] knitr_1.50 lubridate_1.9.4 forcats_1.0.0 stringr_1.5.1
#> [21] dplyr_1.1.4 purrr_1.0.4 readr_2.1.5 tidyr_1.3.1
#> [25] tibble_3.2.1 ggplot2_3.5.2 tidyverse_2.0.0 rio_1.2.3
#> [29] here_1.0.1
#>
#> loaded via a namespace (and not attached):
#> [1] tidyselect_1.2.1 farver_2.1.2 loo_2.8.0
#> [4] R.utils_2.13.0 fastmap_1.2.0 tensorA_0.36.2.1
#> [7] pacman_0.5.1 digest_0.6.37 timechange_0.3.0
#> [10] estimability_1.5.1 lifecycle_1.0.4 StanHeaders_2.32.10
#> [13] processx_3.8.6 magrittr_2.0.3 compiler_4.5.0
#> [16] rlang_1.1.6 tools_4.5.0 yaml_2.3.10
#> [19] data.table_1.17.2 labeling_0.4.3 bridgesampling_1.1-2
#> [22] htmlwidgets_1.6.4 curl_6.2.2 pkgbuild_1.4.7
#> [25] mnormt_2.1.1 plyr_1.8.9 RColorBrewer_1.1-3
#> [28] abind_1.4-8 withr_3.0.2 R.oo_1.27.1
#> [31] datawizard_1.1.0 stats4_4.5.0 grid_4.5.0
#> [34] colorspace_2.1-1 inline_0.3.21 xtable_1.8-4
#> [37] ggridges_0.5.6 emmeans_1.11.1 cli_3.6.5
#> [40] mvtnorm_1.3-3 rmarkdown_2.29 generics_0.1.4
#> [43] RcppParallel_5.1.10 rstudioapi_0.17.1 reshape2_1.4.4
#> [46] tzdb_0.5.0 rstan_2.32.7 parallel_4.5.0
#> [49] matrixStats_1.5.0 vctrs_0.6.5 V8_6.0.3
#> [52] Matrix_1.7-3 jsonlite_2.0.0 hms_1.1.3
#> [55] glue_1.8.0 codetools_0.2-20 ps_1.9.1
#> [58] distributional_0.5.0 stringi_1.8.7 gtable_0.3.6
#> [61] QuickJSR_1.7.0 pillar_1.10.2 htmltools_0.5.8.1
#> [64] Brobdingnag_1.2-9 R6_2.6.1 rprojroot_2.0.4
#> [67] evaluate_1.0.3 lattice_0.22-7 haven_2.5.4
#> [70] R.methodsS3_1.8.2 backports_1.5.0 rstantools_2.4.0
#> [73] coda_0.19-4.1 nlme_3.1-168 checkmate_2.3.2
#> [76] xfun_0.52 pkgconfig_2.0.3