28 novembre 2008

Nona Conferenza Nazionale di Statistica

Il prossimo 15 e 16 Dicembre si ripeterà a Roma l'appuntamento biennale della Conferenza Nazionale di Statistica. Io ci sono stato nel 2006 e credo ci andrò anche quest'anno. Consiglio la partecipazione a chiunque sia interessato a reperire informazioni sul mondo della Statistica Ufficiale italiana.
Questo il link di riferimento.

03 novembre 2008

Lezioni di Statistica su YouTube

In rete c'è veramente di tutto, perfino dei video-tutorials per R !
Ma quello che mi è piaciuto di più è il teorema di Bayes (in spagnolo) con tanto di sottofondo degli Enigma :-)

29 ottobre 2008

Odds Ratio in Statistica Medica e Sanitaria

Il concetto di Odds Ratio è ampiamente diffuso in Medicina, Epidemiologia, Statistica Medica, Statistica Sanitaria...e chi ne ha più ne metta! Normalmente ci si sforza di descrivere il concetto ad un pubblico di utenti "non esperti" cercando di rendere il più semplice possibile tale numero, che altro non è che un rapporto di rapporti :-) .
In base alle mie esperienze ho notato, invece, che molte volte è lo statistico stesso a perdere di vista il vero fine di tale indice, lasciandosi andare in riflessioni sugli aspetti "matematici" che poco interessano l'utente.
L'Odds Ratio si basa su di una tabella che è alla base di tutto, una tabella a doppia entrata relativa a due variabili dicotomiche: Fattore di Rischio ed Insorgenza Malattia.












Il fattore di rischio è una variabile che si pensa possa avere influenza sull'insorgenza malattia. Quest'ultima, invece, non ha bisogno di commenti: c'è o non c'è. Ovviamente si può anche considerare il verificarsi di un altro fenomeno che non sia necessariamente una malattia, ad esempio il superamento del livello di colesterolo nel sangue (superato o non superato).
In maniera perfettamente analoga, il fattore di rischio potrebbe essere la somministrazione di un farmaco (presente=somministrato, assente= non somministrato o placebo), e quindi potremmo essere interessati a valutare, o meglio a testare il farmaco come fattore di guarigione dalla malattia, o al contrario come fattore di insorgenza di effetti collaterali. Insomma, trattasi di variabile dicotomiche: uno o zero sia per la variabile antecedente che per quella conseguente.
Nella tabella ho utilizzato le lettere a, b , c , d per specificare la numerosità dei casi. Quindi a è il numero di individui in cui è presente il fattore di rischio e la malattia è insorta, ecc.... (la spiegazione del significato delle altre lettere mi pare banale).
L'utilizzo dei dati contenuti in tale tabella dipende sostanzialmente dalle modalità di raccolta dati, ossia dalla distinzione tra indagini prospettiche o longitudinali e indagine retrospettive o trasversali. In realtà questa mia classificazione non è assolutamente esaustiva per le varie situazioni che si presentano in Medicina, ma lo è ai fini del calcolo di un Odds Ratio.
In un indagine prospettica il ricercatore dispone di un gruppo di individui già classificati a seconda del fattore di rischio: un gruppo in cui è presente, un altro in cui non lo è. Lui si "limita" a seguirli nel tempo e a verificare l'insorgenza (Sì) o meno (No) della malattia. In maniera analoga, per testare un farmaco, si disporrà di un gurppo di individui a cui viene somministrato il farmaco contro un placebo. Quindi, in genere, quando parte l'indagine il ricercatore conosce a+b e c+d, mentre conoscerà la scomposizione in a, b, c e d solo successivamente, in base appunto all'insorgenza della malattia. E' molto utile la seguente illustrazione per rappresentare un'indagine prospettica o longitudinale:














Dall'immagine si evince anche il perché si parla di indagine longitudinale: se si guarda un mappamondo, la longitudine è una linea orizzontale, proprio come la freccia (una barbara definizione che rende l'idea). La figura mette in risalto i dati disponibili a priori dal ricercatore: a+b e c+d e nel tempo potrà poi suddividere i dati in base all'insorgenza della malattia.
In un'indagine retrospettiva, invece, accade esattamente il contrario. Il ricercatore dispone degli individui già classificati in base all'insorgenza della malattia e lo scopo della sua indagine è procedere a "ritroso" per risalire al fattore di rischi e quindi classificare in soggetti con o senza fattore di rischio. Un classico esempio è un gruppo di malati di tumore (insorgenza malattia: Sì) ed uno di sani (insorgenza malattia: No) ai quali viene chiesto se in passato hanno fumato (fattore di rischio: presente) o meno (fattore di rischio: assente). Si deduce facilmente che si può rappresentare l'indagine retrospettiva nel seguente modo:
















Il ricercatore, quindi, conosce a priori a+c e b+d e solo dopo l'indagine potrà risalire all'eventuale presenza del fattore di rischio.
A questo punto è abbastanza semplice scegliere un indice che spieghi il meglio possibile la relazione tra le due variabili dicotomiche rappresentate in tabella.
Nel caso di indagine prospettica, è intuitivo procedere al calcolo della probabilità che insorga la malattia, distinguendo in base all'appartenenza ad uno dei due gruppi:
1- probabilità che insorga la malattia in un individuo esposto al fattore di rischio: pr(Sì \ presente) = a / (a+b);
2- probabilità che insorga la malattia in un individuo non esposto al fattore di rischio: pr(Sì \ assente) = c / (c+d) .
Come giè spiegato prima, in un'indagine longitudinale è logico costruire questi due indici. Il ricercatore, infatti, dispone dei due campioni (a+b e c+d) prima di inziare l'indagine e solo successivamente osserva il fenomeno di insorgenza malattia. Confrontando semplicemente il rapporto 1 con il rapporto 2 tenterà di rispondere alla domanda: il fattore di rischio aumenta significativamente la probabilità che si presenti la malattia? E' ovvio che siamo portati a dare risposta affermativa quanto più la prima probabilità è maggiore della seconda. Ovviamente questo ragionamento sarà un po' più complicato in quanto accompagnato da un insieme di strumenti statistici sui quali non mi soffermo (verifica di ipotesi, modelli logit, ecc....).
In Epidemiologia si è soliti parlare di rischio assoluto invece che di probabilità, quindi il medico e lo statistico cercheranno di valutare se il rischio di tipo 1 è maggiore del rischio di tipo 2. La valutazione di questo semplice aspetto può avvenire rapportando il rischio o probabilità 1 al rischio o probabilità 2. Quanto più tale rapporto sarà maggiore di 1, tanto più saremo portati a pensare che il rischio di insorgenza malattia sia più forte se il fattore di rischio è presente. Tal rapporto viene detto rischio relativo:


a /(a+b) / c/(c+d).


A questo punto chi ha una forma mentis quantitativa (...proprio come lo statistico...) si divertirà nella ricerca di forme matematiche diverse di tale rapporto, ma io direi che poco interessano e poco servono a chi è interessato alla comprensione del fenomeno. Anzi direi che potrebbero essere addirittura controproducenti, portando il ricercatore a perdere di vista l'obiettivo.
Il caso appena discusso riguarda l'indagine prospettica, vediamo ora cosa accade nell'altro caso.
Nell'indagine retrospettiva abbiamo illustrato chiaramente che a priori non si dispone del campione suddiviso per fattore di rischio, ossia mediante il fattore logicamente antecedente, ma si disporrà dei malati e dei sani. Procedendo "retrospettivamente" alla classificazione in base alla presenza o l'assenza del fattore di rischio (...fumavi in passato?...) si riempirà la tabellina in ognuna delle quattro caselle, ma il calcolo del rischio relativo non ha più senso. La freccia disegnata, infatti, non segue più lo stesso "senso dei dati" (è verticale, non più orizzonatale). I campioni sono ora a+c e b+d, e mischiare a con b e c con d potrebbe portare a risultati fortemente errati. Le numerosità dei due campioni, infatti, saranno in genere molto diverse, con un campione di sani generalmente più grande di quello di malati (b+d > a+c).
Immaginiamo paradossalmente di disporre di 8 malati (a+c) e 200 sani (b+d). Li interroghiamo sulle loro abitudini di vita e scompriamo che degli 8 malati, 3 hanno fumato (quindi a=3) mentre trai i 200 hanno fumato in 150 (b=150). A questo punto ve la sentireste di dire che 3 / (3+150) (ossia il rischio a/a+b) è la probabilità di ammalarsi essendo stati fumatori? Io direi che non ha senso sommare 3 a 150 poiché i dati sono di campioni diversi; non abbiamo mica seguito nel tempo 153 individui fumatori valutando così l'insorgenza della malattia! Essendo errato il calcolo del rischio assoluto e ralativo in tale caso, si usa studiare il fenomeno con l'Odds Ratio.
Innanzitutto, diciamo che un Odds è un rapporto di probabilità. Consideriamo un campione suddiviso in base alla presenza o assenza di una caratteristica, ossia la nostra variabilie dicotomica (maschio/femmina, fumatore/non fumatore, bello/brutto, ecc....). Se a sono i fumatori e c i non fumatori (nel campione di malati) , a / (a+c) è la probabilità di trovare un fumatore nel nostro campione. Analogamente, c / (a+c) è la probabilità di trovare un non fumatore. L'Odds (relativamente ai malati) per tale variabile dicomotica è quindi il rapporto tra la probabilità che una unità del campione sia fumatrice e la probabilità che sia non fumatrice:


