66  Stima bayesiana della grandezza dell’effetto

In questo capitolo imparerai a
  • calcolare la grandezza dell’effetto usando brm() del pacchetto brms.
Prerequisiti
  • Consultare l’articolo “Bayesian estimation supersedes the t test” (Kruschke, 2013).
Preparazione del Notebook
here::here("code", "_common.R") |> 
  source()

# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(cmdstanr, posterior, brms, bayestestR, insight)

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:

kidiq <- rio::import(here::here("data", "kidiq.dta"))

fit_1 <- brm(
  kid_score ~ mom_hs, 
  data = kidiq, 
  backend = "cmdstanr",
  silent = 0
)

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

mcmc_areas(as_draws_df(tibble(d = d_samples)), pars = "d", prob = 0.89) +
  labs(
    title = "Distribuzione a posteriori di Cohen's d",
    subtitle = "Quantifica la rilevanza standardizzata della differenza osservata"
  )

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:

mean(d_samples > 0.5)  # Probabilità che l'effetto sia almeno medio
#> [1] 0.7873
mean(d_samples > 0.8)  # Probabilità che l'effetto sia grande
#> [1] 0.037

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

Bibliografia

Kruschke, J. K. (2013). Bayesian estimation supersedes the t test. Journal of Experimental Psychology: General, 142(2), 573–603.