22 dicembre 2009

SQL join in R

Consideriamo un classico esempio di 3 tabelle di un database, ognuna con i rispettivi campi:
  1. acquisti (codFornitore, numeroColli, codProdotto, codQualità)
  2. prodotti (codice, qualità, descrizione)
  3. fornitori (codice, nome)
I fornitori hanno un codice numerico ed un nome. Ogni prodotto ha un codice numerico ed uno di qualità e, per ognuna di queste combinazioni, c'è una descrizione. Infine, gli acquisti prevedono un codice di fornitori, uno di prodotto e di qualità, infine il numero colli acquistati.

In una situazione di questo tipo, è comune eseguire le operazioni di "congiunzione" (appunto, join) tra tabelle. Per ogni comando SQL in un db, esiste un analogo in R mediante la funzione merge. Riporto di seguito degli esempi di comparazione dei due linguaggi, ipotizzando di disporre in R dei relativi dataframe.

Visualizzo gli acquisti assieme al nome del fornitore.

Inner join in SQL:

SELECT a.*, b.nome
FROM acquisti AS a INNER JOIN fornitori AS b
ON a.codFornitore = b.codice;

Inner join in R:

>merge(acquisti,fornitori,by.x="codFornitore",by.y="codice")

Visualizzo gli acquisti assieme a tutti i fornitori, compresi quelli dai quali non ho comprato prodotti.

Right join in SQL:

SELECT a.*, b.nome
FROM Acquisti AS a RIGHT JOIN Fornitori AS b
ON b.codice = a.codFornitore;

Right join in R:

>merge(acquisti,fornitori,by.x="codFornitore",by.y="codice",all.y=T)

Visualizzo gli acquisti assieme alla descrizione del prodotto (descrizione relativa al tipo di prodotto ed alla sua qualità), compresi i prodotti che non sono stati acquistati.

Left join in SQL:

SELECT a.*, b.codFornitore, b.numeroColli
FROM Prodotti as a LEFT JOIN Acquisti as b
ON (a.qualità = b.codQualità) AND (a.codice = b.codProdotto);

Left join in R:

>merge(prodotti,acquisti,by.x=c("codice","qualità"),by.y=c("codProdotto","codQualità"),all.x=T)

Infine, solo per completezza, riporto il codice di una full, ma in tal caso il risultato è analogo alla left.

Full join in SQL:

SELECT a.*, b.codFornitore, b.numeroColli
FROM Prodotti as a FULL JOIN Acquisti as b
ON (a.qualità = b.codQualità) AND (a.codice = b.codProdotto);

Full join in R:

>merge(prodotti,acquisti,by.x=c("codice","qualità"),by.y=c("codProdotto","codQualità"),all.x=T,all.y=T)

Riassumendo, quindi, la logica in R è molto intuitiva, alla pari dell'SQL.
Con by.x e by.y, si determinano i campi su qui eseguire la join, ossia i campi da "legare". Mediante all.x e all.y si stabilisce se left, right o full join.
Per tutte le varianti della funzione, si rimanda all'help di R.

26 novembre 2009

Configurazione di natbib_ita in MikTex 2.8 per Vista

Mi arrivano parecchie richieste relative all'installazione su Vista di MikTex. Io ho effettuato alcune configurazioni e non ho avuto particolari problemi. Quindi, l'installazione rimane esattamente quella descritta in questo mio post. Ovviamente, è necessario procedere con privilegi da amministratore!
Qualche "problemino" di configurazione riguarda invece natbib_ita, il pacchetto per la gestione della bibliografia in italiano. In MikTex (versione >=2.7) sono già previsti alcuni file .bst che servono all'uso di bibtex, ma non quelli per lo "stile" italiano.
Quindi, qui scaricate quello che vi serve, e noterete i seguenti file:
  1. natbib.sty
  2. plain_ita.bst
  3. natbib_ita.bst
  4. natbib.bst
Gli altri file servono per testare la configurazione, consiglio di leggerli attentamente!!!
A questo punto:
  1. copiate il file natbib.sty in "C:\Program Files\MiKTeX 2.8\tex\latex\natbib" (cancellando quindi il file con lo stesso nome che trovate in questa cartella);
  2. copiate i rimaneti 3 file in "C:\Program Files\MiKTeX 2.8\bibtex\bst\base";
  3. tramite il "programma" miktex options (start -> tutti i programmi -> MikTex 2.8 -> Maintenance -> Settings), eseguite il refresh, ossia, nella scheda General, cliccate su "Refresh FNDB" e su "Update Formats".
