Paradoxul lui Simpson într -o regresie logistică

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe R funcționeazăși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)


Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.

Paradoxul lui Simpson este atunci când o tendință care este prezentă în diferite grupuri de date pare să dispară sau chiar inversă atunci când aceste grupuri sunt combinate. Se vede exemple în acest sens adesea în lucruri precum studiile medicale, iar fenomenul se datorează, în general, uneia sau mai multor variabile de confuzie nemodelate, sau poate diferitelor presupuneri cauzale.

Ca parte a unui proiect la care lucram, mi -am dorit un exemplu dincolo de o simplă regresie liniară în care unul dintre coeficienții modelului avea un semn clar incorect. Există mai multe motive pentru care s -ar putea întâmpla semne neașteptate: separarea sau separarea cvasi a datelor fiind cele evidente. Dar paradoxul lui Simpson este o altă cauză posibilă. Proiectul original a sfârșit prin a nu avea nevoie de exemplu, dar din moment ce l -am avut, m -am gândit că îl voi scrie, din moment ce nu am văzut niciodată paradoxul lui Simpson prezentat în acest fel înainte.

Exemplu sintetic: încercare de pierdere în greutate

Aceasta este o declarație a problemei în care ne-am aștepta ca coeficienții unei regresii logistice să fie non-negative (cu excepția interceptării).

Luați în considerare un proces care testează eficacitatea unui regim alimentar specific (să zicem post intermitent 16/8, pe care îl vom numi ifasting) și un regim de exerciții specifice (o plimbare rapidă de 30 de minute în fiecare zi, pe care doar o vom suna exercise) Obiectivul („succes”) este de a pierde cel puțin cinci kilograme până la sfârșitul perioadei de încercare. Am creat trei grupuri de tratament, după cum urmează:

  • 200 de subiecți încearcă să exercite singuri
  • 300 de subiecți încearcă IFasting singur
  • 300 de subiecți încearcă IFASTING plus exercițiul

Înainte de proces, toți subiecții au condus stiluri de viață destul de sedentare și nu au fost dieta în niciun mod formal.

Pentru acești subiecți, s -ar putea aștepta în mod rezonabil ca nici exercițiul și nici ifasting -ul Mai puțin succes pentru a pierde în greutate decât a nu face nimic. De asemenea, s -ar aștepta în mod rezonabil că IFASTING plus exercițiul nu ar trebui să facă mai rău decât să facă unul singur. Prin urmare, modelarea rezultatelor unui astfel de experiment ca regresie logistică ar trebui să conducă la un model în care coeficienții şi Sunt ambele non-negative, deoarece orice tratament ar trebui să crească (sau cel puțin, să nu scadă) șansele ca subiectul să piardă în greutate.

Să arătăm un exemplu în care așteptările noastre nu sunt îndeplinite. Cel mai simplu mod de a face acest lucru este de a genera un set de date care are paradoxul lui Simpson ascuns în el.

În primul rând, să încărcăm pachetele de care avem nevoie.

Afișați codul
library(poorman) # or dplyr
library(ggplot2)
library(kableExtra)
library(WVPlots)

Iată o funcție care va genera un subset specific de date, după cum este necesar.

# ifasting: 1 if this group fasted, else 0
# exercise: 1 if this group exercised, else 0
# total: total number of subjects in this group
# successes:  number of subjects who successfully lost weight
# label: label for the group.
generate_samples = function(ifasting, exercise, total, successes, label) {
  failures = total-successes
  data.frame(ifasting = ifasting,
             exercise = exercise,
             success = c(rep(1, successes), rep(0, failures)),
             label=label)
}

Efecte ale populației ascunse, nemodelate

Să presupunem acum că, necunoscut cercetătorilor, există două sub -populații în rândul subiecților. Aceste două sub -populații răspund diferit la exercițiile fizice și la regimurile de post intermitente. Deci, vom genera datele noastre sintetice de către populație.

Populația a

Prima populație, populația A, răspunde destul de bine la postul intermitent. Să creăm doar această populație. Acest următor bloc de cod generează populația A, pregătește datele pentru complot și le complotează.

Afișați codul
popA = data.table::rbindlist(list(
  generate_samples(ifasting=0, exercise=1, total=100, successes=2, "Population A"),
  generate_samples(ifasting=1, exercise=0, total=200, successes=160, "Population A"),
  generate_samples(ifasting=1, exercise=1, total=100, successes=90, "Population A")
))

#| code-fold: true
#| code-summary: "Show the code"
popA$treatment = with(popA, ifelse(ifasting, ifelse(exercise, 'both', 'ifast alone'),
                                   ifelse(exercise, 'exercise alone', 'none')))
popA$treatment = factor(popA$treatment,
                            levels = c('none', 'exercise alone', 'ifast alone', 'both'))
popA$outcome = factor(with(popA, ifelse(success==1, "success", "failure")),
                      levels = c('success', 'failure'))

pvals = c(success="darkblue", failure="gray")