a /(a+c) / c/(a+c) = a / c.


Tale indice ci dice quanto è maggiore la probabilità di beccare un fumatore rispetto a quella di non beccarlo. Torniamo alla tabella relativa al caso di un'indagine retrospettiva.
In base a come abbiamo costruito il nostro campione, seguendo la freccia verticale, ha senso calcolare anche l'Odds per i sani:


b/(b+d) / d/(b+d) = b / d.


A questo punto l'Odds Ratio è il rapporto dei due Odds (così come il rischio relativo e il rapporto dei due rischi assoluti):


a/c / b/d.


Se tale valore è maggiore di 1, l'Odds dei malati è maggiore di quello dei sani e quindi potremmo dire che nei malati la probabilità di beccare un fumatore rispetto a quelle di non beccarlo è maggiore rispetto a quanto accade nei sani. Tale modo di ragionare, però, nasconde evidentemente qualcosa di "illogico". E' come se stessimo supponendo l'insorgenza della malattia come variabile antecedente il fattore di rischio, ossia che la malattia influisce sul fattore di rischio, ossia su di una variabile che invece si manifesta "prima" dell'altra. Quello che invece ci interesserebbe verificare è quanto cambia il rapporto tra la probabilità di ammalarsi e non, passando da un gruppo di individui senza fattore di rischio ad individui con fattore di rischio (qualcosa di analogo al rischio relativo).
Mentre per un'indagine prospettiva è subito evidente che possiamo eseguire tale calcolo (seguiamo il senso della freccia), da una prima riflessione potrebbe sembrare errato il calcolo di tale Odds Ratio per un'indagine retrospettiva (così come invece lo sarebbe il calcolo del rischio relativo). Ma con un banale passaggio algebrico si ottiene che:


a/c / b/d = a/b / c/d,


ossia che l'Odds Ratio per la nostra tabella è sempre lo stesso, indipendentemente da quale sia la variabile logicamente antecendente (cosa che invece non accade per il rischio relativo). Non è superfluo evidenziare che il secondo membro dell'uguaglianza è l'Odds Ratio che misura di quanto è più probabile l'insorgenza malattia rispetto alla non insorgenza, passando da individui con fattore di rischio a individui senza tale fattore.
Quindi, riassumendo, la nostra tabella con le quattro caselline è in pratica un campione che si suppone rappresentativo dell'universo. Calcolando uno qualunque degli indici sopra descritti, non facciamo altro che cercare di stimare lo stesso valore ignoto nell'universo. La differenza sostanziale, però, sta nel fatto che mentre il rischio relativo ha senso solo per l'indagine prospettiva, l'Odds Ratio è indipendente dal tipo di indagine. Quindi, il rischio relativo è una buona stima campionaria solo per le indagini retrospettive, mentre l'Odd Ratio lo è in entrambi i casi!
Quindi, per un'indagine retrospettiva useremo l'Odds Ratio per rispondere alla stessa domanda di prima: il fattore di rischio aumenta significativamente la possibilità che si presenti la malattia? Quanto più a/b /c/d sarà >1, tanto più saremo portati a dire che nel passaggio dalla situazione di assenza alla situazione di presenza del fattore di rischio , cresce il rapporto tra la probabilità di ammalarsi e quella che la malattia non insorga.
Sottolineo inoltre che in genere l'Odds Ratio è utilizzato sempre, quindi mi pare sia preferito anche nelle indagine prospettiche, sebbene in tali casi sia possibile calcolare il rischio relativo (ovviamente questa è solo una mia impressione).
Nei più diffusi testi di Epidemiologia o Statistica Medica si è soliti parlare di rapporto crociato in luogo di Odds Ratio. A mio parere tale esemplificazione algebrica è totalmente inutile e addirittura controproducente e per tale motivo nemmeno la riporto. Per quanto riguarda l'aspetto "informatico" per il calco di tali indici, direi che non è necessario nessun commento essendo il processo di calcolo molto banale e facilemente gestibile in un un foglio elettronico.
Concludo dicendo che il ragionamento che ho seguito è utile a comprendere il significato di Odds Ratio e Rischio Relativo, evitando quindi lo sforzo memorico necessario a ricordare i metodi di calcolo dei rapporti (...l'odds è il prodotto della cella a per b, diviso per...). Ovviamente, per completare il tutto, sarebbe necessario approfondire con lo studio della verifica di ipotesi e dei modelli logit, ma tali argomenti sono abbondantemente trattati nei testi di stastica ed anche in rete.

30 settembre 2008

Gestire i Missing Value in R

La visualizzazione e l'imputazione dei "dati mancanti" in un'indagine , in particolare nella Statistica Ufficiale, è sicuramente la fase più importante per garantire la qualità del dato statistico . La letteratura sull'argomento è matura e ben fornita, e i software commerciali non prevedono, a mio parere, un modulo "completo" (ovviamente in ognuno di questi ci sono possibilità di sviluppare grafici ad-hoc e applicare un qualsivoglia test).
In particolare l'ISTAT ha sviluppato in SAS il software
CONCORD per il controllo e la correzione dei dati, strumento potentissimo e liberamente scaricabile, ma che appunto necessita del SAS.
In R esiste la possibilità di lavorare con
VIM, che sta appunto per Visualization and Imputation of Missing values. Come gli stessi autori sottolineano, il cuore del pacchetto sta nell'insieme dei possibili grafici utili alla scoperta e alla gestione dei missing values.
In realtà, analogamente a quanto ho già scritto per
Rcmdr, un altro grande aspetto è la possibilità di ricorrere all'interfaccia grafica (sviluppata mediante il pacchetto tcltk). Non dimentichiamo, infine, le possibilità di integrazione di R con il pacchetto office e la possibilità si sviluppo in maniera estremamente immediata delle interfacce grafiche (ad esempio via Access).
Concludo osservando che l'ISTAT ha già espresso
parere sostanzialmente postivo per l'utilizzo di R ed ha avviato un processo di migrazione a tale strumento...quindi R anche nella statistica ufficiale.

09 settembre 2008

RExcel su Wikipedia

Su Wikipedia c'è ora una breve descrizione di RExcel; molto interessanti i link riportati nelle References.

15 luglio 2008

Trasporre un foglio excel di dati "statistici" in formato "database"

L'operazione che vado a descrivere penso sia sostanzialmente comune per chi lavora con un dataset "statistico". In pratica chi utilizza un software per analisi statistiche, come R, SAS, SPSS e ci mettiamo in mezzo pure Excel, è abituato ad avere un insieme di dati alle cui righe corrispondo le singole osservazioni e alle cui colonne corrispondo le variabili. Immaginiamo che le variabili siano "sommabili" tra loro, ossia che si riferiscano ad un fenomeno per cui ha senso fare la somma di tutte le variabili. Ad esempio, consideriamo di avere un campione di aziende per ognuna delle quali osserviamo tutte le voci di costo che le caratterizzano nella loro attività. In tal caso, quindi, in Excel siamo abituati ad aggiungere un'ultima variabile (colonna / campo) che sia la somma di tutte le precedenti (nel nostro esempio, quindi, avremo l'ammontare totali dei costi).
E' poi usuale "salvare" i dati in un database in cui è sicuramente preferibile gestire il tutto in modo differente, ossia avere un'unico campo con i dati (ovviamente solo nel nostro caso in cui dati si riferiscono allo stesso fenomeno), utilizzando poi un campo con l'identificativo dell'osservazione ed un altro con il codice identificativo della variabile.
Sempre tornando al nostro esempio delle aziende e dei costi, salveremo i dati in un tabella di database avente tre campi: il primo con un codice che identifica l'azienda, il secondo con un codice che identifica il tipo di costo (energia, costo del lavoro, manutenzione, ecc...), il terzo con il valore del costo. Il primo ed il secondo campo formano una chiave per la tabella, ed avremo un numero distinto di voci di costo pari al numero di variabili (colonne) del nostro dataset iniziale.
Tale operazione di particolare trasposizione della tabella è immediata in Excel mediante la macro che riporto di seguito. Quindi, qualunque sia il software che usiamo, basterà importare la tabella in Excel ed eseguire la macro. L'unico vincolo è il numero massimo di record che si possono gestire. Come ricordato in questo mio post, questo limite si alza notevolmente con la versione più recente di Excel. In genere, comunque, nel caso fosse una "grosso" dataset, sarà sufficiente estrarre dei suoi sottoinsiemi di osservazioni e variabili per lavorare ugualmente con tale macro.
Nel mio esempio, comunque, ho ipotizzato che l'utente lavori con una versione di Excel che prevede al massimo 65,536 righe, restituendo un messaggio di errore nel caso la trasposizione del dataset dovessere portare ad un numero maggiore di record. Il codice vba, comunque, è immediatemante adattabile al caso di Excel 2007 (1,048,576 "righe" e 16,384 "colonne").
Ecco il codice, da associare ad un pulsante di comando:
'*****************************************************
Private Sub cmdTrasponi_Click()
Dim j As Long
Dim i As Long
Dim r As Long
Dim c As Long
r = 0
c = 0

For j = 2 To 256
If Worksheets(1).Cells(1, j).Value <> "" Then
c = c + 1
End If
Next

For j = 2 To 65536
If Worksheets(1).Cells(j, 1).Value <> "" Then
r = r + 1
End If
Next

If c * r + 1 > 65536 Then
MsgBox "Matrice troppo grande per essere gestita in excel"
Exit Sub
End If

If r <= 1 Or c <= 1 Then MsgBox "Numero di dati da trasporre troppo basso"
Exit Sub
End If

For j = 2 To r + 1
For i = 2 To c + 1
Worksheets(2).Cells(i + c * (j - 2), 3).Value = Worksheets(1).Cells(j, i).Value
Worksheets(2).Cells(i + c * (j - 2), 2).Value = Worksheets(1).Cells(1, i).Value
Worksheets(2).Cells(i + c * (j - 2), 1).Value = Worksheets(1).Cells(j, 1).Value
Next
Next

Worksheets(2).Cells(1, 1).Value = Worksheets(1).Cells(1, 1).Value
Worksheets(2).Cells(1, 2).Value = "Descrizione dati"
Worksheets(2).Cells(1, 3).Value = "Dati"

MsgBox "Trasposizione in formato database terminata"

End Sub

27 febbraio 2008

Usare R in Access

L'utilizzo di R in Access mi ha permesso di sviluppare modelli statistici di notevole complessità in maniera abbastanza semplice, utilizzando un software diffusissimo quale appunto Access. Quest'ultimo lo uso in genere come interfaccia utente per "nascondere" un motore di calcolo statistico come R e, in alcuni casi, un motore database diverso da Jet (come ad esempio Firebird, in riferimento al quale ho scritto questo post). In pratica mi è capitato di utilizzare Access per accedere ad un database Firebird via odbc, crearmi delle tabelle temporanee da passare ad R, applicare il mio modello statistico (in questo caso direi di data mining) e visualizzare i risultati finali tramite tabelle create in Jet. In tal modo, quindi, Access funge esclusivamente da interfaccia, sfruttando quindi la possibilità di gestire i dati tramite vba e mediante un modello di riferimento molto semplice ed allo stesso tempo molto efficace.
Nell'esempio che riporto di seguito ho preferito fare riferimento ad una tabella generata tramite Jet e, quindi, ad un utilizzo intensivo di Access stesso. Per un utilizzo di quest'ultimo con un motore db differente (quale, ad esempio, Firebird), l'esempio di seguito riportato penso rimanga valido con opportuni accorgimenti legati a tabelle collegate tramite odbc.
La possibilità di richiamare R da Access, analogamente a quanto avviene per Excel così come spiegato qui, resta legata all'utilizzo di R(D)COM. Quindi, sul proprio calcolatore sarà necessario disporre di R, R(D)COM ed ovviamente Access (io lavoro con la versione del 2003). Prima di cominciare a scrivere il codice sarà necessario apire l'editor di Visual Basic (ALT+F11) > Strumenti > Riferimenti e spuntare le librerie StatConnectorClnt 1.0 Type library, StatConnectorCommon 1.1 Type library e StatConnectorSrv 1.1 Type library. Nel caso queste non fossero disponibili nell'elenco, saranno disponibili al seguente indirizzo: C:\Programmi\R\(D)COM Server\tlb con estensione .tlb. Ovviamente non le troverete se avrete installato R(D)COM in un percorso differente da quello standard, ed in tal caso ve le andrete a cercare :-)
Nell'esempio dispongo di una tabella in Access così composta:
tbPrezzi (mese, prezzoGpl, prezzoBenz)
ossia una tabella (tbPrezzi) con i prezzi industriali di gpl e benzina per i 12 mesi del 2007 . Si tratta di dati ufficiali presi dal sito del ministero.
In maniera molto semplice ho immaginato che l'utente sia interessato al coefficiente angolare della retta di regressione lineare del prezzo del gpl sul prezzo della benzina.
In R basterebbe utilizzare il seguente comando: >lm(y~x)$coeff[2]
con y ed x pari appunto ai due campi della tabella tbPrezzi, ossia prezzoGpl e prezzoBenz rispettivamente in luogo di y ed x. Quindi ho costruito una maschera che contiene un pulsante di comando al cui click si generano le seguenti operazioni (riportate passo per passo nel codice sotto):
  1. creo un recordset in vba coincidente con la tabella tbPrezzi e due vettori x ed y pari rispettivamente a prezzoGpl e prezzoBenz;
  2. avvio R dietro le quinte;
  3. passo questi vettori ad R;
  4. eseguo il calcolo del coefficiente b della retta di regressione e riporto il risultato del calcolo in Access;
  5. decido di visualizzare b tramite un messaggio a video (MsgBox), ma equivalentemente avrei potuto continuare ad usarlo in vba ed in Access per scopi differenti;
  6. chiudo R.
Ovviamente il mio esempio può essere generalizzato a modelli più complessi, come ad esempio l'applicazione di un modello CART generato in R (mediante la libreria tree) sulla base di un insieme di dati provenienti da un database diverso da Jet. Si riporta di seguito il codice associato all'evento "click" per un pulsante di comando:
'***************************************************************
Private Sub Comando0_Click()
Dim stc As StatConnector
Dim x(1 To 12) As Double
Dim y(1 To 12) As Double
Dim i As Integer
Dim b As Double
Dim db As DAO.Database
Dim rs As DAO.Recordset
'*********************PASSO 1********************
Set db = DBEngine(0)(0)
Set rs = db.OpenRecordset("tbPrezzi")
i = 1
Do Until rs.EOF
x(i) = rs.Fields(2)
y(i) = rs.Fields(1)
rs.MoveNext
i = i + 1
Loop
'*********************PASSO 2********************
Set stc = New StatConnector
stc.Init ("R")
'*********************PASSO 3********************
stc.SetSymbol "x_R", x
stc.SetSymbol "y_R", y
'*********************PASSO 4********************
b = stc.Evaluate("lm(y_R~x_R)$coeff[2]")
'*********************PASSO 5********************
MsgBox "Coefficiente angolare regressione prezzo gpl su prezzo benzina: " & b
'*********************PASSO 6********************
stc.Close
rs.Close
db.Close
End Sub
'***************************************************************
Si noti che ho preferito parlare di x e y per vettori gestiti in vba, mentre ho parlato di x_R e y_R per gli stessi in ambiente R. Infine bisogna precisare che il dialogo tra R ed Access avviene tramite l'oggetto StatConnector. Per maggiori informazioni è sufficiente consultare il sito ufficiale di R(D)COM........ampiamente linkato nel mio blog :-)