Nelle configurazioni eseguite non ho riscontrato nessun problema. Per maggiori informazioni c'è sempre il sito del GUIT.

26 ottobre 2009

Vectorizing computing in R

Un forte limite nell'utilizzo di R (in particolare per chi è già abituato a sviluppare in altri linguaggi di programmazione) è la lentezza dell'esecuzione di algoritmi basati sui classici "cicli di for". Eseguire un blocco di codice ripetutamente, infatti, è un'operazione concettualmente semplice che, quindi, ci permette di gestire facilmente la ripetizione di un insieme di "operazioni" (eventualmente effettuando il controllo di alcune condizioni con dei sempici "if"). Putroppo in R è fortemente sconsigliato questo approccio e per questo motivo si parla di vectorizing computing: trasformare il ciclo di for in operazioni tra vettori o matrici. Quindi la ripetizione di un blocco di codice controllato da un contatore deve essere trasformato, ad esempio, in un prodotto di matrici. Questo metodo di sviluppo ha come fine quello di sfruttare al meglio il motore di calcolo di R, che è appunto ottimizzato per il calcolo matriciale. Ovviamente questo approccio può portare ad altro tipo di problemi, ossia alla gestione dei dati mediante matrici "troppo grandi" e difficilmente gestibili. L'esperienza comunque permette di arrivare alla soluzione megliore, e non credo si possa stilare un elenco di situazioni in cui preferire un approccio ad un altro: ogni soluzione va valutata singolarmente "sul campo" (...bella novità...).
Riporto di seguito alcuni esempi di for in R con le relative "vettorizzazioni".

Creo un vettore p composto da 500.000 valori estratti da una normale standardizzata e, da questo, ne derivo il vettore formato dagli stessi 500.000 valori rapportati alla loro somma. Forse la vettorizzazione di questo esempio è veramente banale, ma serve a rendersi conto dei tempi di esecuzione.
Il relativo ciclo di for è semplicissimo:


p<-rnorm(500000)
s<-sum(p)
for (i in 1:500000) p[i]<-p[i]/s


