[Preliminarii] Informația este în Distribuții

Author

Iustin Georgevici

0.1 Informația ca distribuție

În cercetarea medicală lucrăm cu asumpții, evidență, dubiu, pattern-uri, întrebări, ipoteze, rezultate din literatură, studii bazate pe un design mai potrivit (sau nu). Misiunea noastră este să producem rezultate științifice relevante. Informația este materialul cu care lucrăm. Pentru a descoperi ceva cu adevărat relevant pentru lumea științifică, ne trebuie o intuiție, un modus operandi. Cele mai dificile “salturi” sunt cele spre fundament, spre o înțelegere comprehensivă. Este ușor să mergem din complex în complicat și confuz. Dar să avem acea intuiție a esenței, à la Brâncuși, asta este ceea ce ne transformă în niște cercetători dedicați, inspirați, care cu adevărat fac diferența.

Primul nostru curs ți se poate părea abstract si dificil. Dar acum vom punem un fundament pe care se va baza absolut fiecare paper al tău, fiecare analiză, fiecare înțelegere. Roadele acestui prim curs se vor regăsi în oricare și fiecare paper citit sau scris de tine.

În cercetare, trei întrebări fundamentale trebuie să ne ghideze constant:

  1. În ce scop?
  2. Ce?
  3. Cum?

Aceste trei întrebări trebuie exersate mereu înainte de a da click-uri prin SPSS. Este fundamental să înțelegem că informația nu este un număr static, ci o distribuție (dinamică). Fără variație (sau varianță) nu există informație. Cum v-aș putea eu transmite ceva dacă membrana microfonului și a difuzorului vostru nu s-ar mișca? Cum aș putea să vă comunic ceva în scris când tastatura mea ar avea o singură tastă? Cum am putea produce muzică dacă nu aș mișca arcușul pe vioară?

Indiferent că ne referim la un individ, o cohortă, la ceva simplu sau complex, la expresii genetice sau răspunsuri dintr-un chestionar, putem înțelege o asociere, un pattern între două sau mai multe variabile dacă varianța lor comunică - de exemplu A tinde să descrească atunci când simultan B crește și C scade.

Informația unei variabile se vede într-o distribuție. La modul cel mai simplu două variabile sunt “conectate” dacă varianțele lor sunt conectate. Numărul 197 și numărul 211, nu sunt, nu au cum să fie conectate. Însă dacă eu vă dau vouă următoarea secvență: să spunem că A este 2, 3, 4, 5, 6. B este 4, 9, 16, 25, 36. Există o legătură între A și B? Dacă A ar conține și 7, care ar fi “contra-partea” în B? 49?! Da? Informația, înțeleasă ca pattern în variație, ne aduce nouă mai multă predictibilitate.

Avem misiunea de a găsi adevărul, un pattern într-o multime de ipoteze. Doar prin două feluri putem deosebi un pattern real, de un randomness complex în datele noastre. Avem nevoie de un “aha” din date și un “aha” din clinică. Din experiență vă zic că e nevoie de ambele ca rezultatele voastre să fie credibile și bine recepționate.

0.2 Ce vom explora în acest curs?

În prima parte, vom merge dincolo de statisticile descriptive simple pentru a descoperi ce se ascunde în distribuțiile complete ale datelor. Începem prin a analiza limitele rezumatelor statistice, folosind exemple clasice precum Anscombe și Datasaurus pentru a arăta cum seturi de date aparent identice pot ascunde realități complet diferite. Vom înțelege de ce vizualizarea distribuțiilor este esențială folosind R și ggplot2 (o librărie importantă).

În a doua parte, trecem de la vizualizare la inferența statistică - adică cum putem observa pattern-uri (non-random). Apoi vom compara cele două metodologii Frecventistă și Bayesiană – concentrându-ne pe modul în care acestea definesc incertitudinea prin intervale de încredere și, respectiv, de credibilitate. De asemeana, vom aborda critic limitările valorii p și vom sublinia importanța vizualizării mărimii efectului.

Astfel, vei putea:

  1. Înțelege limitările statisticilor descriptive simple și de ce acestea pot fi înșelătoare.
  2. Aprecia importanța fundamentală a vizualizării distribuțiilor complete ale datelor.
  3. Interpreta vizual diferite tipuri de distribuții pentru a identifica caracteristici cheie (ex: formă, tendință centrală, dispersie, outliers).
  4. Recunoaște cum diferite forme de distribuții pot avea implicații clinice distincte, chiar și in cazul unor statistici rezumative similare.
  5. Distinge diferențele conceptuale și practice dintre abordările Frecventistă și Bayesiană ale inferenței statistice.
  6. Interpreta corect intervalele de încredere (CI) Frecventiste și intervalele de credibilitate (CrI) Bayesiene.
  7. Descrie componentele cheie ale procesului de învățare Bayesian (prior, verosimilitate, posterior) și cum acesta permite actualizarea cunoștințelor.
  8. Evalua critic utilizarea valorilor p și aprecia importanța raportării și vizualizării mărimii efectului și a relevanței clinice.
  9. Identifica și înțelege importanța verificării asumpțiilor modelelor statistice uzuale, adesea prin metode vizuale.

1 Partea I: Întreaga distribuție contează

1.1 Rezumatele statistice descriptive sunt insuficiente

În practica medicală dar și în cercetare, rezumăm adesea date complexe la valori singulare precum medii sau mediane, deviații standard, etc. Deși ușor de comunicat, aceste rezumate pot ascunde informații decisive unor înțelegeri corecte.

O medie nu spune nimic despre variabilitatea datelor, forma distribuției sau valorile extreme. Două seturi de date pot avea exact aceeași medie și totuși să reprezinte fenomene clinic complet diferite.

Hai să trecem la un exemplu clinic concret. Citești un studiu, “Medicamentul X scade tensiunea arterială sistolică cu o medie de 10 mmHg (p<0.01).” Cum aplicăm asta la pacienții noștri? Să fim curajoși și să dăm medicamentul cuiva care are 140 cu 85 mmHg? Dar dacă are 195 cu 100 mmHg ? Contează diferența dintre sistolă și diastolă? Contează dacă mai are și alte medicamente în program? Contează factorii genetici ? Dacă pacientul este hipovolemic și deja stors de furosemid? Media de 10 mmHg poate ascunde contexte clinice total diferite:

  1. Scenariul cu varianță mică (Toți răspund la fel): Aproape toți pacienții au avut scăderi între 8-12 mmHg. Media este reprezentativă. Uneori însă, astfel de rezultate se pot obține doar dintr-o cohortă “fortat” selecționată, care nu e reprezentativă pentru variația în populația generală.

  2. Scenariul cu varianță mare (impredictibilitate): Media este tot 10 mmHg, dar unii pacienți au scăderi de 30 mmHg, alții nu răspund deloc, iar unor pacienți chiar le poate crește ușor tensiunea. Media e corectă matematic, dar clinic e aproape inutilă pentru a prezice ce se va întâmpla cu un anume pacient. Avem un rezultat nepractic, media însă ascunde aceasta problema importanta.

  3. Scenariul bimodal (Două subgrupuri): Unii pacienți răspund eficient (scăderi de 20 mmHg), iar ceilalți deloc. Media de 10 mmHg nu reprezintă pe nimeni, avem de-a face cu doua subgrupuri diferite.

Să vizualizăm aceste trei scenarii pentru a demonstra cum aceeași medie (10 mmHg) poate ascunde realități complet diferite:

Cele trei scenarii de reducere a tensiunii arteriale, toate cu aceeași medie de 10 mmHg.

Aceste limitări fundamentale sunt demonstrate prin două exemple pe date sintetice: i) Anscombe și ii) Datasaurus. Exemplele de mai jos iți ilustrează de ce statisticile descriptive pot fi înșelătoare. Vizualizarea datelor înainte de orice analiză statistică complexă este crucială.

1.1.1 Exemplul Anscombe

Exemplul Anscombe, este contine patru seturi de date cu proprietăți statistice identice, dar care arată foarte diferit atunci când sunt reprezentate grafic. De exemplu, unul dintre seturi are o relație liniară clară, altul are o relație neliniară, altul are un punct de date atipic, iar altul are o distribuție concentrată cu un punct de date separat. Nu ne putem baza exclusiv pe statisticile descriptiv-rezumative.

Code
# Încărcăm pachetele și pregătim datele Anscombe
data(anscombe)

# Transformăm în format tidy pentru vizualizare
# Folosim `map_dfr` din `purrr` pentru a aplica o funcție fiecărui element 
# dintr-o listă (aici, numerele 1 la 4, reprezentând seturile de date)
# și pentru a combina rezultatele într-un singur data frame.
# `\(iter)` este o sintaxă prescurtată pentru o funcție anonimă în R (>= 4.1.0).
anscombe_tidy <- 
  # Cream un vector cu numele seturilor: "set1", "set2", "set3", "set4"
  c(1:4) |> 
  set_names(paste0("set", 1:4)) |> 
  # Pentru fiecare element `iter` (1, 2, 3, 4) din vectorul de mai sus:
  map_dfr(\(iter){
    # Selectam coloanele x_i și y_i corespunzătoare setului curent `iter`
    # (ex: pentru iter=1, selectăm x1 și y1)
    select(anscombe, ends_with(as.character(iter))) |> 
      # Redenumim coloanele selectate în "x" și "y" pentru consistență
      set_names(c("x","y"))
  }, .id = "set") # Adăugăm o coloană "set" care indică originea datelor (set1, set2, etc.)

Hai să calculăm media, varianța, deviația standard, si coeficientul de corelație Pearson pentru fiecare set:

Code
anscombe_tidy |>
  group_by(set) |>
  summarise(
    media_x = mean(x),
    media_y = mean(y),
    varianta_x = var(x),
    varianta_y = var(y),
    SD_x = sd(x), # sd() este echivalent cu sqrt(var())
    SD_y = sd(y),
    cor_Pearson = cor(x, y, method = "pearson"),
    cor_Spearman = cor(x, y, method = "spearman"),
    .groups = 'drop' # Eliminam gruparea dupa summarise pentru a evita comportamente neasteptate ulterior
  ) |> 
  gt() |> 
  cols_align(
    align = "center",
    columns = everything()
  ) |> 
  fmt_number(
    columns = where(is.numeric), # Aplicam formatarea doar coloanelor numerice
    decimals = 2,
    drop_trailing_zeros = TRUE
  ) 
set media_x media_y varianta_x varianta_y SD_x SD_y cor_Pearson cor_Spearman
set1 9 7.5 11 4.13 3.32 2.03 0.82 0.82
set2 9 7.5 11 4.13 3.32 2.03 0.82 0.69
set3 9 7.5 11 4.12 3.32 2.03 0.82 0.99
set4 9 7.5 11 4.12 3.32 2.03 0.82 0.5

Interesant, toate aceste seturi de date au statistici aproape identice! Dar când le vizualizăm… o mică/mare surpriză :) Observați că Pearson (parametric) arată corelație identică în toate cazurile, în contrast corelația non-parametrică (Spearman) arată diferențe. Spearman este mai robust la outliers și la distribuții non-normale. Este un exemplu pertinent să investigăm cu mai multă rigurozitate modele parametrice - ele conțin asumpții despre date care pot contrazice caracterul real al acestora. Doar Setul 1 pare a fi adecvat pentru o regresie liniară simplă, subliniind importanța vizualizării înainte de modelare și pentru verificarea asumpțiilor modelului (liniaritate, homoscedasticitate etc.).

Code
anscombe_plot <- 
  anscombe_tidy |> 
  ggplot(aes(x = x, y = y)) +
  geom_point(size = 2.5, alpha = 0.7, color = "darkblue") +
  # Adaugam modelul de regresie liniara (lm) cu interval de incredere (se=TRUE)
  geom_smooth(method = "lm", se = TRUE, color = "darkorange", linetype = "dashed", fill="lightyellow") + 
  facet_wrap(~ set, ncol = 2) + # Cream cate un grafic pentru fiecare 'set'
  labs(
    title = "Datele Anscombe și Importanța Vizualizării",
    subtitle = "Seturi de date cu statistici identice, dar structuri vizuale complet diferite",
    x = "Valoare X",
    y = "Valoare Y",
    caption = "Linia portocalie punctată reprezintă modelul de regresie liniară (Y ~ X) cu intervalul de încredere de 95%."
  ) +
  # scale_color_viridis_d(option = "plasma", guide = "none") # Nu este necesar daca geom_point are o singura culoare
  theme_minimal(base_size = 12) + # Folosim tema minimala ca baza
  theme( # Actualizam elemente specifice ale temei globale definite in setup
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, margin = margin(b = 10)),
    plot.caption = element_text(hjust = 0, face = "italic"),
    strip.text = element_text(face = "bold") # Textul din header-ul facet-urilor
  )
print(anscombe_plot)

Cvartetul Anscombe: Patru seturi de date aparent identice statistic, dar vizual complet diferite. Doar pentru Setul 1 o regresie liniară este adecvată.

Setul 1 prezintă o relație aproximativ liniară cu varianță omogenă.

Setul 2 arată o relație clar non-liniară (curbilinie).

Setul 3 are o relație liniară, dar un outlier puternic influențează linia de regresie.