ggplot(popA, aes(x=treatment, color=outcome, fill=outcome)) + 
  geom_bar() +
  scale_fill_manual(values=pvals) + 
  scale_color_manual(values=pvals) +
  ggtitle("Outcomes for population A") + 
  theme(legend.position="bottom")

Dacă ne uităm la ratele de succes, vom vedea că (așa cum era de așteptat) subiecți care exercită atât și practică postul intermitent, pierd mai mult în greutate decât subiecții care fac unul sau altul singur.

Afișați codul
df1 = popA |>
  group_by(treatment) |>
  summarize(success_rate=mean(success)) |>
  ungroup() 

df2 = popA |>
  summarize(success_rate = mean(success)) |>
  mutate(treatment = "overall") 

rbind(df1, df2) |>
  knitr::kable(digits=3, caption = "Success rates, Population A")
Ratele de succes, populația a
exercițiu singur 0,02
ifast singur 0,80
ambele 0,90
în general 0,63

Populație b

Există, de asemenea, o altă populație, populația B, care are ceea ce s -ar putea numi un metabolism „mai lipicios”. Pentru ei, postul intermitent nu este la fel de eficient.

Afișați codul
popB = data.table::rbindlist(list(
  generate_samples(ifasting=0, exercise=1, total=100, successes=1, "Population B"),
  generate_samples(ifasting=1, exercise=0, total=100, successes=40, "Population B"),
  generate_samples(ifasting=1, exercise=1, total=200, successes=100, "Population B")
))


#| code-fold: true
#| code-summary: "Show the code"
popB$treatment = with(popB, ifelse(ifasting, ifelse(exercise, 'both', 'ifast alone'),
                                   ifelse(exercise, 'exercise alone', 'none')))
popB$treatment = factor(popB$treatment,
                            levels = c('none', 'exercise alone', 'ifast alone', 'both'))
popB$outcome = factor(with(popB, ifelse(success==1, "success", "failure")),
                      levels = c('success', 'failure'))



pvals = c(success="darkblue", failure="gray")

ggplot(popB, aes(x=treatment, color=outcome, fill=outcome)) + 
  geom_bar() +
  scale_fill_manual(values=pvals) + 
  scale_color_manual(values=pvals) +
  ggtitle("Outcomes for population B") + 
  theme(legend.position="bottom")

Din nou, subiecții care exercită atât și practică postul intermitent sunt cei mai de succes, dar, în general, ratele de succes ale populației B nu sunt la fel de bune ca în populația A.

Afișați codul
df1 = popB |>
  group_by(treatment) |>
  summarize(success_rate=mean(success)) |>
  ungroup() 

df2 = popB |>
  summarize(success_rate = mean(success)) |>
  mutate(treatment = "overall") 

rbind(df1, df2) |>
  knitr::kable(digits=3, caption = "Success rates, Population B")
Rate de succes, populație B
exercițiu singur 0,010
ifast singur 0,400
ambele 0,500
în general 0,352

Unul dintre lucrurile de observat despre acest design experimental este că, chiar înainte de a ține cont de tipurile de populație ascunse, grupurile de tratament nu sunt echilibrate. Am văzut acest lucru în declarația inițială de mai sus (200 de subiecți încearcă să facă exerciții fizice; 300 de subiecți încearcă să fie ifasting singuri; 300 de subiecți încearcă iFasting plus exercițiu). Acest lucru este adesea ceea ce se întâmplă în studiile experimentale cu subiecții umani. Pe măsură ce subiecții pot renunța la un motiv sau altul. Grupurile de tratament dezechilibrate tind să fie norma și în analizele retrospective.

Acest dezechilibru va fi și mai pronunțat atunci când vom ține cont și de tipurile de populație ascunse.

Afișați codul
bothpops = rbind(popA, popB)
palette = c('Population A' = '#1b9e77', 'Population B' = '#d95f02')
ggplot(bothpops, aes(x=treatment, color=label, fill=label)) + 
  geom_bar() + 
  scale_fill_manual(values=palette) + 
  scale_color_manual(values=palette) +
  ggtitle("Treatment Group Sizes, with population labels") + 
  theme(legend.position="bottom")

Acest dezechilibru al populației face parte din ceea ce poate provoca paradoxul lui Simpson.

Modelare

Acum să ne potrivim unui model de regresie logistică pentru a încerca să deducem efectele diferitelor tratamente asupra pierderii în greutate. O vom face mai întâi pe întreaga populație, deoarece aceasta a fost sarcina inițială.

Afișați codul
tab_coeff = function(model, caption) {
  coeff = summary(model)$coefficients(, c(1, 4)) |>
    as.data.frame()

  colnames(coeff) = c('Estimate', 'pval')

  # using cell_spec below breaks the digits setting
  # (because of course it does) so round the numbers first.
  coeff = coeff |>
    mutate(Estimate = as.numeric(formatC(Estimate, format="f", digits=3)),
           pval = as.numeric(format(pval, format="g", digits=3)))

  coeff = coeff |>
    mutate(Estimate = cell_spec(Estimate, color=ifelse(Estimate < 0, "red", "black")),
           pval = cell_spec(pval, color=ifelse(pval < 0.05, "darkblue", "darkgray")))

  knitr::kable(coeff, caption=caption)

}

bothpops = rbind(popA, popB)
mAll = glm(success ~ ifasting + exercise, data=bothpops, family=binomial)

tab_coeff(mAll, "Model coefficients, whole population")
Coeficienți de model, populație întreagă
(Intercepta) -4.038 2.72e-11
ifasting 4.731 1.6E-15
exercita -0.147 0,392

Postul intermitent are un coeficient pozitiv, ceea ce înseamnă că postul intermitent este corelat pozitiv cu succesul pierderii în greutate. Dar exercițiul are un negativ coeficientul, implicând exercițiul este corelat negativ cu pierderea în greutate și că a face ambele împreună va fi Mai puțin reușit decât postul intermitent singur!

Și, într -adevăr, dacă ne uităm la rezumatele brute, vom vedea că datele suportă aceste inferențe.

Afișați codul
df1 = bothpops |>
  group_by(treatment) |>
  summarize(success_rate=mean(success)) |>
  ungroup() 

df2 = bothpops |>
  summarize(success_rate = mean(success)) |>
  mutate(treatment = "overall") 

rbind(df1, df2) |>
  knitr::kable(digits=3, caption = "Success rates, entire population")
Rate de succes, întreaga populație
exercițiu singur 0,015
ifast singur 0,667
ambele 0,633
în general 0,491

Acesta este un exemplu al modului în care paradoxul lui Simpson s -ar putea manifesta într -un model de regresie logistică și se datorează variabilei de confuzie nemodificate, tipul de populație. Acest lucru, plus un anumit ghinion în dimensiunile relative ale grupurilor de tratament în ceea ce privește tipul de populație, duce la rezultatele de mai sus, contra intuitive.

Rețineți că am raportat valori p și, în acest caz, coeficientul pentru exerciții fizice este nesemnificativ (la ), implicând că exercițiile fizice nu pot avea niciun efect notabil asupra pierderii în greutate. Cu toate acestea, este posibil să vedem în continuare coeficienți cu semne contra intuitive în populații arbitrar mari, care pot părea apoi semnificative.

Luând în considerare confuzia ascunsă

După cum vă puteți aștepta, dacă suntem capabili să identificăm variabila confuzivă și să o ținem de ea, atunci putem elimina coeficienții negativi paradoxali. Pentru a vedea acest lucru, să modelăm mai întâi populațiile separat și să ne uităm la coeficienții modelului.

Afișați codul
mA = glm(success ~ ifasting + exercise, data=popA, family=binomial)

tab_coeff(mA, "Model coefficients, Population A")
Coeficienții model, populația a
(Intercepta) -4.703 5.82E-09
ifasting 6.089 1.12e-14
exercita 0,811 0.0316
Afișați codul
mB = glm(success ~ ifasting + exercise, data=popB, family=binomial)

tab_coeff(mB, "Model coefficients, Population B")
Coeficienți de model, populația B
(Intercepta) -5.001 1.36E-06
ifasting 4.595 5.97E-06
exercita 0,405 0,103

În ambele cazuri, atât postul intermitent, cât și exercițiile fizice au coeficienți pozitivi, ceea ce indică faptul că ambele activități se corelează pozitiv cu pierderea în greutate.

De asemenea, putem modela întreaga populație, inclusiv eticheta populației ca variabilă.

Afișați codul
mAllplus = glm(success ~ ifasting + exercise + label, data=bothpops, family=binomial)

#| code-fold: true
#| code-summary: "Show the code"
tab_coeff(mAllplus, "Model coefficients, whole population with population labels")
Coeficienți de model, populație întreagă cu etichete de populație
(Intercepta) -4.143 1.69e-11
ifasting 5.584 1.15e-19
exercita 0,523 0.0102
Labelpopularea b -1.917 7.65E-20

Așa cum era de așteptat, ambele ifasting şi exercise acum au pozitiv (și semnificativ, la ) coeficienți, ceea ce indică faptul că ambele acțiuni cresc probabilitatea pierderii în greutate, iar realizarea acestora o crește și mai mult.

Modelul identifică corect, de asemenea, că subiecții de populație de tip B au o rată de succes (semnificativ) mai mică decât subiecții din populația A.

Concluzie

Paradoxul lui Simpson este un caz în care inferența modelului pare să contrazică cunoștințele de domeniu. De obicei, este doar un simptom al unei combinații de prejudecăți variabile omise, studii dezechilibrate sau specificații cauzale greșite (sau poate că nu există o astfel de specificație). Dacă aveți grijă să căutați acest efect, acesta poate oferi, de fapt, indicii pentru o analiză mai bună.

Nina Zumel este un om de știință de date cu sediul în San Francisco, cu peste 20 de ani de experiență în învățarea automată, statistici și analize. Ea este co-fondatorul firmei de consultanță în domeniul științei de date Win-Vector LLC și (cu John Mount) coautorul științei datelor practice cu R, aflat acum în a doua ediție.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.