Per la valutazione dei tempi di esecuzione basta osservare il risultato di system.time(),che esegue il codice in parentesi e riporta il tempo in secondi. Nel nostro caso ci limitiamo ad osservare il tempo elapsed (in blu è roportato l'output di R):


system.time(for (i in 1:500000) p[i]<-p[i]/s)
user system elapsed
3.2 0.0 3.2


La cosiddetta vettorizzazione è in tal caso banale (p/s), ma il risultato è notevole:


system.time(p<-p/s)
user system elapsed
0.0 0.02 0.02



In termini assoulti, un risparmio di 3.18 secondi può sembrare inutile, ma se si ragiona in termini relativi si osserva un risparmio del 99% del tempo di esecuzione, quindi molto importante per calcoli più complessi!

Prendiamo in esame un esempio in cui la vettorizzazione è meno immediata.
Consideriamo un insieme di 1.000.000 di dati estratti da una normale standardizzata. Pensate ad esempio ad un tipica applicazione in ambito industriale, in cui si controlla che il prodotto rispetti determinate caratteristiche (peso, dimensioni, ecc. ...) e in cui ci si aspetti che gli "errori" nella produzione siano distribuiti normalmente. In elaborazioni effettuate in tale ambito, quindi, si dispone di un vettore di questo tipo. I calcoli che svolgo di seguito, comunque, sono solo a titolo di esempio e non rappresentano alcun indicatore o controllo tipico della statistica industriale.
Immaginiamo di avere i dati in forma matriciale: 1000 casi controllati (in riga) per 1000 caratteristiche (in colonna). Da questo dataset vogliamo ricavare una matrice di valori dicotomici, con 1 o 0 a seconda che il valore sia maggiore o uguale a zero (1), oppure negativo (0), rispettivamente.
Anche in questo caso il codice da usare per un ciclo di for è immediato:


N<-1000
mtx<-matrix(rnorm(N*N),N,N)
mtx2<-matrix(0,N,N)

system.time(for (i in 1:N) for (j in 1:N) if(mtx[i,j]>=0) mtx2[i,j]<-1)
user system elapsed
6.20 0.00 6.52


La vettorizzazione si può effettuare mediante il comando ifelse(), che analizza ogni singolo elemento della matrice e esegue un'operazione a seconda che il test sia positivo o negativo (da notare che è differente da if() else):


system.time(mtx2<-ifelse(mtx>=0,1,0))
user system elapsed
0.90 0.05 0.98



Anche qui la riduzione del tempo di elaborazione è molto significativa: 85%.

Riporto infine un esempio di vectorizing computing in cui si fa uso di matrici triangolari, molto utili in questo tipo di programmazione in R.
Consideriamo sempre la matrice mtx di 1000 casi per 1000 caratteristiche. Per ogni singolo caso (vettore riga) vogliamo calcolare il rapporto tra l'(i)-esimo elemento e la somma dei successivi 1000-i elementi (quindi la somma dei casi da (i+1) a 1000). La soluzione con un for necessita lo scorrimento dell'intera matrice in questo semplice modo:


N<-1000
mtx<-matrix(rnorm(N*N),N,N)
mtx2<-matrix(0,N,N) system.time(for (i in 1:N) for (j in 1:(N-1)) mtx2[i,j]<-mtx[i,j]/sum(mtx[i,(j+1):N]))
user system elapsed
37.99 0.17 39.93

Per la trasformazione in codice vettorizzato faccio uso del comando lower.tri(), che crea una matrice triangolare inferiore con valori TRUE e FALSE. Dal relativo help di R: "Returns a matrix of logicals the same size of a given matrix with entries TRUE in the lower or upper triangle".

Questo il codice:



N<-1000
mtx<-matrix(rnorm(N*N),N,N)
mtx2<-matrix(0,N,N)
system.time(mtx2<-mtx/(mtx%*%(1*lower.tri(matrix(0,N,N)))))
user system elapsed
2.55 0.00 2.67


Ho praticamente sostituito lo scorrimento dei dati mediante for, con un prodotto matriciale in cui vi è un'opportuna matrice triangolare inferiore. La riduzione del tempo di elaborazione è del 93%.

16 ottobre 2009

The Elements of Statistical Learning : download del libro !

Ho scoperto (solo ora) che è possibile scaricare il libro in oggetto!!!! Sicuramente da non perdere!!!
Downoald qui.

25 agosto 2009

R in Word: SWord

Un rientro dalle ferie con una bella novità: SWord per implementare soluzioni analitiche direttamente in Word, utilizzando R come motore di analisi dati. Il sito ufficiale è sempre quello di Statconn. Analogamente a quanto avviene in RExcel (come già trattato in miei altri post) è possibile direttamente in Word lavorare con R in modalità background o foreground. L'uso di tale package permette quindi di sviluppare un sistema di "reporting" mediante questo diffusissimo software di creazione di documenti. Si potrebbe pensare a "modelli" di documenti Word in cui riportare i risultati delle nostre analisi statistiche "al volo": l'utente apre il file .doc, clicca un tasto e visualizza i risultati delle eleborazioni in formato "testuale". Ovviamente, dietro le quinte ci sarà l'importazione di un dataset in R (ad esempio da un database esterno), l'elaborazione di un modello statistico e la visalizzazione dei risultati nel testo! Un'altra possibilità potrebbe essere l'utilizzo di SWord per creare dei documenti "interattivi" per illustrare il funzionamento di R. L'utente legge delle istruzioni e clicca un bottone per visulizzare ciò che avviene in R. Riporto un esempio semplicissimo, rimandando al sito ufficiale per gli approfondimenti. Come prima cosa, l'installazione: un semplice click sul file .exe che trovate qui. Sottolineo che l'uso in word di tale package si basa sui "Codici di campo", ossia dei "tag" molto utili per i quali si rimanda alla documentazione ufficiale. Per tale motivo è importante accertarsi che sia impostata la visualizzazione di essi. In Word 2003 si possono seguire le seguenti istruzioni: Strumenti > Opzioni > Visualizza > segno di spunta in corrispondenza di "Codici di campo". Consiglio anche di impostare "Ombreggiatura campo" a "Sempre".

23 giugno 2009

Prevedere il "brain drain" mediante un algoritmo

Uso intensivo dei dati come guida alle decisioni umane, una filosofia comune ormai a molte realtà aziendali.
Ovviamente google è un esempio vincente di uso di dati, e lo sviluppo di un modello per prevedere gli individui "più probabili" all'abbandono dell'azienda è un bel tentativo di previsione del comportamento umano!
Non ho trovato comunicazioni ufficiali della Google Inc. in cui vengono spiegati i dettagli dell'algoritmo (... chissà se c'è di mezzo l'uso di R ...), ma qui trovate maggiori informazioni.

22 maggio 2009

Alberi di Classificazione in Excel

Il titolo del post è veramente "forte", nel senso che sto dicendo che in Excel è possibile ricorrere ai famosi Alberi di Classificazione, più noti con il termine di CART: Classification and Regression Trees. In realtà c'è il solito trucchetto: il dataset è in Excel, ma le elaborazioni le fa R. La comunicazione tra i due strumenti, come ampiamente ripetuto in questo blog, avviene mediante statconnDCOM.
Prima di tutto, quindi, è necessario avere sulla propria macchina i giusti tools, come già descritto in questo mio precedente post. In realtà alla data in cui scrivo è disponbile RAndFriends, che fino a poco tempo fa era disponibile solo in versione "light". Io direi quindi di installare tutto, evitando scelte personalizzate delle componenti . In genere, comunque, nelle applicazioni eseguite in XP non ho mai riscontrato problemi di installazione (come ad esempio installare solo statconnDCOM).

Per quanto riguarda gli Alberi di Classificazione si fa riferimento a questa monografia, il cui progetto è coperto da copyright ed il cui software originale è distribuito dalla Salford System. In R è disponibile la libreria rpart, il cui maintainer è Brian Ripley (che a sua volta ha "portato" in R il codice disponibile in SPLUS, vedi qui per maggiori info). In R quindi si parla di Recursive partitioning and regression trees, e considerando l'autore dovremmo poter avere una certa fiducia per quanto riguarda l'affidabilità del codice!
La teoria che è alla base è abbastanza semplice da un punto di vista matematico, io infatti ho ritenuto molto scorrevole da lettura del libro di Friedman.

Per quanto riguarda lo sviluppo in Excel, direi che è praticamente semplicissimo, non dovendo fare altro che riportare in VBA il codice che si è testato direttamente in R. Nell'esempio seguente ho lavorato in modalità "Macro programming", ossia ricorrendo a RExcel.xla. Nell'esercizio riportato in Access, invece, si è sviluppato in modalità "RDCOM Server". La prima, infatti, è possibile solo in Excel. Nessuno comunque ci vietava di fare ricorso anche qui in Excel all'oggetto StatConnector. Su questa differenza, comunque, scriverò presto un post (nel frattempo, quello che c'è da sapere è sempre qui!!!!!).

