30 gennaio 2009

Licenze commerciali di R che spuntano come funghi...

Mentre un enorme gruppo di sviluppatori, più o meno volontari, garantisce lo sviluppo del software statistico più aggiornato del mondo, c'è chi pensa (giustamente) di fornire licenze commerciali di R che dovrebbero garantire un maggiore supporto ed una migliore funzionalità (altrimenti non resisterebbero molto sul mercato).
Queste sono quelle che conosco, ma solo di nome:
La mia paura è che gli sviluppatori di RDCOM seguano prima o poi una strada simile ... e diciamo pure che seguendo i relativi dibattiti nei newsgroup si comincia a respirare quest'aria...

07 gennaio 2009

Installazione di Latex in ambiente Windows

L'utilizzo di Latex per chi lavora in ambito statistico è sicuramente consigliato, soprattutto per evitare gli incovenienti dell'uso di Equation Editor in Word. La qualità "grafica" di un testo scritto in Latex è inoltre sorprendente, a patto di un piccolissimo sforzo iniziale per l'apprendimento. Ovviamente anche l'uso di Word a livello professionale (che non significa semplicemente cliccare su di un file .doc e poi scriverci sopra!) necessita di molta pratica e di approfondimenti. Quindi un po' di studio di Latex potrebbe davvero valerne la pena.
Come indicato nel titolo, faccio riferimento a Windows (così come in tutto il resto del blog). Le installazioni che ho eseguito fino ad ora sono avvenute tutte in XP, ma come sempre immagino che con pochi accorgimenti si possa facilmente generalizzare ad altre versioni.
Nell'illustrazione dei diversi step non mi soffermo sul significato delle diverse "componenti", un po' perché non ne ho le capacità e un po' perché esiste molto materiale in rete (il miglior punto di partenza e anche di arrivo è sicuramente il sito del GuIT).
Quindi di seguito riporto dei consigli veloci per l'installazione di tutto, mentre vi consiglio di leggere questo documento.
  1. installare MikTex. 
  2. installare TEXnicCenter. 
  3. installare GSView. 
  4. installare Ghostscript. 
Ora dovrebbe essere tutto pronto. Si riavvia il pc, si apre TEXnicCenter e partono alcuni messaggi che chiedono di indicare una directory. Trovate la risposta alle vostre domande in questo video:






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 :-)

23 ottobre 2007

Importare dati in R da Excel

Sono molte le ricerche per importare dati in R da Excel che da google portano al mio blog, così ho pensato di scrivere delle indicazioni specifiche.
Innanzitutto, come più ampiamente spiegato in questo mio vecchio post, io consiglio l'utilizzo della libreria Rcmdr che permette l'importazione stile "software commerciali" direttamente da un file di Excel, Stata, Minitab, Access, ecc... .
Ma se proprio non si vuol dar retta a questo mio consiglio :-), la procedura è riportata di seguito.
Immaginando di essere in Italia in cui il separatore decimale utilizzato è la virgola, la prima cosa da fare è salvare il foglio Excel in formato testo delimitato da tabulazione. Bisogna stare attenti a non salvare in txt utilizzando il separatore delle migliaia per le variabili (colonne di Excel) aventi Numero come Formato Celle (quindi, in Excel, per le celle con formato Numero: Formato Celle > Numero e togli il segno di spunta in corrispondenza di Usa separatore delle migliaia (,) ). Sto inoltre immaginando, come penso accada in genere, che la prima riga della tabella Excel indichi il nome delle variabili.
A questo punto il codice in R è semplicemente:
x<-read.delim2("C:/miaCartella/mioFile.txt") .
Notate che nell'indicazione del percorso del file si debba usare "/" invece di "\". A questo punto x sarà il data.frame in R corrispondente alla vostra tabella di Excel.
Infine, faccio notare come il seguente comando:
x<-read.table(file="C:/miaCartella/mioFile.txt", header=TRUE, sep="\t", dec=",")
sia perfettamente equivalente al precedente (l'help in linea può aiutare a charirsi le idee).

22 ottobre 2007

Aggiornare R e R(D)COM server

In base a quanto riportato dalle FAQ per Windows e in base alle mie esperienze, riporto la procedura da eseguire per l'aggiornamento di R e di R(D)COM all'ultima versione.
Tale aggiornamento in molti casi può non essere necessario in quanto l'utente può lavorare tranquillamente con una versione "vecchia" senza rendersene conto. In tale caso, comunque, la cosa sicuramente da non fare è l'aggiornamento delle librerie. Quest'ultimo, infatti, dovrebbe sempre essere preceduto da un aggiornamento di R.
Immaginate di lavorare con la 2.4.0 (questo è un episodio reale per il quale sono stato contattato) e di aggiornare le librerie (nella RGUI: Pacchetti > Aggiorna pacchetti...). Così facendo, nella cartella "library" vi ritroverete le librerie che utilizzate normalmente, aggiornate alle versioni più recenti che, in genere, potrebbero non essere più "funzionanti" con la vecchia versione di R con la quale stavate lavorando.
Quindi, la prima cosa da fare è rimouvere R (Pannello di controllo > Installazione applicazioni > Rimuovi o direttamente con unins000.exe). Tale operazione non cancellerà via la cartella library nella quale, appunto, restano tutti i pacchetti che normalmente siete abituati ad utilizzare. In tal modo, quindi, dopo aver installato la nuova versione di R (attualmente siamo alla 2.6.0), basterà sostituire il contenuto della nuova cartella library (C:\Programmi\R\R-2.6.0\library) con il contenuto della vecchia (C:\Programmi\R\R-2.4.0\library) ed effetture l'aggiornamento dei pacchetti (nella RGUI: Pacchetti > Aggiorna pacchetti...). In tal modo vi ritroverete tutte le librerie di cui disponevate, aggiornate e compatibili con la nuova release di R. In pratica, quindi, io non andrò a sostituire l'intera cartella, ma andrò a copiare il contenuto della vecchia library e ad incollarlo nella nuova, cliccando no al messaggio di Conferma sostituzione file di Windows relativo alle librerie standard già installate assieme alla nuova release di R.
Per quanto riguarda R(D)COM, la procedura è la solita per la rimozione (Pannello di controllo > Installazione applicazioni > Rimuovi o direttamente con unins000.exe ) e la solita per l'installazione (attualmente il setup più aggiornato è RSrv250_pl1.exe). Successivamente all'installazione si può eseguire un primo test tramite lo StatConnector Test : C:\Programmi\R\(D)COMServer\samples\Simple\simple.exe > Start R. Nella totalità delle installazioni che ho eseguito si ottiene il messaggio di errore: Run time error '462': The Remote server machine does not exist or is unavailable . Il problema sta nel settaggio del registro di Windows e, senza chiedersi cosa significhi :-), il problema si risolve tramite C:\Programmi\R\R-x.x.x\bin\RSetReg.exe . Successivamente, richiamando nuovamente lo StatConnector Test (a meno di altri errori) si otterrà una serie di messaggi di informazione che confermano il corretto funzionamento di R(D)COM Server.

11 giugno 2007

Indice di concentrazione di Gini in Excel

Download del file xls con la relativa funzione.


Tra le funzioni statistiche di excel non mi risulta disponibile l'indice di concentrazione di Gini e ho sviluppato la relativa funzione in vba.
La formula a cui mi riferisco è la seguente, dove le x_(i) sono ordinate in senso non decrescente:
Ai fini computazionali, mi è risultato conveniente esplicitare la formula nel seguente formato:

ossia come rapporto tra l'indice di disuguaglianza senza ripetizione (ossia con il denominatore pari a n(n-1) invece che n^2):


ed il suo massimo:

Inizialmente avevo optato per la seguente forma:

ma essa si base sull'ordinamento di un array che prevederebbe un po' di codice per essere effettuato, non essendo già prevista una relativa funzione standard in vba. Per l'indice di concentrazione in R si faccia riferimento alla libreria ineq. Ho anche avviato una discussione sulla mailing-list per dei chiarimenti sulla formula utilizzata (l'indice infatti non fornisce il valore 1 in caso di massima concentrazione), ma la risposta stava nella differenza tra indice distorto e non distorto.
Riporto di seguito il codice della funzione in vba :
'********************************************
Public Function gini(x As Range) As Double

Dim tb As Variant
Dim h As Long
Dim k As Long
Dim i As Long
Dim j As Long
Dim num As Double
Dim den As Double

tb = x.Value
num = 0
den = 0
For h = 1 To UBound(tb, 1)
For k = 1 To UBound(tb, 2)
If IsNull(tb(h, k)) Then
tb(h, k) = 0
End If
den = den + tb(h, k)
For i = 1 To UBound(tb, 1)
For j = 1 To UBound(tb, 2)
num = num + Abs(tb(h, k) - tb(i, j))
Next j
Next i
Next k
Next h

'INDICE DI DISUGUAGLIANZA
num = num / (UBound(tb, 1) * UBound(tb, 2)* _
(UBound(tb, 1) * UBound(tb, 2) - 1))

'MASSIMO DELL'INDICE DI DISUGUAGLIANZA
den = 2 * den / (UBound(tb, 1) * UBound(tb, 2))

If den = 0 Then
gini = 1
Else
gini = num / den
End If
End Function
'********************************************

24 maggio 2007

Usare R in Calc: ROOo

A causa di parecchio lavoro ho veramente poco tempo da dedicare al blog, ma questa notizia non può essere di certo trascurata. E' nato un progetto di integrazione tra R e Calc (il foglio elettronico di OpenOffice), curato sempre da Thomas Baier e company, sia in ambiente Windows che Linux. La notizia mi è giunta proprio oggi e, ovviamente, il tutto è in versione alpha / test. Io per lavoro uso sempre Excel, quindi non sono direttamente interessato, tuttavia il progetto è sicuramente importante per gli utenti di Calc. Info e downolad di ROOo a questo indirizzo.

15 marzo 2007

Firebird, Flamerobin e IBUtils

In alcuni lavoro che ho svolto (e che continuo a svolgere) mi sono trovato a sviluppare e gestire basi di dati. Nell'immenso universo dei possibili database, spesso per decisioni aziendali legate a motivazioni puramente economiche, mi sono trovato a dover scegliere tra tutte le possibilità a basso costo (diciamo pure aggratiss). La mia esperienza assolutamente positiva e, soprattutto, a costo nullo è legata ad un nome: Firebird.
Non intendo discutere di eventuali confronti con altri database (commerciali e non) non avendo le competenze per farlo ed essendo l'argomento già ampiamente trattato in rete (inoltre penso non si arriverebbe a conclusione, essendo i pareri discordanti). Voglio solo esprimere la mia totale soddisfazione nel gestire (ripeto: a costo nullo!!!) grossi database.
In particolare, in seguito alla continua ricerca in rete di "strumenti" (sempre aggratiss) per lavorare con Firebird e in seguito a ripetuti confronti tra tutto ciò che offre il web, mi sento di poter riassumere in due link quelli che sono attualmente i miei ferri del mestiere che, quindi, consiglio a tutti: Flamerobin, per lavorare via sql con tabelle e procedure, IBUtils per disegnare la struttura del db in maniera grafica e visuale.

02 marzo 2007

RDCOM Server V2.5 e RExcel V1.75

In riferimento a quanto già discusso nel mio precedente post, dopo un breve periodo di test è ora possibile scaricare la nuova versione di RDCOM e di RExcel. Il download può essere effettuato a questo indirizzo, ma Thomas Baier annuncia che presto sarà aggiornata la relativa pagina web.