Setul 4 arată cum un singur punct extrem (leverage point) poate dicta întreaga linie de regresie, deși majoritatea punctelor au aceeași valoare x.

1.1.2 Exemplul Datasaurus

Datasaurus este un exemplu mai “strident”. Precum în Ansombe, toate exemplele au aceleași statistici descriptive (medie, deviație standard, corelație), dar reprezintă forme (pattern-uri) complet diferite când sunt vizualizate.

Code
# Încărcăm pachetul și explorăm datele
# library(datasauRus) # Deja incarcat prin pacman in setup

# Calculăm statisticile pentru seturile din Datasaurus
datasaurus_stats <- 
  datasaurus_dozen |>
  # Excludem setul "away" pentru o vizualizare mai clara de 4x3 (12 seturi)
  # Daca doriti toate cele 13, comentati urmatoarea linie
  filter(dataset != "away") |> 
  group_by(dataset) |>
  summarise(
    mean_x = mean(x),
    mean_y = mean(y),
    sd_x = sd(x),
    sd_y = sd(y),
    cor_Pearson = cor(x, y, method = "pearson"),
    cor_Spearman = cor(x, y, method = "spearman"),
    .groups = 'drop'  
  )

# Afișăm statisticile pentru cele 12 seturi
datasaurus_stats |>
  gt() |>
  cols_align(align = "center", columns = everything()) |>
  fmt_number(columns = where(is.numeric), decimals = 2, drop_trailing_zeros = TRUE)
dataset mean_x mean_y sd_x sd_y cor_Pearson cor_Spearman
bullseye 54.27 47.83 16.77 26.94 −0.07 −0.08
circle 54.27 47.84 16.76 26.93 −0.07 −0.08
dino 54.26 47.83 16.77 26.94 −0.06 −0.07
dots 54.26 47.84 16.77 26.93 −0.06 −0.13
h_lines 54.26 47.83 16.77 26.94 −0.06 −0.05
high_lines 54.27 47.84 16.77 26.94 −0.07 0
slant_down 54.27 47.84 16.77 26.94 −0.07 −0.07
slant_up 54.27 47.83 16.77 26.94 −0.07 −0.09
star 54.27 47.84 16.77 26.93 −0.06 −0.05
v_lines 54.27 47.84 16.77 26.94 −0.07 −0.06
wide_lines 54.27 47.83 16.77 26.94 −0.07 −0.05
x_shape 54.26 47.84 16.77 26.93 −0.07 −0.02
Code
datasaurus_dozen |>
  filter(dataset != "away") |> 
  ggplot(aes(x = x, y = y, color = dataset)) +
  geom_point(alpha = 0.9, size = 4) + # Puncte mai mari și mai opace pentru vizibilitate îmbunătățită
  facet_wrap(~dataset, ncol = 3) + # Păstrăm 3 coloane pentru aranjament echilibrat
  labs(
    title = "Exemplul Datasaurus: Statistici Identice, Pattern-uri Diferite",
    subtitle = "Toate aceste seturi au aceeași medie, deviație standard și corelație Pearson",
    x = "Valoare X",
    y = "Valoare Y"
  ) +
  scale_color_viridis_d(option = "turbo", guide = "none") + # Păstrăm paletă viridis
  theme_minimal(base_size = 28) + # Font de bază și mai mărit pentru lizibilitate maximă
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = rel(1.6)),
    plot.subtitle = element_text(hjust = 0.5, size = rel(1.4)),
    strip.text = element_text(size = rel(1.5), face = "bold"), # Text și mai mare pentru titlurile facetelor
    panel.grid.minor = element_blank(), # Eliminăm liniile minore de grilă pentru un aspect mai curat
    panel.grid.major = element_line(linewidth = 0.5, color = "gray90"), # Linii de grilă principale mai subtile
    panel.spacing = unit(2.5, "lines"), # Mărim și mai mult spațierea între facete
    axis.text = element_text(size = rel(1.3)), # Text mai mare pentru axe
    axis.title = element_text(size = rel(1.4), face = "bold"), # Titluri de axe mai mari și îngroșate
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20) # Margini mai mari pentru întreaga figură
  ) +
  coord_fixed(ratio = 1) # Menținem raportul fix pentru axe

Duzina Datasaurus: 12 seturi de date cu statistici descriptive aproape identice, dar cu pattern-uri vizuale radical diferite.

Aceste două exemple ilustrează reprezentativ limitele statisticilor descriptive rezumative.

1.1.3 Câteva întrebări

  1. Ce implicații clinice are acest fenomen? Gândește-te la un studiu clinic unde două tratamente par “statistic echivalente” bazate doar pe medii și deviații standard. Cum ar putea vizualizarea distribuțiilor complete ale răspunsurilor pacienților să schimbe interpretarea?
  2. Ce s-ar întâmpla dacă am aplica un model de regresie liniară pe date non-lineare ?
  3. Un exemplu din practica medicală unde două populații de pacienți (ex: din spitale diferite) au aceleași valori medii pentru un parametru clinic (ex: durata spitalizării), dar distribuțiile sunt complet diferite (ex: una normală, alta bimodală)? Ce ar putea însemna acest lucru?

1.2 Vizualizearea distribuțiilor

Rezumarea datelor doar prin medie poate masca aspecte cruciale precum:

  • Asimetria distribuției (skewness): majoritatea valorilor sunt concentrate la un capăt?

  • Prezența subgrupurilor (modalitate): există clustere distincte de valori?

  • Valori extreme relevante clinic (outliers): există pacienți cu răspunsuri neobișnuit de mari sau mici

  • Heterogenitatea populației: cât de variate sunt răspunsurile individuale?

Informația nu stă într-un număr singular, ci în distribuția completă a datelor. Două variabile sunt “conectate” informațional dacă variațiile lor sunt corelate într-un mod nealeatoriu. Fără variabilitate, nu există informație - și fără vizualizarea acestei variabilități, pierdem perspective esențiale.

Vizualizări precum histogramele, box plot-urile și diagramele punctuale permit examinarea completă a datelor, dezvăluind atât tendința centrală, cât și dispersia, forma distribuției și valorile aberante - toate acestea având implicații importante pentru interpretarea clinică.

1.2.1 Exemplu: Histograma pentru vârsta pacienților

Să analizăm distribuția vârstelor într-un eșantion ipotetic de pacienți și să vizualizăm distribuția vârstelor cu o histogramă și curba de densitate

Code
# Simulăm date: vârsta a 150 de pacienți
# set.seed(123) # Seed-ul este deja setat global
varste_pacienti <- data.frame(
  varsta = floor(rnorm(n = 150, mean = 55, sd = 12))
)

# Eliminăm vârstele nerealiste (ex: sub 18 sau peste 90 pentru un studiu pe adulti)
varste_pacienti <- varste_pacienti |>
  filter(varsta >= 18 & varsta <= 90)
Code
histograma_varste <- ggplot(varste_pacienti, aes(x = varsta)) +
  # `aes(y = after_stat(density))` este necesar pentru a scala axa y a histogramei 
  # la densitate, astfel încât să fie comparabilă cu curba de densitate.
  geom_histogram(aes(y = after_stat(density), fill = "Histogramă"),
                 binwidth = 5, color = "black", alpha = 0.7) +
  geom_density(aes(fill = "Densitate"), # Curba de densitate estimeaza forma distributiei
               alpha = 0.4, color = "darkorange", linewidth = 1) +
  scale_fill_manual(
    name = "Vizualizare:", 
    values = c("Histogramă" = "skyblue", "Densitate" = "orange"),
    guide = guide_legend(override.aes = list(alpha = c(0.7, 0.4))) # Asiguram vizibilitatea in legenda
  ) +
  labs(
    title = "Distribuția Vârstelor Pacienților",
    subtitle = "Histogramă cu curba de densitate (intervale de 5 ani)",
    x = "Vârsta (ani)",
    y = "Densitate"
  ) +
  theme_minimal() + # Aplicam tema minimala
  theme( # Suprascriem elemente specifice ale temei
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5),
    legend.position = "top"
  )
print(histograma_varste)

Distribuția vârstelor pacienților cu curba de densitate suprapusă. Alegerea lățimii intervalului (binwidth) poate influența percepția.

Această vizualizare ne oferă o imagine completă (superior unei simple medii). Putem observa forma distribuției (aici, pare aproximativ unimodală și ușor asimetrică la dreapta), să identificăm potențiale subgrupuri (aici nu par evidente, e ok) și detectăm valori extreme. Histograma grupează datele în intervale (bins), iar curba de densitate estimează distribuția teoretică continuă.

1.2.2 Exercițiu practic

  1. Modificați parametrul binwidth în histogramă (încercați 2, apoi 10).

  2. Cum se schimbă vizualizarea?

  3. Cum influențează alegerea binwidth percepția asupra formei distribuției (unimodală, bimodală, asimetrică)?

  4. Ce se întâmplă dacă binwidth este prea mic (ex: 1)? Dar dacă este prea mare (ex: 20)?

  5. Ce nivel de detaliu considerați că este cel mai util pentru interpretarea clinică în acest context?

1.3 Matemtica Informației: Entropia Shannon și Distribuțiile

Teza principală a acestui curs – anume că informația rezidă în forma distribuției datelor – are un fundament teoretic solid în lucrările lui Claude Shannon, părintele teoriei informației. În lucrarea sa din 1948, ‘A Mathematical Theory of Communication’, Shannon a introdus conceptul de entropie (notată cu \(H\)) ca o măsură a incertitudinii sau a ‘surprizei’ inerente într-o distribuție de probabilitate. Pentru o variabilă aleatoare discretă \(X\) cu posibilele valori \(x_1, x_2, \ldots, x_n\) și probabilitățile corespunzătoare \(p(x_i)\), entropia Shannon este definită ca:

\[H(X) = - \sum_{i=1}^{n} p(x_i) \log_2 p(x_i)\]

Unde logaritmul este de obicei în baza 2, iar unitatea de măsură a entropiei este bit-ul (da, fix acel bit din informatică)

Entropia Shannon cuantifică, în esență, cantitatea medie de informație obținută atunci când o observație este extrasă dintr-o distribuție. Cu cât o distribuție este mai ‘împrăștiată’ deci puțin predictibilă, cu atât entropia sa este mai mare, indicând o incertitudine mai mare înainte de observare și, prin urmare, o cantitate mai mare de informație câștigată (sau surpriză) atunci când o valoare specifică este observată.

Legătura cu ideea că ‘informația = distribuție’ devine clară:

  • O distribuție foarte concentrată (de exemplu, o distribuție normală cu o deviație standard foarte mică, sau o distribuție discretă unde o singură valoare are o probabilitate foarte mare) are o entropie scăzută. Acest lucru se datorează faptului că avem un grad ridicat de certitudine cu privire la valorile probabile; o nouă observație nu aduce multă ‘surpriză’ sau informație nouă. Dacă varianța este zero (toate valorile sunt identice), entropia este minimă (zero pentru distribuții discrete cu un singur rezultat posibil cu probabilitate 1), aliniindu-se cu afirmația că ‘fără varianță nu există informație’.

  • O distribuție uniformă sau una cu varianță mare (de exemplu, o distribuție normală cu deviație standard mare) are o entropie ridicată. Aici, incertitudinea este maximă (în cazul distribuției uniforme discrete, toate rezultatele sunt la fel de probabile), iar observarea unui rezultat specific reduce semnificativ această incertitudine, furnizând o cantitate mai mare de informație.

Astfel, forma distribuției, pe care o explorăm vizual, determină direct conținutul său informațional, așa cum este cuantificat de entropia Shannon. O distribuție ‘plată’ sau ‘largă’ implică mai multă incertitudine și, prin urmare, un potențial mai mare de informație per observație, în timp ce o distribuție ‘ascuțită’ sau ‘îngustă’ sugerează mai puțină incertitudine și un conținut informațional mai redus per observație.

Code
# Funcție pentru calculul entropiei Shannon (în biți)
calculate_shannon_entropy <- function(probabilities) {
  # Eliminăm probabilitățile zero pentru a evita log(0)
  probabilities <- probabilities[probabilities > 0]
  -sum(probabilities * log2(probabilities))
}

# Definim distribuțiile
# 1. Distribuție Uniformă (ex: zar corect cu 6 fețe)
prob_uniform <- rep(1/6, 6)
entropy_uniform <- calculate_shannon_entropy(prob_uniform)
data_uniform <- tibble(
  valoare = 1:6,
  probabilitate = prob_uniform,
  distributie_label = paste0("Uniformă\nEntropie H = ", round(entropy_uniform, 2), " biți"),
  type = "Uniformă"
)

# 2. Distribuție Foarte Concentrată (o valoare dominantă)
prob_concentrata <- c(0.05, 0.05, 0.7, 0.05, 0.05, 0.1)
prob_concentrata <- prob_concentrata / sum(prob_concentrata) # Asigurăm normalizarea
entropy_concentrata <- calculate_shannon_entropy(prob_concentrata)
data_concentrata <- tibble(
  valoare = 1:6,
  probabilitate = prob_concentrata,
  distributie_label = paste0("Concentrată\nEntropie H = ", round(entropy_concentrata, 2), " biți"),
  type = "Concentrată"
)