Passiamo ora alla descrizione del dataset utilizzato per l'esempio.
Ho pensato di toccare un argomento molto attuale, ossia la previsione dello spam. Trattasi di un tipico esempio di classificazione di una variabile dicotomica sulla base di informazioni relative al testo dell'email. Quindi la variabile risposta assumerà valori 0 (non spam) o 1 (spam).
Nel nostro dataset di esempio le variabile predittive sono semplicemente variabili di conteggio relative all presenza (in %) di alcune parole. Potete scaricare i dati e tutte le informazioni direttamente qui.
Riporto di seguito il codice associato ad un pulsante di comando. Al suo click ai avvia R in back-end e si caricano in R i dati disponibili in Excel (in un foglio nominato "dbxls"). Successivamente avviene la stima del modello e la visualizzazione dell'albero di classificazione finale. Ovviamente quando si chiude il server (Call Rinterface.StopRServer) si chiuderà anche la visualizzazione del grafico. Per evitare questo ho semplicemente messo un MsgBox che permette la visualizzazione dell'immagine fino al click su OK. Se volete riprovare ad eseguire il tutto dovete cambiare i nomi delle variabili predittive in v1, v2, ... , v57, mentre l'ultima sarà nominata "spam" (appunto la variabile dipendente).
Trattandosi di un esempio, non mi sono soffermato su vari aspetti della costruzione dell'Albero (quali previsione e pruning), ma la loro implementazione è semplice una volta capito il meccanismo.
Riporto il codice VBA:

'*************************************
Private Sub cmd_Click()
On Error GoTo errore
Dim rng As Range
Set rng = Worksheets("dbxls").Range("A1:BF4602")
Call Rinterface.StartRServer
Call Rinterface.RRun("library(rpart)")

Call Rinterface.PutDataFrame("db", rng)
Call Rinterface.RRun _
("db<-cbind(db[,1:57],spam=as.factor(db[,58]))") Call Rinterface.RRun("fit<-rpart(spam~.-spam, data=db)") Call Rinterface.RRun("plot(fit)") Call Rinterface.RRun("text(fit)")

