Visualizzazione post con etichetta Bernoulli. Mostra tutti i post
Visualizzazione post con etichetta Bernoulli. Mostra tutti i post

lunedì 3 agosto 2009

Regressione logistica multipla su variabili qualitative dicotomiche

Nella seconda parte di questo post abbiamo visto come valutare l'effetto di due variabili indipendenti (il fumo e l'alcol) sulla variabile dipendente (insorgenza o meno di tumore). La conclusione ottenuta dall'analisi del chi-quadro di Mantel-Haenszel, era che la condizione tumore/no-tumore non dipendenva dalle due variabili considerate.
Un altro modo per valutare l'associazione è quello di sviluppare un modello di regressione, in questo caso un modello di regressione logistica multipla, poiché Y, X1 e X2 sono bernoulliane (1 o 0). Abbiamo già visto, in quest'altro post, come creare un modello di regressione logistica semplice. Cerchiamo di applicare gli stessi principi anche ai dati che abbiamo già analizzato. In virtù dell'analisi precedente, ci aspettiamo che la variabile dipendente Y dipenda con basso grado dalle due variabili indipendenti X1 (fumo) e X2 (alcol), ossia ci aspettiamo di ottenere dei bassi valori beta1 e beta2. Cerchiamone la conferma.

La tabella sottostante riassume le due tabelle già considerate:



(la tabella è orribile, ma ho qualche problemino con le tabelle in LaTeX !!).

Per prima cosa creiamo un dataframe con tutti i dati, nel modo seguente:


fumo <- c(rep("NO", 2), rep("SI", 2))
alcol <- c(rep("NO", 1),rep("SI", 1))
tumore <- c(rep("NO", 4),rep("SI", 4))
freq <- c(79,16,115,5,76,22,98,8)
data <- data.frame(fumo, alcol, tumore, freq)

> data

fumo alcol tumore freq
1 NO NO NO 79
2 NO SI NO 16
3 SI NO NO 115
4 SI SI NO 5
5 NO NO SI 76
6 NO SI SI 22
7 SI NO SI 98
8 SI SI SI 8


A questo punto possiamo costruire il nostro modello di regressione logistica multipla, con le stesse regole viste nel post sulla regressione logistica semplice. Vi è solo da aggiungere che quando si dispone di due variabili indipendenti, nella formula vengono entrambe dichiarate con un 'più', come potete vedere qui sotto:


fit <- glm(tumore ~ fumo + alcol, weights = freq, data = data, family = binomial)
> summary(fit)

Call:
glm(formula = tumore ~ fumo + alcol, family = binomial, data = data,
weights = freq)

Deviance Residuals:
1 2 3 4 5 6 7 8
-10.263 -5.372 -11.955 -2.909 10.464 4.786 12.289 2.995

Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.05363 0.15620 -0.343 0.731
fumoSI -0.09542 0.20109 -0.475 0.635
alcolSI 0.43477 0.30988 1.403 0.161

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 580.57 on 7 degrees of freedom
Residual deviance: 577.95 on 5 degrees of freedom
AIC: 583.95

Number of Fisher Scoring iterations: 4


La formula del modello di regressione logistica multipla che stiamo cercando è:



Quindi la probabilità che Y assuma valore 1 (presenza di tumore), in funzione delle due variabili dipendenti X1 e X2, è data da quella formula. I 3 coefficienti sono stati stimati, e sono pari a:



Quindi la formula è:



Essendo noti questi parametri, possiamo calcolare diversi valori. Innanzitutto le varia probabilità.

La probabilità di avere tumore in assenza di fumo e alcol è:


La probabilità di avere tumore in presenza di fumo, ma non di alcol, è:


La probabilità di avere tumore in presenza di alcol, ma non di fumo, è:


La probabilità di avere tumore in presenza di alcol e fumo è:


Inoltre possiamo calcolare gli odds, con le seguenti formule:



Infine possiamo stimare gli odds ratio delle due variabili:



Dopo questo piccolo riassunto di formule, un paio di considerazioni. Innanzitutto il modello qui ricreato non è statisticamente significativo, essendo i p-value di tutt'e 3 i coefficienti maggiore di 0.05. Ho proceduto nei calcoli, perchè serva come esempio. In secondo luogo, vediamo che i 3 coefficienti beta hanno valori molto piccoli (e piccoli sono i valori degli OR), proprio come ci aspettavamo dall'analisi col chi-quadro di Mantel-Haenszel. Infine ricordo che tutti i valori riportati in tabella sono assolutamente inventati così come le conclusioni (paradossali: il fumo qui appare un fattore di protezione contro il tumore, cosa assolutamente non vera!).

Per calcolare tutte le formule presentate in R, ricordo come richiamare i valori dei coefficienti (così da poter essere utilizzati nelle formule):

= coef(fit)[1], oppure fit$coefficient[1]
= coef(fit)[2], oppure fit$coefficient[2]
= coef(fit)[3], oppure fit$coefficient[3]




Se abbiamo modo di ritenere che le due variabili indipendenti X1 e X2 interagiscano tra di loro, è possibile effettuare un modello di regressione logistica multipla con interazioni. In R questo si realizza semplicemente sostituendo al 'più', il segno moltiplicativo nella formula del modello. Vediamo subito cosa otteniamo:


fit <- glm(tumore ~ fumo * alcol, weights = freq, data = data, family = binomial)
> summary(fit)

Call:
glm(formula = tumore ~ fumo * alcol, family = binomial, data = data,
weights = freq)

Deviance Residuals:
1 2 3 4 5 6 7 8
-10.319 -5.261 -11.906 -3.091 10.408 4.904 12.335 2.787

Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.03871 0.16067 -0.241 0.810
fumoSI -0.12125 0.21146 -0.573 0.566
alcolSI 0.35717 0.36575 0.977 0.329
fumoSI:alcolSI 0.27280 0.69114 0.395 0.693

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 580.57 on 7 degrees of freedom
Residual deviance: 577.79 on 4 degrees of freedom
AIC: 585.79

Number of Fisher Scoring iterations: 4


In questo caso abbiamo ottenuto 4 coefficienti beta, che sono quelli relativi alla seguente formula:



In parole semplici, se questo modello fosse veritiero, significherebbe che la presenza simulatanea di fumo E alcol aumenta la probabilità di contrarre tumore molto più della semplice somma (le due condizioni aggravano vicendevolmente la salute dell'individuo).
Le formule e le considerazioni fatte precedentemente sono valide anche qui.

domenica 16 novembre 2008

Confronto tra due proporzioni: metodo parametrico e non parametrico

Verifica di ipotesi tra due proporzioni: metodo parametrico (test Z su proporzioni) e non parametrico (test del chi quadro).

È possibile effettuare la verifica di ipotesi anche su dati che seguono una distribuzione binomiale. Consideriamo ad esempio il seguente problema.
Il proprietario di una società di scommesse vuole verificare se un suo clienti sta barando oppure no. Per fare questo vuole confrontare il numero di successi del suo cliente col numero di successi di un suo dipendente, del quale ha la certezza che non bara. In un mese di tempo, il suo dipendente effettua 74 scommesse e ne vince 30; il suo cliente nello stesso arco di tempo effettua 103 scommesse, vincendone 65. Il suo cliente è un baro, oppure no?


Un problema del genere può essere risolto in due diversi modi: utilizzando un metodo parametrico, e uno non parametrico.

  • Risoluzione col metodo parametrico: test z.

Si ricorre a un test z nel caso in cui si possano fare le seguenti due assunzioni: la probabilità comune di successo è approssimabile a 0.5, e il numero di giocate è molto elevato (assunzioni indispensabili per poter approssimare una binomiale ad una Gauss). Supponiamo che questo sia il nostro caso. In R non esiste una funzione per calcolare il valore di z; perciò riprendiamo la formula matematica, e scriviamo la nostra funzione:



> z.prop = function(x1,x2,n1,n2){
+ numeratore = (x1/n1) - (x2/n2)
+ p.comune = (x1+x2) / (n1+n2)
+ denominatore = sqrt(p.comune * (1-p.comune) * (1/n1 + 1/n2))
+ z.prop.ris = numeratore / denominatore
+ return(z.prop.ris)
+ }


La funzione z.prop calcola il valore di z, ricevendo in input il numero di successi (x1 e x2), e il numero di giocate totale (n1 e n2). Applichiamo la funzione appena scritta coi dati del nostro problema:

> z.prop(30, 65, 74, 103)
[1] -2.969695


Abbiamo ottenuto un valore di z superiore al valore di z-tabulato (1.96), il che ci porta a concludere che il cliente che il direttore stava controllando è effettivamente un baro, in quanto le sue probabilità di successo sono più elevate rispetto ad un utente che non bari al gioco.

  • Risoluzione col metodo non parametrico: il test del chi-quadro.

Supponiamo adesso di non poter fare alcuna assunzione sui dati del problema, e quindi di non poter approssimare la binomiale ad una Gauss. Risolviamo il problema con il test del chi-quadro applicato ad una tabella di contingenza 2x2. In R esiste la funzione prop.test che fa al caso nostro.

> prop.test(x = c(30, 65), n = c(74, 103), correct = FALSE)

2-sample test for equality of proportions without continuity
correction

data: c(30, 65) out of c(74, 103)
X-squared = 8.8191, df = 1, p-value = 0.002981
alternative hypothesis: two.sided
95 percent confidence interval:
-0.37125315 -0.08007196
sample estimates:
prop 1 prop 2
0.4054054 0.6310680


La funzione prop.test calcola il valore del chi-quadro, dati i valori dei successi (contenuti nel vettore x) sul numero totale di tentativi (contenuti nel vettore n). I vattori x ed n possono anche essere dichiarati esternamente, e poi venir richiamati come di consueto: prop.test(x, n, correct=FALSE).

Nel caso di campioni piccoli (basso valore di n), si deve specificare correct=TRUE, che nel calcolo del chi-quadro modifica la formula in base alla continuità di Yates:

> prop.test(x = c(30, 65), n = c(74, 103), correct=TRUE)

2-sample test for equality of proportions with continuity correction

data: c(30, 65) out of c(74, 103)
X-squared = 7.9349, df = 1, p-value = 0.004849
alternative hypothesis: two.sided
95 percent confidence interval:
-0.38286428 -0.06846083
sample estimates:
prop 1 prop 2
0.4054054 0.6310680


In entrambi i casi, abbiamo ottenuto p-value minore di 0.05, che ci porta a rifiutare l’ipotesi di uguaglianza delle probabilità. In conclusione, il cliente è un baro. Per conferma confrontiamo il valore chi-quadro-calcolato con il valore chi-quadro-tabulato, che calcoliamo in questo modo:

> qchisq(0.950, 1)
[1] 3.841459


La funzione qchisq calcola il valore del chi-quadro in funzione di alpha e dei gradi di libertà. Poiché chi-quadro-calcolato è maggiore di chi-quadro-tabulato, concludiamo col rifiutare l’ipotesi H0 (come già affermato dal p-value, e dal test parametrico).

NOTA
Da notare è che il valore di Z-calcolato nel primo z-test è esattamente pari alla radice quadrata del valore del chi-quadro calcolato nel prop.test senza la correzione di Yates. Questo non è certo un caso. Per applicare il z test abbiamo supposto che il numero di prove fosse sufficientemente grande per approssimare la binomiale alla Gauss. Nell'esercizio proposto, questo è vero, e proprio per questa ragione abbiamo la uguaglianza dei valori ottenuti (zeta-quadro = chi-quadro). Se il numero delle prove fosse stato più piccolo, avremmo eseguito il test del chi-quadro con la continuità di Yates, ottenendo come risultato un chi-quadro che non è pari al quadrato di zeta.
In altre parole, quando il numero di prove è sufficientemente elevato, non è necessario effettuare il test del chi-quadro (senza la correzione di Yates), perchè possiamo tranquillamente assumere che la binomiale è approssimabile alla Gauss (e difatti i valori sono uguali), procedendo pertanto con un z-test.
Viceversa, in caso di un numero di prove ridotto, bisogna ricorrere al test del chi-quadro con la correzione di Yates, senza effettuare uno zeta-test.

giovedì 13 novembre 2008

Esercizio sulla probabilità: distribuzione di Bernoulli

Qual è la probabilità, lanciando una moneta 8 volte, di ottenere la sequenza TTCCCTCC?


La teoria ci insegna che per risolvere questo quesito è sufficiente utilizzare la seguente formula:

Per un problema del genere, in R esiste la funzione dbinom(x,n,p). Ci troviamo nel caso di una distribuzione binomiale, in cui gli eventi possono essere T oppure C. Supponiamo che C sia il successo x (in questo caso 5), mentre n è il numero di tentativi (in questo caso 8). La probabilità del successo è p = 0.5. Immettiamo questi dati in R e otterremo la risposta:

> dbinom(5, 8, 0.5)
[1] 0.21875


La probabilità di ottenere quella specifica sequenza è pari al 21.875%.
Cosa sarebbe accaduto se avessimo scelto come successo l’uscita della testa (ossia imponendo x=3)?