# 3. Distribuție Bimodală
prob_bimodala <- c(0.3, 0.1, 0.05, 0.05, 0.4, 0.1)
prob_bimodala <- prob_bimodala / sum(prob_bimodala) # Asigurăm normalizarea
entropy_bimodala <- calculate_shannon_entropy(prob_bimodala)
data_bimodala <- tibble(
  valoare = 1:6,
  probabilitate = prob_bimodala,
  distributie_label = paste0("Bimodală\nEntropie H = ", round(entropy_bimodala, 2), " biți"),
  type = "Bimodală"
)

# 4. Distribuție Aproape Certă (entropie foarte mică)
prob_certa <- c(0.005, 0.005, 0.98, 0.005, 0.0025, 0.0025)
prob_certa <- prob_certa / sum(prob_certa) # Asigurăm normalizarea
entropy_certa <- calculate_shannon_entropy(prob_certa)
data_certa <- tibble(
  valoare = 1:6,
  probabilitate = prob_certa,
  distributie_label = paste0("Aproape Certă\nEntropie H = ", round(entropy_certa, 2), " biți"),
  type = "Aproape Certă"
)

# Combinăm datele pentru plotare
all_entropy_data <- bind_rows(data_uniform, data_concentrata, data_bimodala, data_certa)

# Setăm ordinea dorită pentru facet-uri bazată pe tipul de distribuție
order_levels <- c(
  paste0("Uniformă\nEntropie H = ", round(entropy_uniform, 2), " biți"),
  paste0("Bimodală\nEntropie H = ", round(entropy_bimodala, 2), " biți"),
  paste0("Concentrată\nEntropie H = ", round(entropy_concentrata, 2), " biți"),
  paste0("Aproape Certă\nEntropie H = ", round(entropy_certa, 2), " biți")
)
all_entropy_data$distributie_label <- factor(all_entropy_data$distributie_label, levels = order_levels)

# Vizualizare
plot_entropie <- ggplot(all_entropy_data, aes(x = factor(valoare), y = probabilitate, fill = type)) +
  geom_col(show.legend = FALSE, color="black", alpha=0.7) +
  facet_wrap(~ distributie_label, ncol = 2) + 
  scale_fill_viridis_d(option="C") + 
  labs(
    title = "Entropia Shannon pentru Diferite Distribuții de Probabilitate Discrete",
    subtitle = "Entropia mai mare indică o incertitudine mai mare și un conținut informațional potențial mai ridicat.",
    x = "Valoare Observabilă (Categorii Arbitrare)",
    y = "Probabilitate"
  ) +
  theme_minimal(base_size = 11) + 
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = rel(1.2)),
    plot.subtitle = element_text(hjust = 0.5, size = rel(1.0), margin = margin(b=15)),
    strip.text = element_text(face = "bold", size = rel(0.9)), 
    axis.text.x = element_text(size=rel(0.9)),
    axis.title.x = element_text(size=rel(1.0), margin = margin(t=10)),
    axis.title.y = element_text(size=rel(1.0), margin = margin(r=10)),
    panel.spacing = unit(1.5, "lines")
  )
print(plot_entropie)

Entropia Shannon pentru diferite distribuții discrete. O entropie mai mare (ex: distribuția uniformă) indică o incertitudine mai mare și un conținut informațional potențial mai ridicat per observație, în timp ce o entropie mai mică (ex: distribuția ‘Aproape Certă’) indică o predictibilitate mai mare.

1.3.1 Exemplu: Box-plot-uri si Violin-plot-uri pentru tensiunea arterială

Box plot-urile sunt ok pentru compararea distribuțiilor între grupuri. Ele rezumă distribuția prin mediană (linia din centrul cutiei), quartilele Q1 și Q3 (marginile cutiei, definind intervalul interquartilic IQR = Q3-Q1), și “mustățile” care se extind de obicei până la 1.5 * IQR de la marginea cutiei. Punctele dincolo de mustăți sunt adesea considerate potențiali outliers. Totuși desi mediana, Q1, Q3 sunt statistici descriptive non-parametrice, și implicit mai robuste pentru deviere de la gauss-ianitate, distribuțiile nu se pot “comprima” corect in doar trei valori.

Violin plot-urile reprezintă o evoluție semnificativă față de box plot-urile tradiționale, oferind o vizualizare mult mai informativă a distribuției datelor. Câteve argumente principale pentru superioritatea lor:

  • Reprezentarea completă a distribuției: în timp ce box plot-urile reduc distribuția la doar 5 valori (minimum, Q1, mediană, Q3, maximum), violin plot-urile arată forma întreagă a distribuției prin estimarea densității de probabilitate.

  • Detectarea multimodalității - Box plot-urile nu pot evidenția distribuții bimodale sau multimodale, în timp ce violin plot-urile le fac imediat vizibile prin “umflături” în forma de vioară.

  • Densitatea observațiilor - Lățimea violin plot-ului la diferite valori indică direct concentrația de date, oferind o intuiție vizuală instantanee despre unde se grupează majoritatea observațiilor.

  • Contextualizarea outlier-ilor - În loc să marcheze simplu outlier-ii, violin plot-urile arată cât de neobișnuiți sunt aceștia în contextul întregii distribuții.

Code
# Simulăm date pentru tensiune arterială sistolică în 3 grupuri de tratament
# set.seed(456) # Seed-ul este deja setat global
n_per_group <- 50
control_data <- tibble(
  grup = "Control",
  sistolica = rnorm(n_per_group, mean = 140, sd = 10)
)
trt_a_data <- tibble(
  grup = "Tratament A",
  sistolica = rnorm(n_per_group, mean = 130, sd = 12)
)
trt_b_data <- tibble(
  grup = "Tratament B",
  sistolica = rnorm(n_per_group, mean = 125, sd = 15) # Variabilitate mai mare
)
tensiune_data <- bind_rows(control_data, trt_a_data, trt_b_data) |>
  mutate(grup = factor(grup, levels = c("Control", "Tratament A", "Tratament B")))

violinplot_tensiune <- tensiune_data |>
  ggplot(aes(x = grup, y = sistolica, fill = grup)) +
  # Mai întâi violin plot pentru a arăta distribuția completă
  geom_violin(alpha = 0.7, trim = FALSE, scale = "width") +
  # Box plot subțire suprapus pentru a arăta măsuri rezumative
  geom_boxplot(width = 0.2, alpha = 0.8, fill = "white", color = "darkgray") +
  # Adăugăm punctele individuale pentru transparența completă a datelor
  geom_jitter(width = 0.1, alpha = 0.5, color = "darkslateblue", size = 1.5, height = 0) +
  # Etichetele și titlurile
  labs(
    title = "Distribuția Tensiunii Arteriale Sistolice pe Grupuri de Tratament",
    subtitle = "Violin plot-uri cu box plot-uri și puncte individuale suprapuse",
    x = "Grup de Tratament",
    y = "Tensiune Arterială Sistolică (mmHg)",
    caption = "Liniile punctate reprezintă praguri clinice pentru hipertensiune (roșu) și tensiune normală (verde)"
  ) +
  scale_fill_brewer(palette = "Pastel1", guide = "none") +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold"),
    plot.subtitle = element_text(size = rel(0.9)),
    axis.text.x = element_text(angle = 15, hjust = 0.7)
  )

print(violinplot_tensiune)

Concluziile acestei vizualizări:

  1. Mediana fiecărui grup (linia din centrul cutiei).

  2. Dispersia datelor (înălțimea cutiei = intervalul interquartilic, IQR).

  3. Potențialele valori aberante (puncte dincolo de “mustăți”, deși aici sunt incluse în jitter).

  4. Forma distribuției (simetrică sau asimetrică, judecând după poziția medianei în cutie și lungimea mustăților).

  5. Suprapunerea valorilor individuale ne permite să vedem exact cum sunt distribuite datele și dacă există subgrupuri.

Putem observa că Tratamentul B pare să reducă cel mai mult tensiunea (mediana și media sunt mai joase), dar are și cea mai mare variabilitate (cutia este mai înaltă, punctele sunt mai dispersate). Tratamentul A are o variabilitate similară cu grupul Control. Cu un box plot combinat cu puncte individuale, putem vedea atât efectul general al tratamentului, cât și variabilitatea răspunsului - ambele fiind esențiale pentru decizia clinică.

2 Partea a II-a: Inferență Bayesienă și Frecventistă

Inferența statistică este procesul de a trage concluzii despre populații sau adevăruri științifice din datele observate, este abordată predominant prin două cadre filozofice majore: Frecventist și Bayesian. În timp ce ambele își propun să cuantifice incertitudinea și să ghideze luarea deciziilor, ele diferă fundamental în definițiile lor de probabilitate și în modul în care încorporează dovezile.

Pentru a naviga prin literatura medicală și a lua decizii informate, este esențial să înțelegeți cele două mari metodologii ale analizei datelor: statistica Frecventistă și cea Bayesiană. Ambele ne ajută să cuantificăm incertitudinea – dar prin lentile conceptuale contrastante. Acest capitol vă va ghida prin aceste diferențe, cu accent pe intuiție și aplicabilitate clinică.

Imagineză-ți că citești două studii despre un nou tratament pentru diabet. Primul concluzionează: “Medicamentul A reduce semnificativ glicemia (p < 0,05)”. Al doilea afirmă: “Există o probabilitate de 88% ca medicamentul B să reducă HbA1c cu cel puțin 1%”. Ambele par rezultate pozitive, dar transmit mesaje diferite și răspund la întrebări diferite. Cum interpretezi aceste informații pentru a decide ce este mai bine pentru pacientul tău care se luptă cu controlul glicemic?

2.1 Perspectiva Frecventistă: Probabilitatea dacă am repeta experimentul de foarte multe ori (ad infinitum)

  • Concept: Pentru un frecventist, probabilitatea unui eveniment este frecvența sa relativă (la numărul total de experimente făcute până atunci) dacă am repeta un experiment de nenumărate ori în condiții identice ! … exact … Ne gândim la rata de succes a unei intervenții standard, cum ar fi colecistectomia laparoscopică pentru litiaza biliară. Dacă, după mii de operații similare, 95% dintre pacienți se recuperează fără complicații majore, probabilitatea frecventistă a unui “succes” este 0,95.
  • Parametrii: Un parametru real al populației (ex: adevărata rată de succes a colecistectomiei în toți pacienții) este considerat o constantă fixă, necunoscută. Datele dintr-un studiu specific sunt doar un “eșantion” din această realitate mai largă.
  • Vizualizare Conceptuală: Imaginați-vă o țintă fixă (parametrul real). Fiecare studiu clinic este o săgeată trasă spre țintă; unele vor fi mai aproape, altele mai departe, dar ținta nu se mișcă.

2.2 Perspectiva Bayesiană: Probabilitatea ca Grad de Încredere (sau Dubiu) pe care o putem actualiza

  • Concept: Pentru un bayesian, probabilitatea reflectă gradul nostru de încredere (plauzibilitatea) că o afirmație este adevărată sau că un parametru are o anumită valoare. Această încredere nu este bătută în cuie, ea se actualizează pe măsură ce acumulăm noi dovezi / date.
  • Parametrii: Parametrii (ex: rata de succes a aceleiași colecistectomii) sunt tratați ca variabile aleatorii, adică au o distribuție de probabilitate care reflectă incertitudinea noastră despre valoarea lor reală. Putem spune: “Pe baza datelor actuale și a experienței anterioare, cred că rata de succes pentru acest tip de pacient este probabil între 92% și 98%, cel mai plauzibil în jur de 96%.”
  • Vizualizare Conceptuală: Imaginează-ți o distribuție pentru parametrul “rata de succes”. Vârful curbei indică valoarea cea mai plauzibilă, iar lățimea curbei arată cât de (ne)siguri suntem.

Tabel Comparativ: Concepte Fundamentale

Aspect Statistică Frecventistă Statistică Bayesiană
Definiția Probabilității Frecvența pe termen lung a unui eveniment Grad de încredere/plauzibilitate într-o afirmație/valoare a unui parametru
Natura Parametrilor Constante fixe, dar necunoscute Variabile aleatorii (cu distribuții de probabilitate ce reflectă incertitudinea)
Ce este Aleatoriu? Datele (datorită procesului de eșantionare) Parametrii (reflectând starea noastră de cunoaștere/incertitudine)
Rolul Datelor Noi Un eșantion dintr-o serie ipotetică de repetiții Dovezi care actualizează și rafinează credințele anterioare

2.3 Bootstrapping: O a Treia Cale

Există și o a treia abordare, mai puțin formalizată dar extrem de utilă practic, în special când asumpțiile metodelor clasice nu sunt îndeplinite: bootstrapping-ul.

Bootstrapping-ul este o metodă computațională de re-eșantionare (cu înlocuire) din datele observate pentru a estima distribuția unei statistici (ex: media, mediana, coeficientul de corelație) și pentru a construi intervale de încredere fără a face asumpții puternice despre distribuția teoretică a datelor originale. Este util, de exemplu, pentru a estima variabilitatea unei medii atunci când datele nu sunt normal distribuite sau când eșantionul este mic.

Dacă ai un singur set de date dintr-un studiu clinic cu un număr mic de pacienți cu o boală rară și vrei să estimezi cât de mult ar putea varia media răspunsului la tratament dacă ați repeta studiul. Bootstrapping-ul “clonează” eșantionul de mii de ori (prin re-eșantionare cu înlocuire din datele originale) și calculează media pentru fiecare “clonă”. Astfel, obțineți o distribuție a mediilor posibile, permițându-vă să construiți un interval de încredere robust, mai ales când datele nu respectă ipotezele clasice (ex: distribuție non-normală).

2.4 Intervale de Incertitudine: comparație vizuală a Intervalelor de Încredere versus Intervale de Credibilitate

Atât abordările Frecventiste cât și cele Bayesiene produc estimări de interval, care oferă un interval de valori plauzibile pentru un parametru necunoscut (de exemplu, efect de tratament, raport de risc). Cu toate acestea, interpretarea acestor intervale (Intervale de Încredere (CI) în statistica Frecventistă și Intervale de Credibilitate (CrI) în statistica Bayesiană) este distinctă și de multe ori duce la confuzie în rândul clinicienilor dar si al cercetătorilor. Este insă foarte important ca noi să o înțelegem corect !

2.4.1 Intervalul de Încredere Frecventist (CI): O Măsură a Performanței Metodei

  • Ce NU înseamnă: Un CI de 95% NU înseamnă că “există o probabilitate de 95% ca adevărata valoare a parametrului să fie în acest interval specific calculat din studiul meu”. Aceasta este cea mai comună greșeală!

  • Ce ÎNSEAMNĂ: Un CI de 95% se referă la fiabilitatea pe termen lung a procedurii de calcul. Dacă am repeta același studiu de 100 de ori, în condiții identice, și am calcula un CI de 95% pentru fiecare studiu, ne-am aștepta ca aproximativ 95 dintre aceste 100 de intervale să “captureze” valoarea reală, fixă, dar necunoscută, a parametrului din populație. Intervalul specific pe care l-ați obținut în studiul dumneavoastră fie conține, fie nu conține valoarea reală – nu putem atribui o probabilitate acestui fapt în cadrul frecventist.

  • Exemplu Medical: Un studiu raportează că un nou medicament antiaritmic reduce episoadele de fibrilație atrială cu o medie de 3 episoade/lună (CI 95%: 1,5 - 4,5 episoade/lună). Interpretarea corectă: “Dacă am repeta acest studiu de multe ori, 95% din intervalele de încredere astfel calculate ar conține adevărata reducere medie a episoadelor de fibrilație atrială în populația de pacienți similari.”

Să vizualizăm acest concept. Vom simula extragerea a 100 de eșantioane dintr-o populație cu o medie cunoscută și vom calcula un interval de încredere de 95% pentru medie pentru fiecare eșantion.

Code
# set.seed(101) # Seed-ul este deja setat global
populatie_medie_reala <- 30
populatie_sd_reala <- 5
marime_esantion <- 25
numar_simulari <- 100

intervale_incredere <- map_dfr(1:numar_simulari, function(i) {
  esantion_curent <- rnorm(marime_esantion, mean = populatie_medie_reala, sd = populatie_sd_reala)
  test_t_rezultat <- t.test(esantion_curent) # t.test() returneaza si conf.int
  
  tibble(
    simulare_id = i,
    medie_esantion = mean(esantion_curent),
    ci_lower = test_t_rezultat$conf.int[1],
    ci_upper = test_t_rezultat$conf.int[2],
    # Verificam daca intervalul calculat contine media reala a populatiei
    contine_media_reala = (test_t_rezultat$conf.int[1] <= populatie_medie_reala) & 
                          (test_t_rezultat$conf.int[2] >= populatie_medie_reala)
  )
}, .id = "sim_id_map") # .id adauga un index din map_dfr, dar avem deja simulare_id

# Calculăm procentul de intervale care conțin media reală
procent_acoperire <- mean(intervale_incredere$contine_media_reala) * 100
Code
plot_ci_simulare <- ggplot(intervale_incredere, 
                           aes(x = reorder(factor(simulare_id), medie_esantion), # Ordonam dupa media esantionului pentru vizualizare
                               ymin = ci_lower, ymax = ci_upper, 
                               color = contine_media_reala)) +
  geom_errorbar(width = 0.6) + # Barele de eroare reprezinta CI
  geom_point(aes(y = medie_esantion), size = 1.5, shape = 21, fill="grey80") + # Punctul este media esantionului
  geom_hline(yintercept = populatie_medie_reala, linetype = "dashed", color = "blue", linewidth = 1) +
  scale_color_manual(name = "Intervalul conține media reală?", 
                     values = c("TRUE" = "darkgrey", "FALSE" = "red"), 
                     labels = c("TRUE" = "Da", "FALSE" = "Nu")) +
  labs(
    title = "Simularea a 100 de Intervale de Încredere de 95% pentru Medie",
    subtitle = paste0(round(procent_acoperire, 0), "% dintre intervalele simulate (din ", numar_simulari, 
                      ") conțin media reală a populației (", populatie_medie_reala, ")."),
    x = "Simulare Eșantion (ordonat după media eșantionului)",
    y = "Valoarea Mediei Estimate și Intervalul de Încredere"
  ) +
  coord_flip() + 
  theme( # Am mostenit tema minimala si am actualizat
    legend.position = "bottom",
    axis.text.y = element_blank(), 
    axis.ticks.y = element_blank(),
    panel.grid.major.y = element_blank() # Eliminam grid-ul pe axa y (dupa flip)
  )
print(plot_ci_simulare)

Simularea a 100 de intervale de încredere de 95% pentru medie. Liniile roșii indică intervalele care NU conțin media reală a populației (linia albastră orizontală).

Să investigăm aceste intervale de încredere: dacă am repeta experimentul de multe ori, aproximativ 95% dintre intervalele de încredere de 95% calculate ar conține valoarea reală a parametrului populației. Este important de notat că pentru un singur interval de încredere dat (ex: cel obținut din studiul nostru), acesta fie conține, fie nu conține parametrul real - nu putem atribui o probabilitate parametrului în sine în cadrul frecventist ! Afirmația “există o probabilitate de 95% ca media reală să fie în acest interval specific” este o interpretare greșită comună, specifică de fapt intervalelor de credibilitate Bayesiene.

2.4.2 Căteva întrebări

  1. Interpretare Clinică: un studiu clinic raportează un interval de încredere de 95% pentru reducerea medie a tensiunii arteriale sistolice ca fiind [2 mmHg, 10 mmHg] pentru un nou medicament. Cum ai explica acest interval unui coleg medic care nu este familiarizat cu statistica? (Sugestie: fiabilitatea procedurii de estimare pe termen lung). Ce nu poți spune despre acest interval specific?
  2. Limitări: De ce este interpretarea frecventistă a intervalului de încredere uneori considerată contraintuitivă pentru practicienii clinicieni?
  3. Exercițiu: Modifică numar_simulari la 1000 în codul de mai sus. Se apropie procent_acoperire mai mult de 95%? De ce sau de ce nu?

2.4.3 Intervalul de Credibilitate Bayesian (CrI): O Măsură Directă a Plauzibilității

  • Ce ÎNSEAMNĂ: Aici, interpretarea este directă și intuitivă! Un CrI de 95% înseamnă: “Pe baza datelor din studiul meu și a cunoștințelor mele anterioare (priorul), există o probabilitate de 95% ca adevărata valoare a parametrului (ex: eficacitatea reală a medicamentului) să se afle în acest interval specific.”

  • Exemplu Medical: “Analiza Bayesiană a unui studiu privind un nou tratament pentru osteoporoză arată un CrI 95% pentru creșterea densității minerale osoase de [0,02 g/cm², 0,08 g/cm²]. Putem afirma: ‘Există o probabilitate de 95% ca adevărata creștere medie a densității osoase cu acest tratament să fie între 0,02 și 0,08 g/cm²’.”

Pentru a ilustra un interval de credibilitate, vom simula o distribuție posterioară pentru un parametru. Această distribuție posterioară reprezintă credința noastră actualizată despre parametru după ce am analizat datele.

Code
# Simulăm o distribuție posterioară (de ex., normală, dar ar putea fi orice formă)
# set.seed(202) # Seed-ul este deja setat global
medie_posterioara <- 25
sd_posterioara <- 2
valori_posterioare <- rnorm(10000, mean = medie_posterioara, sd = sd_posterioara)
date_posterioare <- data.frame(valoare = valori_posterioare)

# Calculăm intervalul de credibilitate de 95%
# Cel mai comun este intervalul cu densitate egală în cozi (Equal-tailed interval, ETI)
cri_lower <- quantile(valori_posterioare, 0.025)
cri_upper <- quantile(valori_posterioare, 0.975)

# Alt tip de interval este Highest Density Interval (HDI), care este cel mai scurt interval ce contine X% din probabilitate.

Să vizualizăm distribuția posterioară și intervalul de credibilitate de 95%:

Code
# Construim plotul principal
plot_cri_vizualizare <- ggplot(date_posterioare, aes(x = valoare)) +
  # Desenam curba de densitate principala
  geom_density(aes(y = after_stat(density)), fill = "#AED6F1", alpha = 0.7, color = "darkblue", linewidth=0.8) +
  # Adaugam zona hasurata pentru intervalul de credibilitate
  {
    # Extragem datele (x, y) din curba de densitate calculata de ggplot
    # Cream un plot temporar doar pentru a extrage datele curbei de densitate
    density_calc_plot <- ggplot(date_posterioare, aes(x = valoare)) + 
      geom_density(aes(y = after_stat(density)))
    density_data_points <- ggplot_build(density_calc_plot)$data[[1]]
    
    # Filtram aceste puncte pentru a ramane doar cele din intervalul de credibilitate
    ribbon_data_points <- density_data_points |> 
      filter(x >= cri_lower & x <= cri_upper)
      
    # Returnam geom_ribbon daca avem puncte in interval
    if (nrow(ribbon_data_points) > 0) {
      geom_ribbon(data = ribbon_data_points, 
                  aes(x = x, ymin = 0, ymax = y), # y este densitatea calculata
                  fill = "lightcoral", alpha = 0.5, inherit.aes = FALSE)
    } else {
      NULL # Nu adaugam layerul daca nu sunt date
    }
  } +
  # Linii verticale pentru limitele intervalului si medie
  geom_vline(xintercept = c(cri_lower, cri_upper), color = "red", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = medie_posterioara, color = "blue", linetype = "solid", linewidth = 1) +
  # Adnotari text
  annotate("text", x = medie_posterioara, y = 0.01, 
           label = paste0("Medie Posterioară = ", round(medie_posterioara,1)), 
           color = "blue", vjust = -0.5, size=3.5, fontface="bold") +
  annotate("text", x = cri_lower, y = 0.05, 
           label = paste0("CrI 2.5% = ",round(cri_lower,1)), 
           color = "red", hjust = 1.1, size=3.5) +
  annotate("text", x = cri_upper, y = 0.05, 
           label = paste0("CrI 97.5% = ",round(cri_upper,1)), 
           color = "red", hjust = -0.1, size=3.5) +
  annotate("text", x = medie_posterioara, y = max(density(date_posterioare$valoare)$y)*0.5, # Pozitionare relativa la inaltimea densitatii
           label = "95% Interval de Credibilitate", color = "darkred", size=4, fontface="bold") +
  labs(
    title = "Distribuția Posterioară și Intervalul de Credibilitate (95%)",
    subtitle = "Zona hașurată (roșu deschis) reprezintă intervalul unde parametrul se află cu o probabilitate de 95%.",
    x = "Valoarea Parametrului Estimată",
    y = "Densitatea de Probabilitate Posterioară",
    caption = "Notă: Intervalul de credibilitate permite o afirmație probabilistică directă despre parametru."
  )
print(plot_cri_vizualizare)

Vizualizarea unei distribuții posterioare simulate și a intervalului de credibilitate de 95% (ETI) asociat.

În acest plot, curba reprezintă distribuția noastră de confidență despre valoarea parametrului după ce am văzut datele. Intervalul de credibilitate de 95% (zona hașurată între liniile roșii) este intervalul în care credem, cu o probabilitate de 95%, că se află valoarea reală a parametrului. Spre deosebire de CI, pentru un CrI de 95% [X, Y], putem afirma direct că ‘există o probabilitate de 95% ca parametrul de interes să se afle între X și Y, având în vedere datele și modelul nostru (inclusiv priorul)’.

2.4.4 Tabelul 1: Intervale de Încredere vs. Intervale de Credibilitate

Caracteristică Interval de Încredere (CI) - Frecventist Interval de Credibilitate (CrI) - Bayesian
Interpretare Dacă am repeta experimentul de multe ori, X% din CI-urile construite ar conține valoarea reală a parametrului. Există o probabilitate de X% ca valoarea reală a parametrului să se afle în acest interval specific, date fiind datele și priorul.
Bază Filozofică Probabilitate frecventistă (frecvențe pe termen lung). Parametrul este fix și necunoscut, intervalul este aleatoriu. Probabilitate bayesiană (grad de credință). Parametrul este o variabilă aleatorie, datele sunt fixe odată observate.
Ce Cuantifică Incertitudinea în procedura de estimare datorită variabilității eșantionării. Performanța metodei pe termen lung. Incertitudinea noastră actualizată despre valoarea parametrului, combinând cunoștințe anterioare și date.
Input Necesar Doar datele observate (eșantionul). Datele observate și o distribuție anterioară (prior) care cuantifică credința inițială despre parametru.
Output Principal Un interval de valori. O distribuție de probabilitate completă (posterioară) pentru parametru, din care se poate deriva un interval.
Afirmație despre Parametru Indirectă: despre procedura de generare a intervalului. Directă: o afirmație probabilistică despre localizarea parametrului.
Interpretare Greșită Comună “Există o șansă de 95% ca media reală să fie în acest CI specific.” (Aceasta este o interpretare Bayesiană!) Mai puțin predispus la această interpretare greșită specifică, dar alegerea priorului poate fi subiectivă/contestată și poate influența intervalul.
Metaforă Intuitivă Un p-value e ca alarma de fum – doar piuie dacă e ceva fum, piuie în 95% din situațiile în care e fum, dar mai piuie și degeaba uneori. Un interval e ca o cameră cu infraroșu – îți arată unde e focul, cât de mare e și cât de sigur ești de locație.

Relevanța clinică a acestei distincții este substanțială. Clinicienii și cercetătorii interpretează adesea incorect IC-urile Frecventiste într-un mod Bayesian. În practica clinică reală avem nevoie de această precizie pentru a lua decizii informate pentru pacienți individuali.

2.5 Învățarea Bayesiană?

În medicină, la fel ca în multe alte domenii, rareori avem certitudini absolute. Mai degrabă, avem convingeri sau suspiciuni pe care le ajustăm pe măsură ce obținem noi informații. Acest proces natural de actualizare a convingerilor în lumina dovezilor noi este exact ceea ce surprinde și formalizează inferența Bayesiană.

Să ne imaginăm un scenariu clinic: domnul Vasilescu, 65 de ani, fumător, vine cu durere toracică recent instalată.

  1. Suspiciunea Inițială (PRIORUL): Pe baza vârstei, a faptului că este fumător și a naturii durerii, medicul are o anumită bănuială (o probabilitate a priori sau “prior”) că ar putea fi vorba de o boală coronariană ischemică. Desigur, ia în calcul și alte posibile cauze, dar boala coronariană este pe lista principală de suspiciuni. Aceasta este convingerea medicului înainte de a avea teste specifice.

  2. Datele Actuale (VEROSIMILITATEA/LIKELIHOOD): Pentru a-și rafina diagnosticul, medicul solicită investigații:

    • ECG-ul arată modificări sugestive pentru ischemie.

    • Enzimele cardiace (ex: troponina) sunt crescute

      Aceste rezultate reprezintă dovezile actuale. Ele ne spun cât de “verosimile” sunt aceste date dacă pacientul ar avea, într-adevăr, o problemă ischemică, comparativ cu alte diagnostice.

  3. Convingere Actualizată (POSTERIORUL): Cu aceste noi date, probabilitatea ca domnul Vasilescu să sufere de o ischemie coronariană este acum mai mare decât suspiciunea inițială. Medicul decide internarea și investigații suplimentare, cum ar fi coronarografia. Convingerea sa a fost actualizată.

Acesta este, în esență, procesul Bayesian! Putem rezuma astfel:

Fluxul Bayesian

CONVINGERE INIȚIALĂ (Prior) + DOVEZI ACTUALE (Verosimilitate) → TEOREMA LUI BAYES → CONVINGERE ACTUALIZATĂ (Posterior)

2.6 Teorema lui Bayes: Formalizarea Matematică

Procesul intuitiv de mai sus este descris matematic de Teorema lui Bayes:

\[P(\theta|D) = \frac{P(D|\theta) \times P(\theta)}{P(D)}\]

Să descifrăm acești termeni:

  • \(\theta\) (theta): Reprezintă un parametru (estimare) care ne interesează. Acesta poate fi proporția de succes a unui tratament, valoarea medie a tensiunii arteriale într-un grup, sau probabilitatea ca un pacient să aibă o anumită boală. În exemplul nostru, \(\theta\) ar putea fi “adevărata” rată de eficacitate a unui tratament.
  • \(D\): Reprezintă datele observate (dovezile actuale). În exemplul nostru, \(D\) ar putea fi “7 succese din 10 încercări”.
  • \(P(\theta)\) – Distribuția Prior: Aceasta este convingerea noastră inițială despre \(\theta\), exprimată ca o distribuție de probabilitate, înainte de a vedea datele \(D\). Reflectă cunoștințele anterioare, experiența sau ipotezele de lucru.
  • \(P(D|\theta)\) – Verosimilitatea (Likelihood): Aceasta ne spune cât de probabil este să observăm datele \(D\) pentru diferite valori posibile ale parametrului \(\theta\). Este important de notat că aceasta este o funcție de \(\theta\) (pentru date \(D\) fixe). Ea cuantifică cât de bine “se potrivesc” datele cu fiecare valoare posibilă a lui \(\theta\).
  • \(P(\theta|D)\) – Distribuția Posterioară: Aceasta este convingerea noastră actualizată despre \(\theta\), după ce am luat în considerare atât priorul \(P(\theta)\), cât și dovezile din date \(P(D|\theta)\). Este rezultatul “învățării” din date.
  • \(P(D)\) – Evidența (sau Probabilitatea Marginală a Datelor): Aceasta este probabilitatea totală de a observa datele \(D\), luând în calcul toate valorile posibile ale lui \(\theta\). Rolul său principal este de a fi o constantă de normalizare, asigurându-se că distribuția posterioară \(P(\theta|D)\) este o distribuție de probabilitate validă (adică, aria de sub curbă este 1). În multe aplicații practice cu metode computaționale sau priori conjugați, nu este nevoie să calculăm explicit \(P(D)\).

2.7 Vizualizarea Actualizării Bayesiene: Un Exemplu cu Rate de Succes

Să considerăm un scenariu clinic în care estimăm proporția de succes (\(\theta\)) a unui nou tratament.

Alegerea Distribuțiilor în Modelul Beta-Binomial
  • Prior (\(P(\theta)\)): Deoarece \(\theta\) este o proporție (o valoare între 0 și 1), o alegere comună și flexibilă pentru distribuția prior este distribuția Beta. O distribuție Beta este definită de doi parametri, \(\alpha\) (alpha) și \(\beta\) (beta), care îi determină forma.
  • Verosimilitate (\(P(D|\theta)\)): Dacă observăm un număr de succese (\(k\)) dintr-un număr total de încercări (\(n\)), iar fiecare încercare este independentă și are aceeași probabilitate de succes \(\theta\), atunci numărul de succese urmează o distribuție Binomială. Verosimilitatea va fi proporțională cu funcția de masă de probabilitate binomială.

Un aspect foarte util este că, dacă alegem un prior Beta și avem o verosimilitate Binomială, distribuția posterioară va fi tot o distribuție Beta. Această proprietate se numește conjugare, iar perechea Beta-Binomial este un exemplu de priori conjugați, simplificând calculele.

Code
library(ggrepel)

# Definim spațiul valorilor posibile pentru parametrul nostru (proporția de succes)
# Vom examina valori de la 0 la 1, cu multe puncte intermediare pentru o curbă netedă.
parametru_valori <- seq(0, 1, length.out = 1000)

# 1. DEFINIREA PRIORULUI
# Alegem un Prior Beta(alfa = 2, beta = 5).
# Această alegere specifică pentru alfa și beta reflectă o convingere inițială mai degrabă pesimistă.
# O distribuție Beta(2,5) are media = 2/(2+5) = 0.286 și modul (vârful) = (2-1)/(2+5-2) = 0.2.
# Deci, credem a priori că rata de succes este probabil mică, sub 0.5.
prior_alfa <- 2
prior_beta <- 5
prior_densitate <- dbeta(parametru_valori, prior_alfa, prior_beta)

# Notă despre alte tipuri de priori:
# - Un prior "non-informativ" sau "vag" ar putea fi Beta(1,1) (distribuție uniformă).
# - Un prior "optimist" ar putea fi Beta(5,2) (modul la 0.8).
# Alegerea priorului este un pas important și trebuie justificată.

# 2. OBSERVAREA DATELOR ȘI DEFINIREA VEROSIMILITĂȚII
# Să presupunem că efectuăm un mic studiu pilot cu 10 pacienți și observăm 7 succese.
nr_succese <- 7
nr_incercari <- 10

# Verosimilitatea (likelihood) P(D|theta) pentru o proporție theta,
# dati fiind k succese din n încercări, este proporțională cu funcția de masă Binomială.
# L(theta | D) ∝ theta^k * (1-theta)^(n-k)
verosimilitate_densitate_raw <- dbinom(nr_succese, nr_incercari, prob = parametru_valori)

# SCALAREA VEROSIMILITĂȚII PENTRU VIZUALIZARE:
# Aceasta este o etapă tehnică pentru a putea suprapune curba verosimilității 
# cu densitățile de probabilitate ale priorului și posteriorului pe același grafic.
# Se păstrează forma și locația maximului verosimilității.
verosimilitate_densitate_norm <- verosimilitate_densitate_raw / sum(verosimilitate_densitate_raw * (parametru_valori[2]-parametru_valori[1]))
verosimilitate_densitate_scaled <- verosimilitate_densitate_norm / max(verosimilitate_densitate_norm, na.rm=TRUE) * max(prior_densitate, na.rm=TRUE) * 1.1 

# 3. CALCULAREA DISTRIBUȚIEI POSTERIOARE
# Datorită conjugării Beta-Binomial, posteriorul este tot o distribuție Beta.
# Parametrii săi se actualizează simplu:
posterior_alfa <- prior_alfa + nr_succese
posterior_beta <- prior_beta + (nr_incercari - nr_succese) # nr_eșecuri
posterior_densitate <- dbeta(parametru_valori, posterior_alfa, posterior_beta)
# Posteriorul nostru va fi Beta(2+7, 5+(10-7)) = Beta(9,8)

# Pregătim datele pentru grafic într-un format 'tidy'
update_data <- tibble(
  parametru = rep(parametru_valori, 3),
  densitate = c(prior_densitate, verosimilitate_densitate_scaled, posterior_densitate),
  distributie = factor(rep(c("Prior", "Verosimilitate (scalată)", "Posterior"), 
                           each = length(parametru_valori)),
                       levels = c("Prior", "Verosimilitate (scalată)", "Posterior"))
)

Acum să vizualizăm acest proces de “învățare”.

Ce să urmărim în graficul următor?
  • Curba Albastră (Priorul): Reprezintă convingerile noastre inițiale, pesimiste, despre rata de succes.
  • Curba Verde (Verosimilitatea, Likelyhood): Reprezintă informația adusă de cele 7 succese din 10 încercări. Observați unde are vârful – la 0.7 (7/10), proporția observată în date.
  • Curba Roșie (Posteriorul): Reprezintă convingerile actualizate, după combinarea priorului cu datele. Observați cum este “trasă” de la prior către verosimilitate.
Code
# Calculăm punctele de maxim (modurile) pentru fiecare distribuție
max_points <- update_data |>
  group_by(distributie) |>
  filter(densitate == max(densitate, na.rm=TRUE)) |> 
  slice(1) |> 
  ungroup() |>
  mutate(
    label = paste0(distributie, "\nMod = ", round(parametru, 2))
  )

# Crearea graficului
plot_bayes_update <- ggplot(update_data, aes(x = parametru, y = densitate, color = distributie, fill = distributie)) +
  geom_line(linewidth = 1.2) +
  geom_area(alpha = 0, data = update_data |> filter(distributie != "Verosimilitate (scalată)")) + 
  geom_line(data = update_data |> filter(distributie == "Verosimilitate (scalată)"), 
            linetype="dashed", linewidth = 1) + 
  geom_point(data = max_points, aes(x = parametru, y = densitate), size = 3, shape=21, stroke=1.2, fill="white") +
  ggrepel::geom_text_repel(data = max_points, aes(x = parametru, y = densitate, label = label), 
                           size = 3.5, fontface = "bold",
                           nudge_y = 0.5, 
                           min.segment.length = 0) + 
  scale_color_manual(values = c("Prior" = "royalblue4", "Verosimilitate (scalată)" = "forestgreen", "Posterior" = "firebrick3")) +
  scale_fill_manual(values = c("Prior" = "lightblue", "Posterior" = "lightcoral", "Verosimilitate (scalată)" = NA_character_)) +
  labs(
    title = "Procesul de Învățare Bayesian: Actualizarea Credințelor despre Rata de Succes",
    subtitle = paste0("Prior: Beta(", prior_alfa, ",", prior_beta, ")  |  Date: ", nr_succese, "/", nr_incercari, 
                      " succese (Likelihood Binomial)  |  Posterior: Beta(", posterior_alfa, ",", posterior_beta, ")"),
    x = "Valoarea Parametrului (θ: proporția de succes a tratamentului)",
    y = "Densitate de Probabilitate (Verosimilitatea este scalată pentru vizualizare)",
    color = "Distribuție:", fill="Distribuție:"
  ) +
  theme_minimal(base_size = 12) + 
  theme(legend.position = "top",
        plot.title = element_text(face = "bold", size=16),
        plot.subtitle = element_text(size=10)) +
  annotate("text", x = 0.5, y = max(posterior_densitate, na.rm=TRUE) * 0.1, 
           label = expression(Posterior %prop% Prior %*% Verosimilitate), 
           size = 5, fontface = "italic", color = "black")

print(plot_bayes_update)

Procesul de învățare Bayesian: Cum cunoștințele anterioare (Prior) sunt actualizate de datele noi (Verosimilitate) pentru a forma o nouă credință (Posterior).

Interpretarea Graficului:

Acest grafic ilustrează vizual esența analizei Bayesiene:

  1. Priorul (albastru, Beta(2,5)): Reprezintă convingerea noastră inițială, relativ pesimistă. Este o distribuție destul de largă, reflectând o incertitudine considerabilă.
  2. Verosimilitatea (verde, linie punctată, bazată pe 7 succese din 10): Aceasta reflectă informația din date. Vârful ei este la \(\theta = 0.7\).
  3. Posteriorul (roșu, Beta(9,8)): Aceasta este “noua noastră convingere” despre \(\theta\).
    • Compromis Informat: Posteriorul este un compromis între prior și verosimilitate. Vârful său (modul la aprox. 0.53) se află între cel al priorului (0.2) și cel al verosimilității (0.7).
    • Influența Datelor: Deoarece datele sugerează o rată de succes mai mare decât credea priorul, posteriorul a fost “tras” spre dreapta.
    • Reducerea Incertitudinii: Distribuția posterioară este mai îngustă decât priorul, indicând că am câștigat informație și incertitudinea s-a redus.
Despre Linii și Arii Umplute

Pentru Prior (albastru) și Posterior (roșu), folosim atât o linie (conturul) cât și o arie umplută sub linie. Aceste două elemente vizuale împreună reprezintă o singură distribuție de probabilitate. Linia definește forma exactă, iar aria ajută la vizualizarea “corpului” sau a “masei” distribuției. Verosimilitatea (verde) este arătată doar ca linie, deoarece este scalată pentru comparație și nu este o densitate de probabilitate în același sens ca priorul și posteriorul.

2.8 Actualizarea Bayesiană Secvențială: Învățarea Continuă

Un avantaj major al perspectivei Bayesiene este procesul natural de actualizare secvențială. Posteriorul obținut după o primă rundă de date devine Priorul pentru următoarea rundă de date.

Exemplu clinic: Să estimăm eficacitatea unui nou medicament pentru boala Crohn.

  • Cunoștințe inițiale (Prior Inițial): Presupunem o rată de remisiune în jur de 30%, cu incertitudine mare. Modelăm cu Beta(2,5).
  • Date Noi (pe runde):
    • Runda 1: 7 succese / 10 pacienți.
    • Runda 2: 15 succese / 20 pacienți (noi).
    • Runda 3: 32 succese / 40 pacienți (noi).

Să vizualizăm cum evoluează convingerile noastre.

Code
# Parametrii pentru priorul inițial
prior_initial_alfa <- 2
prior_initial_beta <- 5

# Datele simulate din cele trei runde
data_rounds <- list(
  list(succese = 7, incercari = 10, label = "Runda 1: Primele Date (7/10)"),
  list(succese = 15, incercari = 20, label = "Runda 2: Date Adiționale (15/20)"),
  list(succese = 32, incercari = 40, label = "Runda 3: Studiu Extins (32/40)")
)

# Inițializăm tabelul pentru evoluția distribuțiilor
bayesian_evolution <- tibble()

# Începem cu parametrii priorului inițial
alfa_curent <- prior_initial_alfa
beta_curent <- prior_initial_beta

# Adăugăm Priorul Inițial în tabelul de evoluție
prior_densitate_initiala <- dbeta(parametru_valori, alfa_curent, beta_curent)
bayesian_evolution <- bayesian_evolution |>
  bind_rows(
    tibble(
      parametru = parametru_valori, 
      densitate = prior_densitate_initiala,
      runda_label = paste0("Prior Inițial: Beta(", alfa_curent, ",", beta_curent,")"),
      runda_numeric = 0, 
      mode_param = ifelse(alfa_curent > 1 & beta_curent > 1, (alfa_curent-1)/(alfa_curent+beta_curent-2), NA) 
    )
  )

# Procesăm fiecare rundă de date secvențial
for (i in 1:length(data_rounds)) {
  succese_rundei <- data_rounds[[i]]$succese
  incercari_rundei <- data_rounds[[i]]$incercari
  
  alfa_nou_posterior <- alfa_curent + succese_rundei
  beta_nou_posterior <- beta_curent + (incercari_rundei - succese_rundei)
  
  posterior_densitate_runda <- dbeta(parametru_valori, alfa_nou_posterior, beta_nou_posterior)
  
  bayesian_evolution <- bayesian_evolution |>
    bind_rows(
      tibble(
        parametru = parametru_valori, 
        densitate = posterior_densitate_runda,
        runda_label = paste0("Posterior ", i, " (după ", data_rounds[[i]]$label, "): Beta(", alfa_nou_posterior, ",", beta_nou_posterior,")"),
        runda_numeric = i,
        mode_param = ifelse(alfa_nou_posterior > 1 & beta_nou_posterior > 1, (alfa_nou_posterior-1)/(alfa_nou_posterior+beta_nou_posterior-2), NA)
      )
    )
  
  alfa_curent <- alfa_nou_posterior
  beta_curent <- beta_nou_posterior
}

bayesian_evolution$runda_label <- factor(bayesian_evolution$runda_label, 
                                         levels = unique(bayesian_evolution$runda_label))

Acum, să vizualizăm această evoluție secvențială.

Ce să urmărim în graficul secvențial?
  • Cum se schimbă forma și poziția distribuției de la Priorul Inițial la fiecare Posterior succesiv.
  • Observați cum distribuțiile devin, în general, mai înguste (precizie mai mare / incertitudine redusă).
  • Urmăriți cum se deplasează vârful (modul) distribuției.
Code
# Definim o paletă de culori
evolution_colors <- c("royalblue4", viridisLite::plasma(length(data_rounds))) 

# Extragem datele despre moduri pentru adnotări
modes_data <- bayesian_evolution |> 
  filter(!is.na(mode_param)) |>
  group_by(runda_label, runda_numeric, mode_param) |> 
  summarise(max_dens = max(densitate, na.rm=TRUE), .groups="drop") 

# Crearea graficului secvențial
plot_sequential_bayes <- ggplot(bayesian_evolution, 
                                aes(x = parametru, y = densitate, 
                                    color = runda_label, fill = runda_label, 
                                    group = runda_label)) +
  geom_line(linewidth = 1.2) +
  geom_area(alpha = 0.10, data = ~subset(., runda_numeric == 0)) + 
  geom_area(alpha = 0.18, data = ~subset(., runda_numeric > 0)) +  
  scale_color_manual(values = evolution_colors, name = "Distribuție (cu parametrii Beta):") +
  scale_fill_manual(values = evolution_colors, name = "Distribuție (cu parametrii Beta):", guide="none") + 
  geom_vline(data = modes_data, aes(xintercept = mode_param, color = runda_label), 
             linetype = "dotted", linewidth = 1, alpha=0.7) +
  ggrepel::geom_text_repel(data = modes_data, 
                           aes(x = mode_param, y = max_dens, 
                               label = paste0("Mod=", round(mode_param,2))),
                           size=3, nudge_y = 0.7, 
                           min.segment.length = 0.1, 
                           fontface="bold", 
                           show.legend = FALSE) + 
  labs(
    title = "Actualizarea Bayesiană Secvențială: Rafinarea Treptată a Credințelor",
    subtitle = "Cu fiecare nouă rundă de date, distribuția estimării ratei de succes devine mai precisă și se ajustează.",
    x = "Valoarea Parametrului (θ: proporția de succes a tratamentului)",
    y = "Densitate de Probabilitate"
  ) +
  guides(color = guide_legend(ncol=1)) + 
  theme_minimal(base_size = 12) +
  theme(legend.position = "right", 
        legend.box = "vertical",
        legend.title = element_text(size=10, face="bold"), 
        legend.text = element_text(size=9),
        plot.title = element_text(face = "bold", size=16),
        plot.subtitle = element_text(size=10))

print(plot_sequential_bayes)

Evoluția distribuției Bayesiene pe măsură ce noi date sunt încorporate secvențial în estimarea ratei de succes.

Interpretarea Graficului Secvențial:

  1. Priorul Inițial (albastru închis, Beta(2,5)): Punctul de plecare, cu incertitudine mare.
  2. Posterior 1 (după 7/10 succese): Distribuția se mută spre dreapta (modul la ~0.57) și se îngustează puțin.
  3. Posterior 2 (după încă 15/20 succese): Tendința pozitivă se întărește (modul la ~0.71), distribuția devine și mai îngustă.
  4. Posterior 3 (după încă 32/40 succese): Modul se stabilizează în jur de 0.77, iar distribuția este considerabil mai îngustă, reflectând o convingere mai puternică și mai precisă.

2.9 Puncte de Reflecție și Aplicații Clinice (Inferența Bayesiană)

Abordarea Bayesiană deschide uși către moduri mai nuanțate de a gândi și a lua decizii în context clinic.

De Ce Contează Abordarea Bayesiană?

Inferența Bayesiană nu este doar un set de tehnici matematice, ci un mod fundamental de a raționa despre incertitudine și de a învăța din date într-un mod coerent și transparent. Pe măsură ce puterea computațională crește și familiaritatea cu aceste metode se răspândește, ne putem aștepta să vedem aplicații din ce în ce mai sofisticate și mai impactante în medicină și cercetarea biomedicală.

Direcții de Reflecție:

  1. Încorporarea Cunoștințelor Anterioare (Alegerea Priorului):
    • Cum pot experții clinici să își cuantifice cunoștințele pentru a formula distribuții prior?
    • Ce tipuri de priori sunt potrivite (vagi vs. informativi)?
    • Cum se poate evalua impactul alegerii priorului (analiza de senzitivitate)?
  2. Interpretarea Beneficiilor Clinice și a Riscurilor:
    • Cum poate abordarea Bayesiană să ajute la înțelegerea probabilității ca un pacient individual să beneficieze de un tratament?
    • Cum schimbă metodele Bayesiene comunicarea rezultatelor (ex: probabilități directe pentru ipoteze)?
  3. Aplicații în Medicina Personalizată și Adaptativă:
    • Cum s-ar putea aplica actualizarea Bayesiană secvențială pentru a rafina modele predictive sau strategii de tratament pentru pacienți individuali?
    • Cum pot design-urile Bayesiene să facă studiile clinice adaptive mai etice și eficiente?

2.10 Dincolo de Valoarea p: Vizualizarea Mărimii Efectului și a Relevanței Clinice

“Am obținut un p=0.04! Am descoperit ceva important?”

Nu neapărat! Să vedem de ce o valoare p mică nu este Sfântul Graal și de ce mărimea efectului și relevanța clinică sunt mult mai importante pentru pacienții noștri.

Valoarea p a devenit omniprezentă în raportarea cercetării medicale, dar are limitări semnificative și este adesea misinterpretată. O valoare p semnificativă statistic (de exemplu, p<0.05) indică doar că rezultatele observate (sau rezultate mai extreme) sunt improbabile sub ipoteza nulă (H0 - de obicei, ipoteza lipsei unui efect sau a unei diferențe). Valoarea p nu indică mărimea, direcția sau importanța clinică a unui efect.

Este esențial să depășim gândirea binară “semnificativ/nesemnificativ” bazată doar pe valoarea p. Această abordare simplistă nu ne ajută să ințelegem importanța reală a rezultatelor pentru pacienți. Valoarea p e ca alarma de fum – doar piuie dacă e ceva fum, piuie în 95% din situațiile în care e fum, dar mai piuie și degeaba uneori. Această goană după valori p sub 0.05 a condus la nenumărate studii care taie pisica în felii și apoi publică doar felia care arată “semnificativ” statistic.

Valoile p nu ne oferă informații directe despre magnitudinea efectului sau relevanța sa clinică. De aceea, raportarea și vizualizarea mărimii efectului (effect size), alături de intervalele de încredere sau credibilitate, este crucială pentru o interpretare completă și informată. Un interval e ca o cameră cu infraroșu – îți arată unde e focul, cât de mare e și cât de sigur ești de locație. Pragul de relevanță clinică (sau “smallest worthwhile difference”) ar trebui, pe cât posibil, definit a priori.

Să explorăm o abordare mai nuanțată prin vizualizarea mărimii efectului alături de semnificația statistică și un prag ipotetic de relevanță clinică, folosind trei exemple reprezentative din practica medicală:

  1. Studiul 1 (MinuStat): “Medicamentul MinuStat reduce colesterolul LDL cu o medie de 3 mg/dL (p=0.002) într-un studiu masiv pe 20.000 de pacienți.” Statistic, e clar că există un efect. Dar clinic, o reducere de 3 mg/dL este suficientă pentru a schimba managementul unui pacient sau pentru a preveni un eveniment cardiovascular?

  2. Studiul 2 (PromiCard): “Medicamentul PromiCard, administrat pacienților post-infarct, a arătat o reducere a riscului relativ de re-infarct cu 30% (p=0.25) într-un studiu pilot pe 40 de pacienți.” Valoarea p este mare, deci ‘statistic nesemnificativ’. Ar trebui să abandonăm cercetarea acestui medicament promițător doar din cauza puterii statistice mici a studiului pilot?

  3. Studiul 3 (Eficacix): “Antibioticul Eficacix reduce mortalitatea în sepsis sever de la 40% la 30% (diferență absolută de 10%; p=0.01, CI95% pentru diferența de risc: [2%, 18%]) într-un studiu multicentric pe 500 pacienți.” Aici, efectul este atât statistic semnificativ, cât și clinic extrem de relevant.

Code
# Simulăm date pentru trei studii
# set.seed(505) # Seed-ul este deja setat global
n_per_group_study1 <- 120 # Eșantion mare
n_per_group_study2 <- 20  # Eșantion mic
n_per_group_study3 <- 40  # Eșantion mediu

# Studiul 1: Efect mic, dar statistic semnificativ (datorită N mare)
study1_control <- rnorm(n_per_group_study1, mean = 100, sd = 10)
study1_treatment <- rnorm(n_per_group_study1, mean = 102, sd = 10) # Efect mic: 2 unități
study1_ttest <- t.test(study1_treatment, study1_control)
study1_data <- tibble(
  group = factor(rep(c("Control", "Tratament"), each = n_per_group_study1)),
  outcome = c(study1_control, study1_treatment),
  study_label_short = "Studiu 1"
)

# Studiul 2: Efect moderat, dar nesemnificativ statistic (datorită N mic)
study2_control <- rnorm(n_per_group_study2, mean = 100, sd = 15)
study2_treatment <- rnorm(n_per_group_study2, mean = 108, sd = 15) # Efect moderat: 8 unități
study2_ttest <- t.test(study2_treatment, study2_control)
study2_data <- tibble(
  group = factor(rep(c("Control", "Tratament"), each = n_per_group_study2)),
  outcome = c(study2_control, study2_treatment),
  study_label_short = "Studiu 2"
)

# Studiul 3: Efect mare și semnificativ statistic
study3_control <- rnorm(n_per_group_study3, mean = 100, sd = 10)
study3_treatment <- rnorm(n_per_group_study3, mean = 112, sd = 10) # Efect mare: 12 unități
study3_ttest <- t.test(study3_treatment, study3_control)
study3_data <- tibble(
  group = factor(rep(c("Control", "Tratament"), each = n_per_group_study3)),
  outcome = c(study3_control, study3_treatment),
  study_label_short = "Studiu 3"
)

# Combinăm datele studiilor
all_studies_data <- bind_rows(
  mutate(study1_data, study_id = 1, p_val = study1_ttest$p.value, effect = study1_ttest$estimate[1]-study1_ttest$estimate[2], ci_low = study1_ttest$conf.int[1], ci_high = study1_ttest$conf.int[2]), # mean(treat) - mean(control)
  mutate(study2_data, study_id = 2, p_val = study2_ttest$p.value, effect = study2_ttest$estimate[1]-study2_ttest$estimate[2], ci_low = study2_ttest$conf.int[1], ci_high = study2_ttest$conf.int[2]),
  mutate(study3_data, study_id = 3, p_val = study3_ttest$p.value, effect = study3_ttest$estimate[1]-study3_ttest$estimate[2], ci_low = study3_ttest$conf.int[1], ci_high = study3_ttest$conf.int[2])
)

# Definim pragul de relevanta clinica
prag_relevanta_clinica <- 5

# Pregatim etichetele pentru facet-uri
study_labels_full <- all_studies_data |>
  group_by(study_id, study_label_short, p_val, effect, ci_low, ci_high) |>
  summarise(.groups="drop") |>
  distinct(study_id, .keep_all = TRUE) |> # Asiguram un rand per studiu
  mutate(
    p_text = ifelse(p_val < 0.001, "p < 0.001", paste0("p = ", round(p_val, 3))),
    effect_text = paste0("Dif. medie: ", round(effect,1), " u."),
    ci_text = paste0("IC95%: [", round(ci_low,1), ", ", round(ci_high,1), "]"),
    relevanta_text = case_when(
      abs(effect) >= prag_relevanta_clinica & ci_low * sign(effect) >= prag_relevanta_clinica * sign(effect) ~ "Clinic Relevant (Cert)", # Intregul CI e relevant
      abs(effect) >= prag_relevanta_clinica ~ "Clinic Relevant (Potențial)", # Efectul e relevant, dar CI incert
      TRUE ~ "Clinic Nerelevant (Probabil)"
    ),
    full_label = paste0(study_label_short, "\n", effect_text, ", ", ci_text, "\n", p_text, " | ", relevanta_text)
  )

all_studies_data <- all_studies_data |> 
  left_join(study_labels_full |> select(study_id, full_label), by="study_id")

all_studies_data$full_label <- factor(all_studies_data$full_label, levels = unique(study_labels_full$full_label[order(study_labels_full$study_id)])) # Asiguram ordinea corecta

Acum să vizualizăm aceste studii, evidențiind atât semnificația statistică, cât și relevanța clinică:

Code
plot_effect_size <- ggplot(all_studies_data, aes(x = group, y = outcome, fill = group)) +
  geom_boxplot(alpha = 0.6, width = 0.6, outlier.shape = NA) +
  ggbeeswarm::geom_quasirandom(alpha = 0.3, dodge.width = 0.6, size=1, color="grey30") + 
  stat_summary(fun = mean, geom = "point", shape = 23, size = 3.5, fill = "white", color="black",
               position = position_dodge(width = 0.6)) +
  # Cream un dataframe separat pentru pragurile de relevanta clinica
  geom_hline(data = all_studies_data %>%
               filter(group=="Control") %>%
               group_by(full_label) %>% 
               summarise(mean_control = mean(outcome), .groups="drop") %>%
               mutate(upper_threshold = mean_control + prag_relevanta_clinica),
             aes(yintercept = upper_threshold),
             linetype = "dotted", color = "darkgreen", linewidth = 1) +
  geom_hline(data = all_studies_data %>%
               filter(group=="Control") %>%
               group_by(full_label) %>% 
               summarise(mean_control = mean(outcome), .groups="drop") %>%
               mutate(lower_threshold = mean_control - prag_relevanta_clinica),
             aes(yintercept = lower_threshold),
             linetype = "dotted", color = "darkgreen", linewidth = 1) +
  facet_wrap(~ full_label, ncol = 3) + 
  scale_fill_manual(values = c("Control" = "skyblue", "Tratament" = "salmon"), guide = "none") +
  labs(
    title = "Dincolo de Valoarea p: Mărimea Efectului și Relevanța Clinică",
    subtitle = paste0("Compararea a trei studii. Pragul de relevanță clinică este o diferență de >", prag_relevanta_clinica, " unități (linii verzi punctate)."),
    x = "Grup",
    y = "Valoarea Rezultatului Clinic",
    caption = "Notă: Diamantele reprezintă media grupului. Punctele sunt date individuale."
  ) +
  theme(
    strip.text = element_text(face = "bold", size = rel(0.9)),
    plot.subtitle = element_text(margin = margin(b = 15)),
    axis.text.x = element_text(angle = 10, hjust=0.7)
  ) + 
  # Adnotare pentru pragul de relevanta, o singura data per facet
  # Folosim un truc cu un dataframe mic pentru a plasa adnotarea
  geom_text(data = tibble(full_label = levels(all_studies_data$full_label)[1], # Doar pentru primul facet
                          group="Control", # Pozitie x arbitrara
                          outcome = Inf), # Pozitie y in partea de sus
            label = paste0(" Prag Relevanță Clinică (+/-",prag_relevanta_clinica,"u.)"), 
            color = "darkgreen", vjust = 1.5, hjust=0.5, size = 3, fontface="italic",
            check_overlap = TRUE)
print(plot_effect_size)

Compararea mărimii efectului, semnificației statistice și relevanței clinice (prag > 5 unități) între trei studii ipotetice.

Acest grafic ilustrează trei scenarii comune în cercetarea medicală:

  1. Studiul 1: Are un efect statistic semnificativ (p mic), dar diferența este prea mică pentru a fi clinic relevantă (nu atinge pragul de +/-5 unități). Aceasta este o situație frecventă în studiile cu eșantioane foarte mari (N mare), unde chiar și efecte minuscule pot atinge semnificația statistică.
  2. Studiul 2: Prezintă un efect care ar putea fi clinic relevant (diferența medie este >5 unități), dar nu atinge semnificația statistică (p mare), probabil din cauza dimensiunii mici a eșantionului (N mic) și/sau variabilității mari. Un astfel de rezultat ar putea fi un “fals negativ” (eroare de tip II) și ar putea merita investigat în continuare cu un eșantion mai mare.
  3. Studiul 3: Demonstrează un efect care este atât statistic semnificativ (p mic) cât și clinic relevant (diferența medie >5 unități)—scenariul ideal pentru a informa practica clinică.

Stabilirea pragului de relevanță clinică este un pas important și adesea subiectiv, bazat pe consensul experților, impactul asupra calității vieții pacientului, costuri etc.

2.10.1 Punct de Reflecție Clinică și Exercițiu (valoare p)

  1. Interpretare Clinică: Dacă ați fi un clinician care evaluează aceste trei studii pentru a decide dacă să adopte un nou tratament, cum v-ar influența aceste vizualizări decizia, comparativ cu simpla raportare a valorilor p și a diferențelor medii?
  2. Relevanță vs. Semnificație: Pentru domeniul dvs. de practică, care ar fi unele exemple de “praguri de relevanță clinică” (smallest worthwhile difference) pentru diverse rezultate? Cum se determină ce magnitudine a efectului este suficient de mare pentru a justifica schimbări în practica clinică sau pentru a fi considerată importantă pentru pacient?
  3. Exercițiu: Ce ați spune unui coleg care afirmă că ar trebui să implementeze tratamentul din Studiul 1 deoarece este “dovedit științific” (p mic)? Dar despre Studiul 2, care este “nesemnificativ statistic”?

2.11 Abordarea Bootstrapping: Soluția Când Datele Clinice Nu Respectă “Regulile”

Problema clinică: Ca medici cercetători, ne confruntăm frecvent cu date care nu respectă regulile stricte ale statisticii clasice. Gândiți-vă la:

  • Pacientul cu sepsis care are o valoare a proocalcitoninei de 150 ng/mL când restul grupului are sub 10 ng/mL
  • Distribuția timpilor de recuperare post-chirurgicali care este puternic înclinată spre dreapta (majoritatea pacienților se recuperează în 5-7 zile, dar unii necesită 3-4 săptămâni)
  • Studiul pe o boală rară unde aveți doar 15-20 de pacienți total

În aceste situații, metodele statistice standard (precum testul t) care presupun distribuții normale sau eșantioane mari pot genera rezultate înșelătoare sau intervale de încredere neprecise.

Soluția: Bootstrapping – o metodă intuitivă care reflectă un principiu simplu: “dacă nu poți repeta studiul în realitate, simulează repetițiile cu datele pe care le ai deja.”

Cum funcționează, explicat simplu:

  1. Imaginați-vă numele tuturor pacienților scrise pe bilete într-o urnă
  2. Extragem un bilet, îi notăm datele, apoi punem biletul ÎNAPOI în urnă
  3. Repetăm până avem același număr de bilete ca în studiul original
  4. Calculăm statistica dorită (ex: mediana) pentru acest nou “eșantion bootstrap”
  5. Repetăm pașii 2-4 de mii de ori, obținând mii de valori pentru statistica noastră

Această distribuție de valori ne arată cum ar putea varia statistica dacă am repeta studiul de multe ori. Din ea putem construi intervale de încredere robuste fără a face presupuneri despre forma distribuției originale.

Bootstrapping reprezintă o punte între lumile frecventistă și bayesiană, oferind o modalitate de a genera intervale de încredere fără a face asumpții despre distribuția teoretică a datelor sau a statisticii de interes.

2.11.1 Procesul de bază al bootstrapping:

  1. Resămplare aleatorie cu înlocuire din datele originale (creând un “eșantion bootstrap”)
  2. Calcularea statisticii de interes (ex: media, mediana, coeficientul de regresie) pe acest eșantion
  3. Repetarea acestor pași de multe ori (tipic 1000-10000 de iterații)
  4. Utilizarea distribuției empirice a statisticii peste toate iterațiile pentru a construi intervale de încredere

2.11.2 Avantajele Bootstrapping:

  • Nu necesită asumpții despre forma distribuției
  • Funcționează pentru statistici complexe, fără formule analitice ușor de derivat
  • Poate gestiona bine date asimetrice sau cu outlieri
  • Poate fi utilizat pentru aproape orice statistică (medii, mediane, corelații, etc.)

2.11.3 Exemplu Medical: Estimarea Medianei Timpului de Normalizare a Markerilor Inflamatori

“Vrem să estimăm mediana timpului până la normalizarea markerilor inflamatori la pacienții cu pancreatită acută. Datele sunt probabil asimetrice (majoritatea se normalizează într-un interval, dar câțiva pot avea o evoluție prelungită). Media ar fi influențată de cazurile extreme. Mediana este mai potrivită. Cum estimăm incertitudinea medianei? Prin bootstrapping!”

Code
# Date ipotetice (zile până la normalizarea markerilor inflamatori în pancreatită) - distribuție asimetrică
set.seed(303)
zile_normalizare_markeri <- c(rpois(40, lambda = 5), 15, 18, 22, 25) # Majoritatea între 0-10 zile, câteva valori mai mari

# Vizualizăm distribuția inițială a datelor
hist(zile_normalizare_markeri, breaks=seq(0, max(zile_normalizare_markeri)+1, by=1), 
     main="Distribuția Zilelor de Normalizare a Markerilor Inflamatori", 
     xlab="Zile", 
     ylab="Frecvență",
     col="lightcoral", border="black", xaxt='n')
axis(1, at = seq(0, max(zile_normalizare_markeri)+1, by = 2)) # Axe x mai clare
abline(v = median(zile_normalizare_markeri), col = "blue", lwd = 2, lty=2)
legend("topright", legend=paste("Mediana Observată =", round(median(zile_normalizare_markeri),1), "zile"), 
       col="blue", lty=2, lwd=2, bty="n", cex=0.8)

Distribuția bootstrap a medianelor timpului de normalizare a markerilor inflamatori. Linia albastră indică mediana observată în eșantionul original, iar liniile roșii punctate delimitează intervalul de încredere bootstrap de 95%.
Code
# Funcția care calculează statistica de interes (mediana) pentru fiecare eșantion bootstrap
calcul_mediana_bootstrap <- function(data, indici) {
  return(median(data[indici]))
}

# Aplicăm bootstrapping-ul
numar_replici_bootstrap <- 5000 # Un număr mare de replici pentru stabilitate
rezultate_bootstrap_mediana_markeri <- boot(data = zile_normalizare_markeri, 
                                            statistic = calcul_mediana_bootstrap, 
                                            R = numar_replici_bootstrap)

# Calculăm intervalul de încredere bootstrap de 95% folosind metoda percentilelor
nivel_incredere_boot <- 0.95
ci_bootstrap_mediana_markeri <- boot.ci(rezultate_bootstrap_mediana_markeri, type = "perc", conf = nivel_incredere_boot)

cat("Mediana observată a zilelor de normalizare a markerilor:", median(zile_normalizare_markeri), "zile\n")
Mediana observată a zilelor de normalizare a markerilor: 5 zile
Code
cat("Interval de încredere Bootstrap", nivel_incredere_boot*100, "% pentru mediană (metoda percentilelor): [",
    round(ci_bootstrap_mediana_markeri$percent[4], 1), ", ", 
    round(ci_bootstrap_mediana_markeri$percent[5], 1), "] zile\n")
Interval de încredere Bootstrap 95 % pentru mediană (metoda percentilelor): [ 4 ,  6 ] zile
Code
# Vizualizarea distribuției medianelor obținute prin bootstrapping
df_mediane_bootstrap_markeri <- data.frame(mediane_simulate = rezultate_bootstrap_mediana_markeri$t)
ggplot(df_mediane_bootstrap_markeri, aes(x = mediane_simulate)) +
  geom_histogram(aes(y = after_stat(density)), bins = length(unique(df_mediane_bootstrap_markeri$mediane_simulate)), 
                 fill = "lightseagreen", color = "darkslategrey", alpha = 0.7) +
  geom_vline(xintercept = ci_bootstrap_mediana_markeri$percent[4:5], color = "red4", linetype = "dashed", linewidth = 1.2) +
  geom_vline(xintercept = median(zile_normalizare_markeri), color = "navyblue", linetype = "solid", linewidth = 1.2) +
  annotate("text", x = median(zile_normalizare_markeri), y = Inf, 
             label = paste("Mediana Originală =", round(median(zile_normalizare_markeri),1)), 
             vjust = 1.5, hjust = ifelse(median(zile_normalizare_markeri) < mean(range(df_mediane_bootstrap_markeri$mediane_simulate)), -0.1, 1.1),
             color="navyblue", size=3.5, fontface="bold") +
  labs(title = "Distribuția Bootstrap a Medianelor Timpului de Normalizare a Markerilor",
       subtitle = paste0("Bazat pe ", numar_replici_bootstrap, " eșantioane bootstrap. ",
                         "IC ", nivel_incredere_boot*100, "% (percentile): [", 
                         round(ci_bootstrap_mediana_markeri$percent[4],1), ", ", 
                         round(ci_bootstrap_mediana_markeri$percent[5],1), "] zile."),
       x = "Mediana Zilelor de Normalizare (în eșantioanele bootstrap)",
       y = "Densitate") +
  theme(plot.title = element_text(size=11), # Ajustare dimensiune font
        plot.subtitle = element_text(size=9)) # Ajustare dimensiune font

Distribuția bootstrap a medianelor timpului de normalizare a markerilor inflamatori. Linia albastră indică mediana observată în eșantionul original, iar liniile roșii punctate delimitează intervalul de încredere bootstrap de 95%.

În acest exemplu, observăm cum bootstrapping-ul ne permite să estimăm un interval de încredere pentru mediană fără a face presupuneri despre distribuția datelor. Acest lucru este deosebit de util pentru date medicale care sunt adesea asimetrice, cum ar fi timpii de normalizare a markerilor inflamatori în pancreatită. Histograma arată distribuția medianelor obținute din 5000 de eșantioane bootstrap, cu intervalul de încredere de 95% marcat de liniile roșii punctate. Această abordare ne oferă o estimare robustă a incertitudinii medianei, chiar și pentru date care nu urmează o distribuție normală.

2.12 Cazuri Practice: Când să utilizăm metode robuste în cercetarea medicală

Iată câteva situații specifice din cercetarea medicală în care metodele statistice robuste (precum bootstrapping, teste neparametrice, sau statistici robuste) sunt esențiale:

  1. Atunci când datele conțin outlieri clinici relevanți:
  • Exemplu clinic: În studii despre costurile spitalizării, pacienții cu complicații severe pot avea costuri de 10-20 ori mai mari decât media. Acești outlieri sunt pacienți reali care nu pot fi eliminați din analiză, dar pot distorsiona complet mediile. Utilizarea medianei și a testelor neparametrice (Mann-Whitney în loc de t-test) poate oferi o analiză mai reprezentativă.
  • Abordare: Folosiți statistici robuste la outlieri (mediană, IQR, MAD), teste neparametrice (Wilcoxon, Mann-Whitney), sau estimări bootstrap ale CI-urilor pentru medie.
  1. Pentru distribuții clinic asimetrice:
  • Exemplu clinic: Durata spitalizării, timpul de recuperare, numărul de episoade de durere sunt adesea puternic asimetrice spre dreapta - majoritatea pacienților au valori mici, dar câțiva au valori foarte mari.
  • Abordare: Raportarea medianei și quartilelor, transformarea logaritmică a datelor înainte de teste parametrice, sau utilizarea metodelor de bootstrap.
  1. Când lucrăm cu boli rare și eșantioane mici:
  • Exemplu clinic: În studiile despre afecțiuni rare sau subgrupuri specifice (ex: copii cu boli genetice rare), mărimea eșantionului poate fi inevitabil mică (N < 30), făcând asumpțiile de normalitate dificil de verificat sau de satisfăcut.
  • Abordare: Metode exacte (ex: testul exact Fisher), permutări, sau bootstrap pentru intervalele de încredere.
  1. Heteroscedasticitate în studii comparative:
  • Exemplu clinic: În studiile comparand un tratament nou cu unul standard, grupul cu tratament nou poate avea o varianță mult mai mare în răspuns – unii pacienți răspund excelent, alții deloc, spre deosebire de tratamentul standard care produce un răspuns mai previzibil.
  • Abordare: Teste t cu corecție pentru varianțe inegale (Welch), transformarea datelor, sau metode de bootstrap.
  1. Pentru analiza de sensibilitate și verificarea robustenței concluziilor:
  • Exemplu clinic: În studiile observaționale sau meta-analize, concluziile pot depinde de influența unor studii specifice sau de metodologia exactă aleasă. Analiza de sensibilitate prin metode robuste verifică dacă rezultatele rămân consistente în diferite condiții.
  • Abordare: Re-analiza datelor excluzând pe rând anumite observații sau folosind metode alternative, comparații între modelele parametrice și abordări de bootstrap.

2.12.1 Avantaje în Contextul Clinic

Mai mult decât rigoarea statistică, metodele robuste oferă beneficii practice pentru cercetarea și practica medicală:

  • Modelează mai bine realitățile clinice: Datele medicale rareori urmează distribuții “ideale”. Metodele robuste acceptă această realitate și se adaptează la ea.

  • Reduc riscul de concluzii false: Metodele robuste sunt mai puțin susceptibile la a produce semnificații statistice false bazate pe date atipice sau pe nerespectarea asumpțiilor.

  • Reflectă eterogenitatea reală a pacienților: În loc să forțeze datele în modele care presupun omogenitate, metodele robuste pot capta mai bine variabilitatea naturală între pacienți.

Prin înțelegerea acestor metode robuste și aplicarea lor acolo unde este necesar, creștem șansele de a obține rezultate fiabile, replicabile și interpretabile corect, chiar și în prezența datelor care nu respectă asumpțiile clasice. Robustețea statisticală este un atribut esențial al cercetării de calitate, mai ales în domeniul medical, unde consecințele concluziilor eronate pot fi semnificative.

3 Concluzie pentru Replicabilitate în Cercetarea Medicală

3.1 Integrarea Vizualizării Distribuțiilor în Decizii Clinice

Iată un exemplu concret de cum vizualizarea distribuțiilor poate îmbunătăți deciziile clinice:

Vizualizare standard: Un medic vede că un medicament reduce tensiunea arterială cu 10 mmHg în medie, cu un interval de încredere de 95% [5, 15].

Vizualizare distribuțională îmbunătățită: Medicul vede o vizualizare a distribuției complete a efectelor prevăzute, inclusiv riscurile de hipotensiune (TA prea scăzută) și șansele de non-răspuns. Această vizualizare arată că: - 65% din pacienți au o scădere benefică între 5-15 mmHg - 15% experientează scăderi extreme (>20 mmHg) cu risc de simptome hipotensive - 20% au răspuns minim sau absent (<5 mmHg)

Această informație distribuțională permite medicului să discute cu pacientul riscurile și beneficiile în mod mult mai nuanțat, poate să identifice subgrupuri cu risc mare de hipotensiune, sau să sugereze monitorizare mai atentă pentru anumiți pacienți.

Mai multe probleme intercorelate contribuie la această criză: 1. Gândirea binară bazată pe valoarea p: Obsesia pentru p < 0.05 a condus la fenomene precum “p-hacking” (manipularea analizelor pentru a obține semnificație statistică) și “HARKing” (Hypothesizing After Results are Known - formularea ipotezelor după ce rezultatele sunt cunoscute). 2. Raportarea selectivă: Publicarea predilectă a rezultatelor “pozitive” (statistic semnificative), ignorând rezultatele “negative” care pot fi la fel de informative - ceea ce creează “file drawer problem” (problema sertarului), când rezultatele nesemnificative rămân nepublicate. 3. Lipsa transparenței în analiza datelor: Metodele statistice inadecvate, asumpții neverificate, strategii de analiză nedocumentate complet, sau coduri și date nepublicate. 4. Confundarea semnificației statistice cu importanța clinică: Concentrarea pe p-valori în defavoarea mărimii efectului și a relevanței practice. 5. Modelări simpliste: Ignorarea interacțiunilor complexe și a eterogenității în modelare, ducând la concluzii excesiv de generalizate.

3.2 Principii Practice pentru Cercetare Replicabilă

Pe lângă principiile teoretice, puteți implementa următoarele practici concrete: 1. Înregistrarea prospectivă a studiilor (preregistration): Documentați ipotezele și metodele de analiză înainte de colectarea datelor. 2. Planuri de analiză statistice detaliate: Creați și urmați un plan de analiză clar, discutând deschis orice deviație de la acesta în publicații. 3. Analize de senzitivitate: Verificați cât de robuste sunt rezultatele la modificări minore ale strategiei de analiză sau la excluderea datelor extreme. 4. Raportarea completă a rezultatelor: Includeți mărimea efectului și intervalele de încredere alături de p-valori. 5. Partajarea codului și datelor: Faceți transparențe datele și codul de analiză pentru a permite verificarea și replicația independentă. 6. Acceptarea “rezultatelor negative”: Considerați că rezultatele care nu susțin ipoteza inițială sunt la fel de valoroase științific ca cele “pozitive”.

Prin adoptarea acestor principii, nu doar că deveniți cercetători mai eficienți, ci contribuiți activ la rezolvarea crizei replicabilității în știință și medicină, producând cercetări mai credibile, mai transparente și, în ultimă instanță, mai utile pentru comunitatea medicală și pacienți.