MsgBox _
"Cliccando ok procedi con la chiusura di RServer"
Call Rinterface.StopRServer


Exit Sub
errore:
Call Rinterface.StopRServer

End Sub
'*************************************

La bellezza di tale metodo sta prima di tutto nell'immediatezza del grafico. Come potete vedere, facendo "cadere" un dato attraverso l'albero si arriva immediatamente alla soluzione:
  1. v53 è minore di 0.05? Sì, allora vai a destra dell'albero.
  2. v25 è >= 0.4? Sì, allora vai a destra dell'albero.
  3. spam=1
quindi la previsione più probabile è che l'email in questione sia spam! Una piccola curiosità: in tali dati la variabile più significativa (quella che determina lo split più discriminante) è la v53, ossia la presenza in percentuale del carattere dollaro: "$". Se tale percentuale supera il 5.5% si passa ad analizzare la v25, ossia la presenza della parola "hp". Se quest'ultima è a sua volta presente con una percentuale maggiore o uguale al 40% allora l'email è considerata spam. Sicuramente più interessante (in quanto meno scontata) è l'analisi dell'albero a sinistra del primo split:
  1. v53: percentage of character "$"
  2. v25: percentage of word "hp"
  3. v7: percentage of word "remove"
  4. v52: percentage of character "!"
  5. v57: sum of length of uninterrupted sequences of capital letters
  6. v16: percentage of word "free".
Infine una piccola considerazione.
La "facilità" di cui parlo sempre per l'uso di R ed Excel (o Access) è sempre legata ad una certa padronanza di R e di VBA, ovviamente! Nello stesso tempo è necessaria una certa conoscenza teorica del metodo che si andrà ad utilizzare. Inoltre l'uso contemporaneo di Excel/Access ed R è da me pensato per un'implementazione (facile) di modelli statistici di analisi e previsione da parte di uno statistico che lavora per utente finale "non esperto" (e che quindi vuole una soluzione finale del tipo "click and go" :-) .

28 aprile 2009

OLAP e Statistical Databases: similarità nella terminologia

Veramente interessante questo articolo di Arie Shoshani sulle similarità (e differenze) esistenti tra le terminologie tipiche della Statistica, da un lato, e del Data Mining , dall'altro (...quest'ultimo inteso in senso molto generale...). Anche se di una decina di anni fa, l'articolo è sicuramente attuale per chi lavora in ambito "analitico". Chi infatti ha una formazione "statistica" e si trova a lavorare con i database, rifletterà sicuramente sulle analogie esistenti tra i termini normalmente utilizzati nei testi di Statistica e quelli molto utilizzati dai produttori di software per il Data Mining e la Business Intelligence. L'esempio più evidente è l'analogia tra multidimensional space e data cube. Direi che di grande significatività è la tabella dell'articolo sulle corrispondenze tra le due differenti terminologie:





02 aprile 2009

Le novità di R(D)COM: statconnDCOM

Da un po' aspettavo questo aggiornamento e devo dire che le cose sono cambiate abbastanza! Non solo è cambiato il sito, ma anche le modalità di installazione, configurazione e download. Diventa anche più evidente la relazione tra il progetto rcom e la statconn di Thomas Baier ed Erich Neuwirth (e quindi i relativi corsi di formazione).
La novità più evidente è la possibilità di scaricare RAndFriendsLight, ossia un pacchetto che contemporaneamente installa e configura tutto il necessario:
R 2.8.1
rscproxy 1.0-12
rcom 2.xx
RExcel 3.0-11 .
Credo comunque che la situazione più frequente sia quella in cui lo sviluppatore disponga già di R sulla propria macchina. In tale caso (considerando che è obbligatoria una versione >= 2.7.2) sarà necessario optare per le altre modalità indicate nell'area downolad.
La procedura di configurazione, comunque, è chiaramente descritta qui.
Ovviamente con questa nuova struttura del progetto si sottolinea (giustamente!!!) che la redistribuzione del prodotto in altre soluzioni necessità di una licenza commerciale...

24 marzo 2009

I package "orfani" di R

Mi son sempre chiesto quale fosse la procedura adottata dal team di R nel caso in cui il maintainer di una libreria si rendesse irreperibile o non fosse più disposto al relativo "sviluppo". Ovviamente la risposta è sul sito del CRAN: semplicemente il pacchetto continuerà ad essere disponibile fin quando passerà il test <<R CMD check>>. Ora che scrivo ve ne sono 57 di librerie orphaned, quindi effettivamente si corre un rischio (...a mio parere minimo...) di ritrovarsi senza il pacchetto sul quale si era investito tempo e denaro...

27 febbraio 2009

Numeri pseudo-casuali e software statistici

La generazione di numeri pseudo-casuali è un argomento di fondamentale importanza per le applicazioni in statistica. La "bontà" dell'algoritmo utilizzato in un software è quindi decisivo per la validità delle simulazioni eseguite mediante esso. In questo breve post intendo soffermermi sugli algoritmi impementati in R, SAS ed SPSS.
L'argomento è stato trattato ampiamente dagli studiosi e continua ad attirare l'attenzione di statistici ed informatici (...ammesso che in tale ambito sia possibile fare questa distinzione tra le due discipline...), ed ovviamente gli sviluppatori dei software sopra citati non possono che seguire gli sviluppi della scienza.
I numeri peseudo-casuali sono chiamati in tale modo appunto perché sono "deterministici" ma "sembrano" casuali. Sono generati da un algoritmo implementato in un calcolatore (quindi deterministisco) ma soddisfano una serie di proprietà che li fanno "sembrare" casuali per gli scopi prefissati, quindi per la simulazione di un qualche fenomeno. L'algoritmo più famoso è il Generatore Lineare Congruente (Linear Congruential Generators) riassunto dalla seguente funzione di trasferimento:
f(x) = (ax + c) mod m .
mod è la funzione che fornisce il resto della divisione intera, ossia:
x mod y = y ( x/ y - [x/y] )
dove [h] è la parte intera inferiore di h. Quindi ad esempio 11 mod 3 = 3 * (11/3 - [11/3]) = 3*(3.6667 - 3) = 2.
Qundi si fissano a, c ed m, si parte da un valore inziale X_0 e si ottiene X_1 = f(X_0) . A questo punto si genererà il numero pseudo-casuale (in [0, 1[ ) mediante una funzione output (la più semplice è X_j /m). La funzione di trasferimento più semplice e più conosciuta è invece quella di Park-Miller, in cui si impone semplicemente c=0.
Per una trattazione teorica molto chiara ed esaustiva si legga qui.
La tipologia di algoritmo appena citato è stato nel tempo criticato e praticamente sostituito dal generatore di Mersenne-Twister (M-T).
Ovviamente, poiché R è sempre "avanti" :-) , quest'ultimo è l'algoritmo di default già da tempo, mentre gli altri software sono stati aggiornati da un po'.
In SAS infatti, fino alla versione 9.0, l'unico algoritmo disponibile era il Generatore Lineare Congruente nella versione di Park-Miller con i seguenti parametri:
c=0
a=397204094
m=2^31-1 .
Solo dalla 9.1 è finalmente disponibile anche la funzione RAND che appunto si basa sull'algoritmo di M-T!!!! (chi vuole approfondire può leggere qui).
Mi dilungo sul SAS perché trovo molto macchinoso il procedimento di gestione delle sequenze dei numeri casuali. Utilizzando la funzione RANUNI(seed) in un datastep, cambiare il seed (ossia il valore di x_0 nel generatore) non avrà influenza sulla sequenza di numeri casuali poiché l'estrazione avverrà sempre dallo stesso stream (ossia flusso, ma in inglese fa più figo :-) ). Per avere un controllo della sequenza sarà necessario ricorrere a CALL RUNUNI(seed) dove il seed deve essere una variabile e non una costante.
Si provi ad eseguire il seguente codice per capire la distinzione:

data test;
do i=1 to 10;
x = RANUNI(1);
output;
end;

run;

data test_i;
do i=1 to 10;
x = RANUNI(i);
output;
end;
run;


data test_call;
do i=1 to 1;
call RANUNI(i,x); /*con ranuni(1,x) va in errore*/
output;
end;
run;


Per quanto riguarda infine l'SPSS, si faccia riferimento al menu " Trasforma / Generatori numeri casuali " per scoprire il tipo impostato. Consiglio ovviamente di utilizzare il generatore di Mersenne-Twister con inizializzazione casuale (ossia derivata dall'orologio di sistema). Più semplice forse farlo direttamente aprendo un file di sintassi .sps e settando mediante codice:
SET RNG=MT MTINDEX=RANDOM.

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: