UNIVERSITA DEGLI STUDI DI PADOVA
FACOLTA DI SCIENZE STATISTICHE
Quaderni ASID
Quaderno 1
Claudio Agostinelli e Silvia Sartorelli
Introduzione al linguaggio di SAS System
2008
INDICE
1. La struttura e la sintassi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 L’interfaccia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Il linguaggio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Le fasi del DATA STEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 L’applicazione Enterprise Guide . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. L’Acquisizione dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1 L’ambiente di lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 L’acquisizione di dati ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3 L’acquisizione automatica dei file . . . . . . . . . . . . . . . . . . . . . . . . 14
3. Procedure utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1 Alcuni concetti generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 PROC SORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3 PROC PRINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4 PROC FSVIEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.5 PROC CONTENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.6 PROC FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4. Manipolazione di dataset in formato .sas7bdat . . . . . . . . . . . . . . . . . . . 22
4.1 Creazione di sottoinsiemi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Assegnazione e riclassificazione . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3 Unione di dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5. Esempi di procedure statistiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.1 PROC FREQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.2 PROC UNIVARIATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.3 PROC REG, PROC GPLOT e PROC CORR . . . . . . . . . . . . . . . . . 33
5.4 PROC TABULATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.5 PROC ANOVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.6 PROC CLUSTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.7 PROC FACTOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.8 PROC LOGISTIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.9 PROC CORRESP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6. Altro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.1 Dataset di versioni diverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2 Cambio di formato: numerico vs carattere . . . . . . . . . . . . . . . . . . . 51
6.3 Ricostruzione di gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.4 Accenni sulle macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
PREFAZIONE
Lo scopo di questo quaderno e quello di fornire a studenti e tesisti gli strumenti per iniziare
l’utilizzo del pacchetto statistico SAS. Il testo richiama l’attenzione sugli aspetti pratici di
acquisizione e manipolazione dei dati e su alcune procedure statistiche.
Lontano dall’esaurire l’argomento, il quaderno mette l’utente in grado di cogliere ra-
pidamente le caratteristiche fondamentali del programma e di avviarsi autonomamente al-
l’approfondimento delle procedure che gli saranno necessarie per lo svolgimento del proprio
lavoro.
La presente dispensa costituisce un aggiornamento (non sostanziale) della seconda stesu-
ra, che e datata settembre 2002. Rispetto alla seconda stesura sono stati corretti e aggiunti
alcuni dettagli (soprattutto nel capitolo 4), il capitolo 1 e stato aggiornato con riferimento
alla versione di SAS 9.1 ed il paragrafo relativo all’applicazione Analyst e stato sostituito
con uno relativo all’applicazione Enterprise Guide.
La presente dispensa e stata scritta in LATEX.
Ringraziamo tutti quelli che gia ci hanno aiutato o che lo faranno in futuro con preziosi
suggerimenti. Gli autori sono raggiungibili per e-mail ai seguenti indirizzi:
Claudio Agostinelli: [email protected]
Silvia Sartorelli: [email protected]
Padova, lı 30 agosto 2008
Claudio Agostinelli, Silvia Sartorelli
Questa opera viene rilasciata sotto la licenza Creative Commons: Attribuzione - Non
commerciale - Condividi allo stesso modo 2.5 Italia. Il fruitore e libero di riprodurre, di-
stribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire e recitare
quest’opera e di modificare quest’opera.
Alle seguenti condizioni: deve attribuire la paternita dell’opera nei modi indicati dall’au-
tore o da chi ha dato l’opera in licenza; non si puo usare quest’opera per fini commerciali;
se si altera o trasforma quest’opera, o se la si usa per crearne un’altra, si puo distribuire
l’opera risultante solo con una licenza identica a questa.
Ogni volta che si usa o si distribuisce quest’opera, si deve farlo secondo i termini di questa
licenza, che va comunicata con chiarezza. In ogni caso, si puo concordare col titolare dei
diritti d’autore utilizzi di quest’opera non consentiti da questa licenza.
Questa licenza lascia impregiudicati i diritti morali.
1. LA STRUTTURA E LA SINTASSI
Il SAS e un pacchetto statistico molto potente e complesso. E strutturato in “parti”, che
vengono denominate moduli. Il modulo principale e SAS\Base, al quale si possono aggiun-
gere altri moduli di interesse. Nell’aula informatica del nostro dipartimento (ASID) sono a
disposizione SAS\STAT (che e il modulo deputato alle elaborazioni statistiche), SAS\IML
(per il calcolo matriciale), SAS\GRAPH (per la composizione di grafici ad alta risoluzio-
ne), SAS\ETS (per l’analisi delle serie storiche) etc. Questa dispensa fa riferimento alla
versione 9.1.
Nel SAS, come nella maggior parte dei programmi, possiamo distinguere due componenti:
il programma vero e proprio e la sua interfaccia.
1.1 L’interfaccia
Nel sistema operativo che attualmente e adottato in ASID (Windows XP) l’interfaccia grafica
e costituita sostanzialmente da cinque finestre e da un certo numero di menu a tendina. Le
tre finestre principali hanno ciascuna il proprio determinato scopo e sono chiamate:
• EDITOR
• OUTPUT
• LOG
Tecnicamente le finestre di EDITOR sono due. Quella di PROGRAM EDITOR si attiva solo
a richiesta ed era quella principale fino alle versione 7, sostituita da quella attuale, migliorata
e percio chiamata ENHANCED EDITOR. Dalla versione 8 sono attive anche le finestre:
• EXPLORER
• RISULTATI
Il SAS e un programma in grado di compiere diverse elaborazioni, alcune delle quali piuttosto
complesse e di gestire con facilita enormi quantita di dati, ma perche compia tutte queste
operazioni, e necessario “indicargli come fare”.
Nella finestra di EDITOR si scriveranno le istruzioni che desideriamo far eseguire a SAS.
Queste dovranno essere scritte in un linguaggio che ha precise regole di sintassi.
Nella finestra di OUTPUT verranno visualizzati i risultati che si ottengono dalla elabo-
razione delle istruzioni eseguite da SAS.
Nella finestra di LOG compariranno informazioni sull’elaborazione come la segnalazione
di errori di sintassi nella scrittura dei comandi o il nome degli archivi che si stanno elaborando,
il numero di osservazioni presenti e cosı via.
La finestra di EXPLORER permette di navigare tra directory e file, che sono risorse
predefinite del programma o collegate dall’utente, mentre la finestra dei RISULTATI per-
mette di navigare comodamente nella finestra di OUTPUT tra i risultati delle elaborazioni,
organizzati in una struttura ad albero.
1. La struttura e la sintassi 2
Le cinque finestre vengono aperte automaticamente all’avvio del programma; noi pos-
siamo passare dall’una all’altra comodamente utilizzando i comandi da tastiera o il mouse
o i menu, rendendo attiva di volta in volta la finestra che ci serve. Altre finestre vengono
automaticamente avviate quando sono specificate richieste particolari come ad esempio la
creazione di un grafico.
La composizione dei menu dipende dalla finestra attiva e puo variare notevolmente. La
disposizione relativa alla finestra di EDITOR e la seguente da sinistra a destra (per ogni
menu riportiamo solo le voci che sono essenziali):
File
Nuovo programma Apre una nuova finestra di Enhanced Editor.
Apre programma Legge un file esistente e lo carica nella finestra attiva.
Salva Salva il contenuto della finestra attiva.
Salva con nome Salva il contenuto della finestra attiva dando la possibilita di speci-
ficare il nome del file.
Importa dati Permette di importare direttamente un file di dati memorizzato in un
formato diverso dal formato di SAS.
Esporta dati Permette di esportare direttamente i dati in file di formati diversi.
Stampa Stampa il contenuto della finestra attiva.
Esci Termina la sessione di lavoro.
Modifica Nei sottomenu di questa voce sono disponibili le operazioni di copia, incolla,
taglia, seleziona, trova e sostituisci, comuni a tutte le applicazioni di Windows.
Visualizza Permette lo spostamento e il richiamo di finestre anche nel caso fossero state
precedentemente chiuse.
Strumenti SAS offre un insieme di strumenti e programmi di utilita pronti all’uso:
Query Finestra di un’applicazione interattiva che semplifica il processo di costruzione
ed elaborazione di Query SQL.
Editor delle Tabelle Richiama la finestra VIEWTABLE che permette di visualiz-
zare, modificare e creare dataset.
Editor dei grafici Applicazione interattiva per la modifica di grafici creati in
SAS o importati da altre applicazioni.
Editor dei prospetti Richiama una finestra per l’uso di PROC REPORT (la PROC
REPORT combina caratteristiche di varie procedure in un unico strumento di report
writing che puo produrre una varieta di prospetti).
Editor delle immagini Permette di leggere, manipolare e memorizzare immagini.
Editor dei testi Permette di aprire diverse finestre per creare, modificare, salvare
e mandare in esecuzione programmi SAS.
Esegui Questo e un menu specifico della finestra di EDITOR di SAS.
Sottometti Esegue le istruzioni contenute nella finestra.
Richiama ultima sottomissione Richiama nella finestra le istruzioni eseguite con
l’ultimo Sottometti.
1. La struttura e la sintassi 3
Sottometti prima riga Esegue le istruzioni che sono sulla prima riga della finestra.
Soluzioni Richiama un elenco di soluzioni ed applicazioni pronte all’uso tramite finestre,
utilizzabili o meno a seconda del tipo di licenza in possesso dell’utente.
Finestra Serve per la gestione delle finestre, ha la stessa funzione svolta in tutte le altre
applicazioni di Windows.
? Attiva l’aiuto in linea.
1.2 Il linguaggio
Nel linguaggio SAS i comandi principali possono essere classificati in due grandi categorie
chiamate “passi” (Step):
• I comandi di un passo di DATA (DATA STEP) servono per l’acquisizione di dati da un
archivio in formato ASCII e per la creazione, la gestione e la manipolazione di insiemi
di dati (dataset) in formato SAS.
• I comandi di PROC STEP sono procedure per l’analisi dei dati. In ogni PROC STEP viene
implementato un insieme di metodi statistici, come ad esempio il calcolo di indici di
posizione quali medie di vario ordine (media, mediana, moda, quantili) e di variabilita
(varianza, scarto interquartile). Un elenco delle procedure disponibili puo essere trovato
nell’help in linea oppure nei manuali di SAS.
Alcuni particolari PROC STEP servono per l’acquisizione di dati da formati diversi da
quello ASCII. In particolare esistono procedure per l’acquisizione di dati in formato
Database (versioni DB3 e DB4).
Infine alcuni comandi di PROC STEP servono per visualizzare e/o stampare i dati e i
risultati delle analisi che abbiamo svolto.
Esistono in SAS altri comandi che non rientrano in queste due categorie, in particolare
i comandi globali e i comandi macro. I comandi globali servono per modificare alcuni pa-
rametri quali ad esempio il numero di colonne da utilizzare per visualizzare e/o stampare i
risultati. I comandi macro servono per automatizzare o rendere piu flessibile l’utilizzo dei
comandi di Step. In questa introduzione al linguaggio SAS trova posto solo qualche accenno
al linguaggio delle macro, ci si puo riferire al manuale di SAS per una completa introduzione
all’argomento.
Come ogni linguaggio di programmazione anche il linguaggio di SAS segue alcune regole
generali di sintassi per la formazione dei comandi.
Regole di sintassi per i comandi
- Ogni istruzione o comando finisce sempre con il punto e virgola (;).
- Il linguaggio SAS non distingue le lettere maiuscole dalle minuscole. Quindi le
istruzioni possono essere scritte sia in lettere maiuscole che in minuscolo.
- Le istruzioni possono essere scritte sulla stessa riga, perche cio che indica la fine di una
istruzione e l’inizio della successiva e il punto e virgola (;).
- Le istruzioni possono continuare su righe successive, la cosa importante e che nessun
comando, nome di variabile o altro venga “spezzato”
1. La struttura e la sintassi 4
- Le istruzioni possono iniziare in qualsiasi colonna.
- Le parole che compongono una istruzione sono separate da uno spazio o da un operatore
(un esempio di operatore e il segno di uguale =).
Infine l’utilizzo di commenti, di rientri per evidenziare parti di una istruzione, di linee vuote
tra un insieme di istruzioni e l’altro e qualsiasi altra precauzione che renda il programma
piu chiaro sono regole che fanno parte della buona programmazione, rendono il lavoro di
scrittura piu facile e il riutilizzo dei programmi agevole. L’Enhanced Editor ci facilita il lavoro
colorando diversamente ed in modo personalizzabile le parti del programma a seconda che
siano istruzioni, parametri, opzioni, commenti, etc. I commenti vanno inserite tra i simboli
/* commenti */ oppure * commento ;, quest’ultima pero funziona solo se non sono presenti
“;” nel testo, perche il primo viene interpretato come conclusione del commento.
Le regole che abbiamo visto riguardano le istruzioni, le regole di sintassi proprie per i
nomi delle variabili o dei dataset di SAS sono le seguenti:
Regole di sintassi per i nomi delle variabili e dei dataset
- I nomi delle variabili possono essere formati con un numero di caratteri da 1 a 32.
- Il primo carattere deve essere una lettera o il sottolineato ( underscore).
- I caratteri che seguono il primo possono essere lettere, numeri o il sottolineato.
- Gli spazi non possono essere usati per definire il nome di una variabile o di un dataset.
Le variabili inoltre hanno degli attributi:
NAME: il nome della variabile.
TYPE: il tipo di variabile:
• Numeriche. Le variabili di tipo numerico possono contenere solo numeri.
• Alfanumeriche. Le variabili di tipo alfanumerico possono contenere numeri, lettere
e caratteri speciali (la stella *, la percentuale %, . . . ).
LENGTH: la lunghezza del contenuto di una variabile, il valore predefinito (di default) e di
otto caratteri, il valore massimo e di 256 caratteri.
LABEL: contiene una descrizione del contenuto della variabile.
INFORMAT: serve per definire le caratteristiche della variabile in fase di acquisizione.
FORMAT: indica come deve essere stampato e/o visualizzato il contenuto della variabile.
1.3 Le fasi del DATA STEP
Per sfruttare a pieno le potenzialita di manipolazione dei dati che SAS ci mette a disposi-
zione e necessario fin da ora conoscere quali sono le fasi che compongono un DATA STEP. Si
possono distinguere due fasi principali: nella prima, chiamata Fase di compilazione, tutto
il contenuto della finestra di EDITOR sara analizzato per verificare che non vi siano errori
di sintassi e che quindi SAS sia in grado di interpretare tutti i comandi. Successivamente,
se non sono stati riscontrati errori, il contenuto della finestra di EDITOR viene compilato,
1. La struttura e la sintassi 5
cioe tradotto in un linguaggio piu vicino alla macchina ed eseguito. Se invece vi sono errori
di sintassi allora un messaggio comparira nella finestra di LOG e a seconda della gravita
dell’errore l’esecuzione verra terminata oppure proseguita eliminando le righe di comandi
coinvolte nell’errore.
Nella seconda fase, chiamata Fase di esecuzione, i comandi del DATA STEP vengono
eseguiti per tutte le osservazioni presenti nel dataset. Quindi normalmente i comandi che
vengono specificati sono eseguiti su tutte le osservazioni. Questo fatto differisce da molti
programmi che siamo abituati ad adoperare e spesso e necessario un po’ di tempo prima
di riuscire a cogliere questo aspetto. Nel diagramma di flusso rappresentato in figura 1.1 a
pagina 7 abbiamo sintetizzato le fasi di un DATA STEP.
1.4 L’applicazione Enterprise Guide
Negli ultimi anni i produttori di SAS hanno dedicato molte risorse ed attenzione a programmi
che permettano l’uso di SAS anche da parte di utenti inesperti. Enterprise Guide e appunto
un applicativo Windows grazie al quale utenti privi di conoscenze SAS e di esperienza di
programmazione possono perseguire i propri obiettivi di manipolazione dei dati e di ricerca
statistica.
Sostanzialmente Enterprise Guide e un generatore di codice tramite menu, finestre di
dialogo e funzionalita drag-and-drop. Non e piu necessario conoscere, scrivere e mandare in
esecuzione il codice proprio di SAS ma sara sufficiente richiamare tramite menu o tramite
la finestra Elenco dei processi le finestre appropriate, compilarne i campi e ottenere cosı
di procedere ad analisi statistiche, alla gestione di dati, alla scrittura di report, etc. Il codice
ottenuto in questa maniera e modificabile1 tramite un editor interno oppure puo essere
salvato e riutilizzato nel SAS tradizionale o in ambiente batch.
Enterprise Guide e un programma a parte, che va installato separatamente, ma che poi si
appoggia al SAS vero e proprio. All’avvio presenta una finestra in cui propone di aprire un
progetto preesistente oppure di aprire un nuovo progetto, un nuovo programma SAS oppure
nuovi dati. L’insieme dei dati, del codice generato, degli eventuali risultati in forma di tabelle
e grafici, compreso il flusso del processo che li ha generati, viene definito appunto Progetto
e puo essere salvato in un’unica entita che avra estensione .egp.
L’ambiente di lavoro iniziale prevede tre finestre:
Designer dei progetti: e l’area di lavoro del progetto ed e formata principalmente dalla
scheda Flusso dei processi, che contiene uno o piu flussi di processo, gli oggetti
costituenti il progetto e la relazione tra di essi e poi da altre schede che di volta
in volta saranno i dati e/o le tabelle di risultati, etc. Ogni oggetto e rappresentato
tramite un’icona e queste sono collegate tra loro da frecce che simboleggiano il flusso
dei processi
Explorer dei progetti: presenta la struttura ad albero del progetto e permette l’accesso
alle singole compenenti e la loro gestione comprese la cancellazione ed il salvataggio
Stato dei processi: consente di seguire le fasi del processo mandato in esecuzione e
di controllarne l’andamento; rimane vuota alla conclusione del processo avviato ed il
relativo log sara accessbile come nodo del progetto dall’Explorer
Possiamo caricare dati esistenti da file gia in formato .sas7bdat o anche in altri formati
di input oppure possiamo inserirli direttamente in una matrice. Una volta caricati i dati si
1 seppure con forti limiti, come vedremo
1. La struttura e la sintassi 6
potra accedere ai menu per la manipolazione (menu Dati), il controllo, la descrizione (menu
Descrivi) e l’analisi dei dati (menu Analizza e Grafico). Una volta richiamate le finestre
relative alle voci di questi menu, si dovranno compilare i campi richiesti ma la trattazione
di questa parte richiederebbe troppo spazio e va oltre gli intenti della presente dispensa. Si
fa notare, pero, che ciascuna finestra permette la visualizzazione del codice (tramite il tasto
Anteprima codice in basso a sinistra) ed eventualmente la modifica tramite il seguente
Inserisci codice, ma sono possibili solo modifiche parziali perche l’inserimento del codice
dell’utente e permesso solo in alcuni punti del codice generato. Per avere pieno controllo
del codice bisognera salvarlo separatamente in un file esterno e reimportarlo aprendo una
propria finestra di codice (File >> Apri >> Codice).
Il repertorio di procedure statistiche e grafiche e molto vasto. Si possono calcolare sta-
tistiche descrittive e test, studiare modelli con analisi della varianza e regressioni, inoltre ci
sono voci per analisi di dati di sopravvivenza, delle serie storiche e alcune tecniche multiva-
riate come l’analisi dei cluster e l’analisi fattoriale. L’elenco completo dei processi accessibili
e visualizzabile in una finestra apposita, chiamata appunto Elenco dei processi, evocata
da Visualizza >> Elenco dei processi. La finestra presenta due schede in cui i processi
sono elencati per categoria oppure per nome ed e possibile “fissarla” in modo che rimanga
come finestra nell’ambiente di lavoro.
I risultati delle singole analisi ed i grafici sono presentati in schede separate della finestra
principale e tutto il progetto e organizzato nell’albero dell’Explorer dei progetti. Le
schede possono essere chiuse per comodita e parsimonia ma ogni singolo risultato rimane
come un nodo dell’albero e puo da qui essere ripreso, cancellato, sviluppato e stampato.
1. La struttura e la sintassi 7
Fig. 1.1: Diagramma di flusso delle azioni in un passo di DATA
Fase di compilazione
Fase di esecuzione
Controllo della sintassi
Compilazione dei comandi
Creazione di:
un buffer di input
una descrizione del buffer
un vettore (record) per i dati
Inizio del passo di DATA
C’e un record da leggere? Chiusura del dataset
Lettura di un record
Esecuzione di altri comandi
Esempio: Calcolo del valore di
una variabile
Scrittura di una osservazione
(record) nel dataset
Reinizializzazione del contenuto
del buffer a dato mancante
No
Sı
2. L’ACQUISIZIONE DEI DATI
Il SAS e un pacchetto in grado di fare numerose e notevoli elaborazioni statistiche, ha grandi
capacita di calcolo ed e in grado di gestire facilmente enormi quantita di dati. Condizione
imprescindibile perche queste operazioni abbiano effetto e quello di usare file che siano in
formato .sas7bdat, il formato interno di SAS.
Il nostro primo problema, quindi, e quello di acquisire i dati e di trasformarli nel formato
riconoscibile dal programma. Dato che generalmente si utilizzano file ASCII (.txt e .dat)
e file provenienti da database facilmente convertibili in .dbf o .xls, ci occuperemo di questi
casi.
2.1 L’ambiente di lavoro
L’ambiente di lavoro predefinito da SAS e una directory temporanea di nome WORK. Tutto
cio che viene memorizzato in questa directory viene cancellato al termine di ogni sessione di
lavoro. E possibile, pero, indicare a SAS di cambiare la directory di lavoro e di utilizzare
una directory personale: tutto cio che verra memorizzato in quest’ultima non andra perduto
dopo la chiusura della sessione e potra essere utilizzato in sessioni di lavoro successive.
Oltre a WORK, esiste una directory di lavoro permanente predefinita per SAS che si
chiama My SAS Files e nel contesto del nostro laboratorio si trova in c:\utenti; a tale
directory ci si riferisce con il nome SASUSER. La si trova elencata tra le directory accessbili
tramite la finestra EXPLORER. Per usare i file memorizzati qui vanno seguite le regole del
nome a due livelli descritte nel seguito.
Per utilizzare directory di lavoro diverse da WORK e SASUSER e necessario creare una
corrispondenza tra la directory che vogliamo usare e un nome logico. Si puo scegliere tra due
strade: utilizzare il comando globale oppure operare da menu. Il comando SAS da scrivere
nell’EDITOR per questa operazione e LIBNAME e la sintassi e:
LIBNAME nomelogico ’x:\nomecompletodirectory’;
L’alternativa e scegliere l’icona Nuova Libreria dalla barra degli strumenti e completare la
finestra con quello che sara il nome logico della directory ed il percorso alla stessa.
Come gia detto LIBNAME e un comando globale quindi puo essere usato al di fuori di
qualsiasi STEP e basta mandarlo in esecuzione solo una volta all’inizio della sessione di lavoro.
I nomi logici seguono le stesse regole di sintassi dei nomi delle variabili. Il nome logico
indichera la directory fino all’interruzione della sessione di lavoro corrente e dovra essere
ricreato per ciascuna sessione di lavoro successiva. E possibile creare molti collegamenti con
directory diverse in un’unica sessione di lavoro.
Tutti i dataset utilizzati possono avere nomi a uno o due livelli. Si dice nome a due
livelli quello premesso dal nome logico e da un punto (nomelogico.nomefile); tale file sara
memorizzato permanentemente nella directory di lavoro indicata dal nome logico. Si dice,
invece, nome ad un livello quello “semplice”; in questo caso il file sara memorizzato in WORK
e cancellato alla chiusura della sessione.
2. L’Acquisizione dei dati 9
2.2 L’acquisizione di dati ASCII
Molti file di dati sono in formato ASCII; le informazioni si presentano semplicemente in righe
e colonne di numeri e caratteri e sono visibili con qualsiasi editor di testo.
Possiamo dividere tali tipi di file principalmente in due categorie: quelli con i dati in
formato libero e quelli con i dati in formato colonna. Nei primi le informazioni si succedono
l’una dopo l’altra separate da qualche carattere di delimitazione quali lo spazio, il punto e
virgola, etc. Nei secondi, invece, le informazioni possono essere anche tutte di seguito ma
hanno una struttura ben precisa e, grazie al tracciato record, siamo in grado di distinguere
le informazioni sulla base della colonna che essi occupano.
I comandi SAS per l’acquisizione di file ASCII sono INFILE ed INPUT; vediamo prima la
sintassi essenziale e poi esamineremo qualche esempio.
LIBNAME nomelogico ’x:\nomedirectory’;
DATA nomelogico.nomefilesas;
INFILE ’y:\percorsocompleto\nomefile.txt’;
INPUT v1 v2 ... ;
RUN;
- LIBNAME crea il collegamento tra una directory sul disco X: e un nome logico.
- DATA inizia il Data Step e il nome scritto di seguito (nome a due livelli) indica quale sara
il nome del file di formato .sas7bdat che verra creato e che conterra le informazioni
acquisite dal file ASCII.
- INFILE specifica qual e il nome del file esterno da acquisire.
- INPUT descrive la struttura del file. Se si usa il formato libero occorre scrivere l’elenco
dei nomi delle variabili, nella sequenza in cui sono presenti sul file da acquisire; se si
usa il formato colonna occorre aggiungere l’indicazione del numero della colonna (o
delle colonne) su cui l’informazione si trova. In entrambi i casi le variabili verranno
acquisite come numeriche, se invece sono alfa-numeriche bisogna specificarlo utilizzando
il simbolo $ subito dopo il nome delle variabili corrispondenti.
- RUN conclude il passo di DATA.
Vedremo adesso un esempio di acquisizione di file in formato libero, uno di acquisizione di
file in formato colonna e infine un esempio piu complesso, in cui useremo il formato misto
e le principali opzioni utilizzabili. Tutti gli esempi fanno riferimento alla situazione del
laboratorio, per cui i dati iniziali sono memorizzati sul disco condiviso i:\labsas e vengono
salvati permanentemente nella directory c:\utenti\lab.Esempio 2.1: Acquisizione di dati in formato libero.
Il file che dobbiamo acquisire ha il seguente aspetto:
Finestra dell’editor di testo
Alfredo M 14 8 6
Alice F 13 7 7
Barbara F 13 5 6
Betty F 14 6 5
(...)
2. L’Acquisizione dei dati 10
Le informazioni, che sono su righe di lunghezza diversa, sono scritte una di seguito all’altra
separate da spazi e non ci sono dati mancanti. Il codice da scrivere nella finestra di EDITOR
e il seguente.
Finestra di Program Editor
DATA classe;
INFILE ’i:\labsas\piano1.txt’;
INPUT nome $ sesso $ eta teoria piano;
RUN;
La prima riga di comando DATA classe; inizia il passo di DATA e crea il dataset di nome
classe in formato SAS. Il dataset classe e di tipo temporaneo, questo significa che una
volta chiusa la sessione di lavoro non sara piu possibile accedere al contenuto del dataset
classe in una sessione di lavoro successiva.
Con l’istruzione INPUT descriviamo la struttura del file: nominiamo le variabili e indi-
chiamo qual e il loro tipo. Nel dataset classe troviamo cinque variabili: nome e sesso di
tipo carattere, come indicato dal simbolo $, ed eta, teoria e piano di tipo numerico (il tipo
di default, nel caso non sia specificato diversamente). Questo tipo di INPUT e detto INPUT a
formato libero.
Ci deve essere una corrispondenza biunivoca tra i nomi delle variabili elencati dopo INPUT
e i valori delle variabili che si susseguono nel file da acquisire. Se, per esempio, ci fosse stata
un’ulteriore colonna di dati, il SAS si sarebbe comunque limitato a leggere le prime cinque,
non “sapendo” di doversene aspettare delle altre.
Il comando RUN; conclude il passo di DATA.
⋄
Esempio 2.2: Acquisizione di dati in formato colonna.
Nel secondo esempio osserviamo come e cambiata la sintassi del comando INPUT.
Come potete notare, dopo la dichiarazione di ciascuna variabile ci sono dei numeri. Questi
numeri indicano le colonne del testo su cui si trovano le variabili stesse, infatti il tipo di INPUT
si chiama a colonna o a formato fisso.
Se una variabile occupa un sola colonna (come sesso), si indichera il numero di quella
colonna; se, invece, la variabile occupa piu colonne, bisogna indicarne la prima e l’ultima
collegate tra loro da un trattino (-). Il simbolo per specificare che si tratta di una variabile
di tipo carattere va inserito tra il nome della variabile e il numero della colonna ed e corretto
sia lasciarlo attaccato al nome o al numero o separato da entrambi con uno spazio. Il file
che stiamo per acquisire ha il seguente aspetto:
Finestra dell’editor di testo
Alfredo M 14 8 6
Alice F 13 7 7
Barbara F 13 5 6
Betty F 14 6 5
Paola F 15 6 7
Francesco M 13 6 6
(...)
2. L’Acquisizione dei dati 11
Il programma per acquisirlo e il seguente:
Finestra di Program Editor
LIBNAME lib ’c:\utenti\lab’;
DATA lib.classe;/* input a formato colonne */
INFILE ’i:\labsas\piano2.txt’;
INPUT nome $1-9 sesso $ 11 eta 14-15 teoria 18 piano 21;
RUN;
Il nome indicato dopo DATA e un nome a due livelli, quindi in questo caso il file creato sara
memorizzato nella directory a cui e associato il nome logico lib e sara sostanzialmente e
fisicamente diverso dal file classe creato con il passo di DATA precedente. Per esempio,
avendo specificato tramite il numero di colonne la lunghezza massima, Francesco risultera
completo, al contrario di prima, in cui era troncato perche la lunghezza predefinita del
contenuto di una variabile per SAS e di 8 caratteri.
⋄
Esempio 2.3: Acquisizione di dati in formato misto.
In questo esempio vedremo riassunte le opzioni piu usate nella fase di acquisizione di file
ASCII. Il file che vogliamo acquisire ha una forma particolare: la maggior parte delle infor-
mazioni si trova su colonne contigue e possiamo distinguere i valori gli uni dagli altri ed il
loro significato solo grazie al tracciato record. Nell’ultima parte del record, invece i dati sono
separati da spazi. Qui nella finestra di EDITOR abbiamo aggiunto degli a capo per poter
mostrare due record interi, ma gli a capo effettivi nel file sono evidenziati dal simbolo #.
Finestra dell’editor di testo
Dati di esempio per l’acquisizione con formato misto
001F046224072855302540124231121100272931225101992321
1313321243600143112111122132323332222223111050601033
013333331333333103448350906073 Elisa 10 6 5 8 #
002M051224042411322520223241315230313900335212222233
1412121227300133333119991131222221122229123020305090
011333330333333226746000508096 Marco 10 7 6 7 #
(...)
Supponiamo che a noi interessi acquisire un sottoinsieme delle variabili e precisamente:
- il codice personale (col. 1-3);
- il sesso (col. 4);
- l’anno di nascita (col. 6-7);
- il titolo di studio (col. 25);
- lo stato civile (col. 9);
- il nome (da col. 136);
2. L’Acquisizione dei dati 12
- i voti ottenuti in una certa prova, che sono le ultime quattro colonne del record, ma
su colonne diverse, seppure sempre nello stesso ordine.
Il programma necessario e il seguente.
Finestra di Program Editor
DATA ditutto;
INFILE ’i:\labsas\ditutto.txt’ FIRSTOBS=3;
INPUT codice 1-3 sesso$ 4 annon 6-7 titolo 25 statoc 9
@136 nome$ :10. v1-v4;
LABEL codice=’Codice identificativo’
annon=’Anno di nascita’
titolo=’Titolo di studio’
statoc=’Stato civile’
nome=’Nome dello studente’
v1=’Primo voto’
v2=’secondo voto’
v3=’Terzo voto’
v4=’Quarto voto’;
RUN;
I dati sono preceduti da un titolo e la prima unita statistica si trova sulla terza riga; con l’op-
zione FIRSTOBS=3 abbiamo specificato di saltare le prime due righe e di iniziare l’acquisizione
dalla terza.
Per la prima parte dei dati abbiamo dovuto scegliere l’INPUT a formato colonna, dopo il
nome della variabile abbiamo scritto su quale colonna (o quali colonne) si trova l’informa-
zione; se e un’informazione di tipo alfanumerico va aggiunto il $ tra il nome della variabile
e il numero della colonna.
Come potete notare e stato molto semplice selezionare ed acquisire solo i campi di
interesse e nell’ordine desiderato.
L’ @ e un puntatore di colonna: con tale operatore abbiamo posizionato il puntatore alla
colonna 136 e da questo punto in poi abbiamo utilizzato l’INPUT a formato libero, abbiamo
cioe specificato solo la lista dei nomi delle variabili (vedremo in seguito che il simbolo @ ha
un significato diverso se posto alla fine del comando). Dopo nome trovate :10. che e un
modificatore di formato usato per acquisire variabili i cui valori superano gli 8 caratteri di
default. In questo caso abbiamo “allargato” il campo a 10 caratteri. Inoltre, per le ultime
quattro variabili possiamo utilizzare una scrittura piu compatta per descriverle. Tramite il
carattere “-” indichiamo un range e nel file ditutto troveremo le variabili v1, v2, v3 e v4.
Infine troviamo l’istruzione LABEL. Per comodita, spesso i nomi delle variabili sono (fin
troppo) sintetici; con LABEL possiamo darne una descrizione molto piu dettagliata e com-
prensibile. Associamo a ciascun nome di variabile un’etichetta, questa va compresa tra apici
e non puo superare i 200 caratteri; notate che con un’unica istruzione LABEL si possono creare
piu etichette, separate da spazi, e compare un solo punto e virgola alla fine dell’istruzione.
⋄
Possiamo raggruppare le regole piu importanti in poche proposizioni.
COSE DA RICORDARE QUANDO SI USA
IL FORMATO LIBERO
- Ogni campo del record deve essere specificato in ordine
2. L’Acquisizione dei dati 13
- I campi devono essere separati da almeno uno spazio
- I valori mancanti devono essere rappresentati da un simbolo (in genere il punto .)
- Le variabili alfanumeriche non possono contenere spazi al loro interno
- La lunghezza della variabili alfanumeriche e di 8 caratteri (i caratteri in piu vengono
ignorati a meno che non si usino i modificatori di formato o le istruzioni INFORMAT o
LENGTH)
COSE DA RICORDARE QUANDO SI USA
IL FORMATO COLONNA
- Le variabili alfanumeriche possono contenere spazi
- I campi possono essere letti in qualsivoglia ordine
- Non e necessario usare un simbolo per i dati mancanti
- Si possono leggere sottoinsiemi di variabili (non e necessario leggere tutti i campi
presenti nel record)
- Alcuni campi o parte di essi possono essere riletti
Naturalmente l’argomento e lungi dall’essere esaurito. Per forza di cose (e di spazio) riman-
gono ancora nell’ombra molti aspetti, di alcuni dei quali pero diamo qualche appunto.
• I dati da acquisire possono trovarsi all’interno del passo di DATA stesso ed essere ac-
quisisti tramite l’istruzione CARDS;. Questa deve seguire l’istruzione INPUT in cui si
descrive la struttura dei dati e precedere i dati stessi. Alla fine dei dati veri e propri si
deve porre un altro punto e virgola (;).
• Normalmente, una volta acquisite le informazioni di un’unita, SAS va a cercare quelle
successive sulla riga seguente ma puo capitare che i dati riferiti a diverse unita stati-
stiche si susseguono sulla stessa riga; e possibile dare l’istruzione di “cercare” i dati
sulla stessa riga prima di passare a quella successiva con un @@ nell’istruzione INPUT,
dopo l’elenco delle variabili e prima del punto e virgola.
• In alcuni casi i dati riferiti alla stessa unita sono su righe diverse; esiste un puntatore
di riga, che e #numerodiriga.
• La singola @ posta alla fine del comando di INPUT consente di mantenere in sospeso
nel buffer di input il record in lettura in modo che esso possa essere riletto con un
successivo comando di INPUT.
• Quando il record risulta piu corto di quanto dichiarato, SAS va a cercare i dati mancan-
ti sulla riga successiva; si puo ovviare a questo problema inserendo l’opzione TRUNCOVER
nell’istruzione di INFILE.
• Analogamente, utilizzando l’INPUT a formato libero, puo capitare che ci siano meno
termini di quelli dichiarati; per impedire che SAS li cerchi nella riga successiva ma li
sostituisca con dati mancanti si puo usare l’opzione MISSOVER.
2. L’Acquisizione dei dati 14
• Nei file in formato libero il carattere che delimita i campi puo essere un carattere
diverso dallo spazio; per indicare al SAS quale carattere e il delimitatore dei campi si
usa l’opzione DELIMITER= indicando di seguito il carattere tra apici.
• Il comportamento di default prevede che non sia importante il numero di delimi-
tatori tra un campo e l’altro, ma se due delimitatori consecutivi individuano un
dato mancante e necessario usare l’opzione DSD perche i dati vengano interpretati
correttamente
Se nonostante tutto avete difficolta ad acquisire i vostri dati fate attenzione alla finestra di
LOG, da cui quasi sempre e possibile ricavare le informazioni necessarie per correggere il
vostro programma di acquisizione.
Gli errori piu comuni riguardano:
• la posizione della nostra directory di lavoro e del file da acquisire: se non scriviamo
correttamente i nomi sara come chiedergli di trovare oggetti che non esistono;
• la natura dei dati: se non diamo indicazioni SAS si aspettera variabili numeriche e se
invece trovera caratteri non sapra come comportarsi
• in versioni precedenti per default SAS si aspettava righe di 256 caratteri: se i nostri
dati erano memorizzati in righe piu lunghe era necessario indicarlo con l’opzione dell’i-
struzione INFILE LRECL=numeromassimodicaratteri; questa opzione non sembra piu
necessaria ma la segnaliamo in modo da poter interpretare correttamente esempi in cui
si trova ancora
• a volte sembra che i campi siano delimitati da spazi ma il solito programma (corretto)
non funziona: controllate se anziche spazi i campi non siano delimitati da tabulazioni
(si puo vedere ad esempio con Word e scegliendo di visualizzare i caratteri nascosti);
in tal caso la soluzione consiste o nel sostituire le tabulazioni con spazi o nell’usare
l’opzione DELIMITER=’09’x
• controllate sempre se ci sono tutti i punti e virgola necessari (e nessuno di piu!)
• se usate l’istruzione LABEL controllate gli apici, perche se ve ne dimenticate anche uno
soltanto, SAS non sara piu capace di distinguere fin dove e l’etichetta della variabile
e dove ricominciano i comandi. In questo caso e meglio salvare, chiudere e poi riaprire
e controllare accuratamente il programma prima di lanciarlo nuovamente.
2.3 L’acquisizione automatica dei file
Prima di utilizzare il codice descritto nei paragrafi precedenti puo essere utile fare un tenta-
tivo con alcuni strumenti messi a disposizione da SAS. Se i dati da importare sono origina-
riamente in un formato dati standard che SAS System e in grado di riconoscere (come file
con delimitatori, file Microsoft Excel o file dBASE) allora e possibile procedere con l’acquisi-
zione automatica tramite l’IMPORT WIZARD. Dal menu FILE si seleziona la voce Importa
dati: si avviera una procedura interattiva che attraverso finestre successive chiede all’utente
di inserire le informazioni necessarie, che sono:
• prima finestra
- formato del file da importare
2. L’Acquisizione dei dati 15
• seconda finestra
- localizzazione del file da importare
- eventuali opzioni per l’importazione (ossia la specifica del delmitatore, il numero
della riga in cui si trova la prima osservazione e se i nomi delle variabili vadano
ottenuti dalla prima riga)
• terza finestra
- scelta della directory di destinazione, identificata dal solito nome logico che dovete
aver gia associato
- scelta del nome del file di destinazione
Allo stesso modo possiamo esportare i dati dal formato .sas7bdat in formati diversi (.xls,
.dbf, etc).
Purtroppo la procedura automatica non funziona sempre correttamente quindi riteniamo
utile conoscere alcune alternative. Per quanto riguarda i file di testo, abbiamo descritto i
comandi nei paragrafi precedenti, vediamo invece che cosa fare con file binari.
Un file .xls e sempre trasformabile in .dbf. Da EXCEL salviamo in dati in formato .dbf
scegliendo dal menu FILE, Salva con nome... e scegliendo il Tipo formato DB3 oppure
DB4.
Salvato e chiuso il file ritorniamo all’EDITOR di SAS.
Il programma e semplicissimo.
Finestra di Program Editor
LIBNAME lib ‘x:\nomedirectory’;
FILENAME prova ‘y:\nomedirectory\nomefile.dbf’;
PROC DBF DB3=prova OUT=lib.nomefile;
RUN;
FILENAME e l’analogo di LIBNAME, ma per i file. Abbiamo quindi associato al file fisico
esterno un nome logico (prova). Nella procedura DBF basta dare due opzioni: con DB3=
indichiamo qual e il file in formato .dbf (a cui abbiamo associato il nome logico prova);
con OUT= indichiamo dove e con quale nome vogliamo creare il file .sas7bdat risultato
dell’acquisizione.
La procedura vale sia con DB3 che con DB4. Basta ricordarsi di usare l’opzione giusta nel
programma SAS (rispettivamente DB3= e DB4=).
Le condizioni perche la procedura abbia successo sono:
• i dati devono essere in forma di matrice con unita sulle righe e variabili sulle colonne.
• sulla prima riga devono esserci i nomi della variabili secondo le regole di sintassi dei
nomi di SAS
• e bene che non ci siano dati mancanti nella prima riga di dati; se ci fossero, sostituiteli
con un valore del formato di quella variabile (a cui naturalmente darete significato di
dato mancante).
Se nonostante tutto questo la procedura continuasse a non funzionare controllate che il
file.dbf di partenza sia chiuso e che i formati delle variabili in EXCEL siano conformi al loro
contenuto.
3. PROCEDURE UTILI
In questo capitolo esamineremo alcune procedure che, pur non compiendo elaborazioni sta-
tistiche, risultano molto utili per visualizzare il contenuto dei nostri dataset e verificare
velocemente il risultato delle operazioni che stiamo compiendo.
3.1 Alcuni concetti generali
Il SAS ha al proprio interno una libreria di procedure preprogrammate. Le procedure
SAS utilizzano i valori di dataset in formato .sas7bdat per produrre i risultati richiesti.
Ciascuna ha la propria struttura predefinita e sebbene possiamo personalizzare il risulta-
to sfruttando le (talvolta) numerose opzioni previste, non possiamo pero discostarcene e
introdurre varianti personali.
Le procedure sono state scritte e sviluppate in tempi diversi da autori diversi. Hanno
tutte una struttura simile ma ciascuna riflette in parte piu o meno evidente le caratteristiche
del proprio programmatore. Una volta individuata la procedura che fa al caso nostro non
possiamo esimerci dal controllarne la sintassi sul help in linea o nel manuale per essere sicuri
di compiere operazioni lecite e valide nel modo previsto e comprensibile per SAS.
In ogni caso tutte le procedure:
- cominciano con la parola PROC
- hanno un proprio nome riservato
- sono composte da una parte essenziale, senza la quale non agiscono, e una parte
opzionale per richiedere specifici risultati
- agiscono sul dataset indicato dopo il nome della procedura nell’opzione DATA= e se
questa viene omessa viene considerato l’ultimo dataset creato, che viene detto il dataset
“attivo”; ci si puo riferire al file sia tramite il suo nome a due livelli che attraverso il
suo nome completo (dalla radice in poi) inserendolo tra apici
- terminano con l’istruzione RUN; oppure quando incontrano l’inizio di un altro PROC
STEP o di un DATA STEP (Alcune procedure sono di tipo iterativo e quindi concludono
la loro esecuzione con RUN; ma rimangono in attesa di nuovo codice, la fine di queste
procedure viene data dal comando QUIT;, esempi di queste procedure sono la PROC
REG e la PROC GPLOT)
3.2 PROC SORT
La procedura SORT ordina le osservazioni di un dataset secondo una o piu variabili, me-
morizzando il risultato dell’ordinamento in un nuovo dataset o rimpiazzando il dataset
originale.
3. Procedure utili 17
Finestra di Program Editor
PROC SORT DATA=ditutto OUT=ordinato;
BY sesso; RUN;
Con questo breve programma ordiniamo le osservazioni del dataset ditutto secondo la
variabile sesso e memorizziamo il risultato dell’ordinamento in un file di nome ordinato;
se avessimo scritto lo stesso nome di dataset sia dopo DATA= che dopo OUT= il file ordinato
avrebbe rimpiazzato il file originario.
Se la variabile secondo la quale si ordina e di tipo numerico, l’ordinamento sara crescente,
se la variabile e di tipo carattere, l’ordine sara quello alfabetico. E possibile scegliere l’ordine
inverso tramite l’opzione DESCENDING da inserire tra BY e il nomedellavariabile. E possibile
ordinare le osservazioni secondo piu variabili nidificate elencandole una di seguito all’altra
dopo l’istruzione BY; se si desidera l’ordinamento inverso rispetto a quello di default va
ricordata l’opzione DESCENDING prima della variabile corrispondente.
3.3 PROC PRINT
La procedura PRINT stampa le osservazioni di tutte le variabili di un dataset o di un loro
sottoinsieme nella finestra di OUTPUT. Puo anche calcolare e stampare totali e subtotali
delle varibili numeriche.
Vediamone un esempio. Immaginiamo di voler stampare una parte del dataset acquisito
nel capitolo precedente.
Finestra di Program Editor
PROC PRINT DATA=ditutto NOOBS;
VAR codice nome v1-v4;
SUM v1-v4;
BY sesso;
RUN;
La parte essenziale della procedura consiste nei soli PROC PRINT e RUN: se avessimo dato solo
queste istruzioni avremmo ottenuto la stampa di tutto il contenuto del dataset.
Vediamo, invece, qualche istruzione opzionale.
- DATA= indica di quale dataset vogliamo la stampa
- NOOBS e un’opzione che omette la stampa del numero dell’osservazione
- VAR e l’istruzione tramite la quale selezioniamo il sottoinsieme delle variabili che vo-
gliamo stampare (in questo caso solo codice, nome e le variabili da v1 a v4)
- SUM calcola i totali ed i subtotali delle variabili numeriche
- BY stampa le osservazioni separate per ciascun livello della variabile indicata dopo
questa istruzione. Perche questa istruzione venga eseguita correttamente occorre che
le osservazioni siano ordinate secondo tale variabile tramite la procedura PROC SORT,
che abbiamo presentato nel paragrafo precedente
Il risultato della procedura e il seguente:
3. Procedure utili 18
Finestra di Output
---------------------------- SESSO=F ----------------------------------
CODICE NOME V1 V2 V3 V4
1 Elisa 10 6 5 8
5 Marcella 10 7 7 9
7 Maria 9 6 8 7
10 Alice 10 6 7 7
-- -- -- --
SESSO 39 25 27 31
---------------------------- SESSO=M ----------------------------------
CODICE NOME V1 V2 V3 V4
2 Marco 10 7 6 7
3 Matteo 10 6 6 8
4 Luca 9 5 7 6
6 Roberto 10 7 6 6
8 Alfredo 10 8 6 8
9 Giovanni 10 7 8 8
-- -- -- --
SESSO 59 40 39 43
== == == ==
98 65 66 74
3.4 PROC FSVIEW
La procedura FSVIEW apre una nuova finestra all’interno della quale viene visualizzato il
contenuto del dataset indicato.
Al contrario della PROC PRINT, che stampa nella finestra di OUTPUT ed e quindi con-
dizionata dalle dimensioni di quest’ultima, la PROC FSVIEW visualizza il dataset in forma di
matrice con le unita statistiche sulle righe e le varibili sulle colonne indipendentemente dalle
dimensioni del dataset stesso; ci si puo spostare su qualsiasi punto della matrice con le barre
di scorrimento.
Bisogna poi chiudere la nuova finestra, che altrimenti rimane attiva, se vogliamo procedere
con le elaborazioni.
Per default la PROC FSVIEW visualizza tutto il dataset ma possiamo utilizzare delle istru-
zioni opzionali, le piu importanti delle quali sono:
- VAR lista di variabili: con cui possiamo scegliere un sottoinsieme di variabili
- WHERE condizione: con cui possiamo richiedere la visualizzazione del sottoinsieme di
unita per cui si verifica la condizione specificata
Segue un esempio per visualizzare i valori delle variabili codice, nome, v1, v2, v3 e v4 per
le sole osservazioni donne; la matrice risultante in questo caso sara una 4*6.
Finestra di Program Editor
PROC FSVIEW DATA=ditutto;
VAR codice nome v1-v4;
WHERE sesso=’F’;
RUN;
3. Procedure utili 19
3.5 PROC CONTENTS
La procedura CONTENTS stampa la descrizione del contenuto di uno o piu file SAS.
Finestra di Program Editor
PROC CONTENTS DATA=ditutto;
RUN;
In particolare, tramite le informazioni su:
- numero di osservazioni
- numero delle variabili
- nome, tipo, lunghezza ed eventuale etichetta delle variabili
possiamo controllare l’esattezza dell’acquisizione dei dati e l’ammissibilita delle operazioni
che intendiamo compiere, che dipendono dalla natura delle variabili.
Finestra di Output
La procedura CONTENTS
Nome data set WORK.DITUTTO Osservazioni 10
Tipo elemento DATA Variabili 10
Engine V9 Indici 0
Data creazione lunedı 21 luglio 2008 13:09:18 Lunghezza osservazione 88
Data ultima modifica lunedı 21 luglio 2008 13:09:18 Osservazioni eliminate 0
Protezione Compresso NO
Tipo data set Ordinato NO
Etichetta
Rappresentazione dei dati WINDOWS_32
Codifica wlatin1 Western (Windows)
Informazioni relative a engine/host
Dimensione pagina del data set 8192
Numero di pagine del data set 1
Prima pagina di dati 1
Max oss per pagina 92
Oss nella prima pagina di dati 10
Numero di riparazioni del data set 0
Nome file C:\Temp\_TD3640\ditutto.sas7bdat
Release di creazione 9.0101M3
Host di creazione XP_PRO
Elenco alfabetico di variabili e attributi
n. Variabile Tipo Lung Etichetta
3 annon Num 8 Anno di nascita
1 codice Num 8 Codice identificativo
6 nome Car 20 Nome dello studente
2 sesso Car 1
5 statoc Num 8 Stato civile
4 titolo Num 8 Titolo di studio
7 v1 Num 8 Primo voto
8 v2 Num 8 Secondo voto
9 v3 Num 8 Terzo voto
10 v4 Num 8 Quarto voto
3. Procedure utili 20
3.6 PROC FORMAT
La PROC FORMAT offre un semplice metodo per creare propri formati di visualizzazione di
output e di input. Capita spesso che le variabili siano codificate con numeri anche se sono di
natura qualitativa; e utile per la lettura di qualsiasi risultato che questi vengano presentati
riportando, non tanto i valori della codifica, quanto il significato proprio della modalita. Con
la PROC FORMAT non interveniamo sui valori memorizzati (ad esempio i sessi codificati con i
valori 1 e 2) ma facciamo in modo che al momento della presentazione dei risultati i valori
vengano sostituiti con i relativi formati (che sono sostanzialmente etichette per le singole
modalita).
Prima si creano i vari formati poi si associano alle rispettive variabili. Nell’esempio
seguente ne vengono creati 3:
Finestra di Program Editor
LIBNAME nomelogico ’x:\nomedirectory’;
LIBNAME library ’x:\nomedirectory’;
PROC FORMAT LIBRARY=library;
VALUE a 1="etichetta11"
2="etichetta12"
3="etichetta13"
4="etichetta14";
VALUE b 1="etichetta21"
2="etichetta22"
3="etichetta23";
VALUE c 1="maschio"
2="femmina";
RUN;
Si noti che ci sono due istruzioni LIBNAME: la prima riguarda la solita associazione con
la directory dove memorizziamo permanentemente i dataset; la seconda e per memorizzare
permanentemente anche i formati che stiamo per dichiarare. La directory dei formati puo
essere la stessa dei dati o puo essere diversa. Si noti che per i formati e necessario usare il no-
me logico library; se si desidera usarne uno diverso allora bisognera aggiungere un’opzione
prima del codice in cui verra utilizzato: OPTIONS FMTSEARCH=(libref); dove con libref
si intende il nome scelto da noi.
Ogni istruzione VALUE permette di dichiarare un particolare formato che viene identifi-
cato dal nome che segue (in questo esempio: a, b e c) e al quale corrisponde l’insieme di
associazioni riportate prima del relativo punto e virgola.
In un successivo DATA STEP si potra associare alle variabili i rispettivi formati tramite
l’istruzione FORMAT (si noti il puntino dopo il nome del formato).
Finestra di Program Editor
DATA nomelogico.nomefile;
SET nomelogico.nomefile;
FORMAT v1 a. ;
FORMAT v2 b. ;
FORMAT v3 c. ;
RUN;
3. Procedure utili 21
Se i formati sono stati memorizzati in un file permanente -formats.sas7cat- e se ne crea
l’associazione con le variabili come nell’esempio, allora non occorre dichiararli di nuovo in
sessioni di lavoro successive, ma basta che le varie procedure di analisi siano precedute dalla
doppia LIBNAME.
Se per qualche ragione, invece, non si vogliono memorizzare permanentemente i formati,
occorre eseguire la PROC FORMAT all’inizio della sessione di lavoro e solo da quel momento e
possibile utilizzare i vari formati, anche direttamente all’interno dei PROC STEP.
Finestra di Program Editor
PROC NOMEPROCEDURA DATA=nomelogico.nomefile;
FORMAT v1 a. ;
FORMAT v2 b. ;
ISTRUZIONE v1 v2;
RUN;
Si noti che se tante variabili hanno la stessa struttura, basta dichiararne il formato solo
una volta e poi associarlo a ciascuna variabile con istruzioni FORMAT distinte.
4. MANIPOLAZIONE DI DATASET IN FORMATO .SAS7BDAT
Molto spesso le informazioni risultanti da una indagine non sono memorizzate in una forma
direttamente utilizzabile per svolgere le elaborazioni statistiche che abbiamo programmato.
Diviene necessario, ad esempio, predisporre dataset distinti (creazione di sottoinsiemi),
creare nuove variabili (trasformazioni, assegnazioni, riclassificazioni) sulla base di quelle ac-
quisite o riunire nello stesso dataset variabili che si riferiscono allo stesso fenomeno oggetto
di studio perche si rilevano nuove unita statistiche oppure si rilevano nuove variabili (unione
di dataset).
Puo inoltre essere necessario selezionare le unita statistiche sulla base del valore assunto
da alcune variabili (selezioni, condizioni).
Queste operazioni sono svolte all’interno di uno o piu passi di DATA.
4.1 Creazione di sottoinsiemi
Cominciamo introducendo i comandi che consentono di selezionare le variabili; supponiamo
di dover creare un dataset che contenga solo le variabili scelte da noi, oppure di voler “buttare
via” quelle che non ci servono. I comandi sono KEEP e DROP e possono essere usati sia come
comandi, in istruzioni vere e proprie, oppure come opzioni dell’istruzione DATA.
DATA sottoinsieme;
SET datsetcompleto;
KEEP listadivariabilidatenere;
/* oppure DROP listadivariabilidacancellare; */
RUN;
SET e il comando tramite il quale indichiamo quale dataset (gia in formato .sas7bdat!)
carichiamo e sul quale lavoreremo; con KEEP elenchiamo esplicitmente, separandole con spazi,
quali variabili devono essere riportate nel dataset finale mentre se usiamo DROP indicheremo
quelle che devono essere cancellate. Possiamo usare scritture compatte per definire alcuni
tipi di elenchi: il trattino singolo (-) individua range di variabili che condividono lo stesso
prefisso e hanno come suffisso un numero progressivo1, il doppio trattino (--) invece individua
variabili contigue come si presentano guardando la tabella completa oppure ricavabile dalla
struttura del dataset tramite la PROC CONTENTS2. Anche se dalla versione 8.2 di SAS KEEP
e DROP possono comparire entrambi nello stesso passo di DATA senza che venga segnalato
nessun errore, e buona norma utilizzarli in maniera alternativa, come e anche raccomandato
nell’help in linea. Nel prossimo esempio vedremo come questi due comandi possono essere
usati come opzioni del comando DATA.
Esempio 4.1: Uso di KEEP e DROP
Riprendiamo l’esempio 2.3 e supponiamo di voler creare due dataset, il primo contenente il
1v1-v4 significa v1 v2 v3 v4
2 nel nostro esempio potremmo sintetizzare codice--nome per indicare codice sesso annon titolo
statoc nome
4. Manipolazione di dataset in formato .sas7bdat 23
codice personale, il nome, il sesso, il titolo di studio e lo stato civile, mentre nel secondo
abbiamo bisogno del codice personale e dei voti ottenuti nelle quattro prove. A questo scopo
con lo stesso passo di DATA costruiamo due insiemi di dati che abbiamo chiamato dati1
e dati2, attraverso le opzioni KEEP indichiamo quali variabili andranno a formare i due
dataset.
Finestra di Program Editor
DATA dati1(KEEP=codice sesso annon titolo statoc nome)
dati2(KEEP=codice v1-v4);
INFILE ’i:\labsas\ditutto.txt’;
INPUT codice 1-3 sesso$ 4 annon 6-7 titolo 24 statoc 9
@136 nome$ :10. v1-v4;
RUN;
Lo stesso risultato si puo ottenere con la versione comando (ma in due distinti passi di
DATA. Avendo gia creato il dataset ditutto (come nell’esempio 2.3) tramite il comando SET
indichiamo a SAS di renderlo disponibile per elaborazioni che verranno memorizzate in
nuovi dataset di nome dati1 e dati2 e con il comando DROP togliamo le variabili che non
desideriamo riportare.
Finestra di Program Editor
DATA dati1;
SET ditutto;
DROP v1-v4;
RUN;
DATA dati2;
SET ditutto;
DROP nome sesso titolo statoc annon;
RUN;
⋄
Molto spesso e importante creare dei dataset piu piccoli in cui le unita statistiche siano
omogenee rispetto al valore di una o piu variabili. Per individuare e salvare (oppure can-
cellare) solo le unita statsitiche desiderate dobbiamo introdurre i costrutti di selezione ed i
comandi OUTPUT e DELETE.
DATA sottoinsiemeunita;
IF confrontologico THEN OUTPUT; /* osservazioni da tenere */
IF confrontologico THEN DELETE; /* osservazioni da cancellare */
RUN;
Quando il confrontologico e soddisfatto allora il buffer di input viene riportato nel
dataset finale, altrimenti il buffer viene scartato. In generale l’uso del comando OUTPUT in un
qualsiasi punto di un passo di DATA forza la scrittura del buffer mentre con la specificazione di
DELETE il buffer non viene riportato. Il comando IF confrontologico THEN OUTPUT; puo
essere sintetizzato dalla forma abbreviata IF confrontologico;. Esiste anche il comando
WHERE tramite il quale vengono selezionate solo le unita statistiche le cui variabili assumono
il valore specificato. Per svolgere selezioni piu complicate ricorreremo all’utilizzo di IF.
L’istruzione WHERE puo essere utilizzata anche nei PROC STEP perche la procedura richiesta
venga applicata solo alle osservazioni che presentano il valore specificato.
4. Manipolazione di dataset in formato .sas7bdat 24
DATA sottoinsiemeunita;
WHERE nomedivariabile=valore;
RUN;
4.2 Assegnazione e riclassificazione
Vediamo ora alcuni modi per definire, trasformare o riclassificare le variabili. La definizione
di una variabile puo avvenire per assegnazione diretta, ad esempio:
nomevariabile=valorenumerico;
nomevariabile=’stringa’;
nomevariabile=formulamatematica;
nomevariabile=altravariabileesistente;
Si noti che il tipo di variabile e definito direttamente dall’assegnazione, inoltre una variabi-
le puo essere definita come funzione di una o piu variabili. Useremo il termine assegnazione
per indicare una qualsiasi di queste forme.
Per riclassificare una variabile utilizzerermo uno dei due costrutti di selezione previsti da
SAS, i comandi IF-THEN-ELSE, la cui sintassi e la seguente (che puo limitarsi anche alla sola
prima parte).
IF confrontologico THEN assegnazione; ELSE assegnazione;
Gli operatori logici, gli operatori di confronto e le operazioni aritmetiche sono:
Operatori di confronto
maggiore >
maggiore o uguale >=
minore <
minore o uguale <=
uguale =
diverso ^=
Operatori logici
AND &
OR |NOT ^
Operazioni
somma +
sottrazione -
moltiplicazione *
divisione /
elevamento **
Sono infine disponibili molte funzioni matematiche come ad esempio le funzioni trigono-
metriche ed e da segnalare anche l’istruzione IN(valore1, valore2,...) quando vogliamo
controllare che il valore della nostra variabile sia compreso in un insieme (finito) di valori
predefiniti, racchiusi tra le parentesi.
Vediamo nel seguente esempio l’utilizzo dei comandi introdotti.
Esempio 4.2: Creazione e riclassificazione di variabili.
Supponiamo di avere a disposizione in un dataset in formato .sas7bdat di nome vecchio la
variabile eta che contiene le eta (in anni) e la variabile peso (in chilogrammi) che contiene
il peso delle unita statistiche. Si desidera:
1. costruire una nuova variabile che identifichi univocamente le unita statistiche
2. riclassificare la variabile eta in tre classi: da 0 a 18, da 19 a 60 e oltre 61 (sovrascrivendo
i valori originali)
3. riclassificare la variabile peso in due classi: da 0 a 70 e oltre 71 in un nuova variabile
chiamata pesod
4. ed infine calcolare il peso espresso in libbre nella variabile pesol
4. Manipolazione di dataset in formato .sas7bdat 25
e salvare il risultato in un dataset chiamato nuovo
Finestra di Program Editor
DATA nuovo;
SET vecchio;
/* costruzione della variabile codice */
RETAIN codice 0;
codice=codice+1;
/* riclassificazione dell’eta nella stessa varaibile */
IF eta < 19 & eta^=. THEN eta=1;
IF eta >=19 & eta < 61 THEN eta=2;
IF eta >= 61 THEN eta=3;
/* riclassificazione del peso in una nuova varaibile */
pesod=2;
IF peso=. THEN pesod=.;
IF peso <= 70 & peso^=. THEN pesod=1;
/* trasformazione del peso per averlo in libbre */
pesol=peso/2.2046;
RUN;
Dopo aver reso disponibile il dataset con il comando SET vecchio abbiamo creato una varia-
bile da usare come codice. Introduciamo il comando RETAIN che e forse uno dei comandi piu
difficili da capire. Vediamo come agisce. Abbiamo visto che nella fase di compilazione (vedi
il diagramma di flusso a pagina 7) SAS dopo aver controllato la sintassi dei comandi crea
un buffer di input. In questo spazio della memoria vi e un posto per ogni variabile che verra
creata nel passo di DATA. In fase di esecuzione viene letto il primo record dal file, i valori
delle variabili lette vengono temporaneamente scritti nel buffer di input. Alla fine del passo
di DATA il contenuto del buffer di input viene scritto definitivamente all’interno del dataset in
formato .sas7bdat e tutti i valori del buffer di input vengono reinizializzati a dato mancan-
te. In questo modo non e possibile mantenere il valore di una variabile tra la lettura di un
record ed il successivo. Con il comando RETAIN preveniamo la cancellazione del contenuto
del buffer di input per le variabili specificate in modo che il valore venga conservato e possa
essere usato all’interno di tutto il DATA STEP.
Nel nostro esempio con il comando RETAIN preveniamo la cancellazione della posizione nel
buffer di input della variabile codice che inizialmente assume il valore zero. Con il coman-
do di assegnazione codice=codice+1 otteniamo l’incremento del valore della variabile che
rimane, grazie all’uso di RETAIN, disponibile nella lettura del record successivo. Utilizziamo
il comando IF per riclassificare la variabile eta, si noti nel primo IF la scrittura esplicita di
non assimilare i valori mancanti ai valori piccoli della variabile eta. Questa cosa deve essere
sempre ricordata perche il valore mancante (.) nel confronto logico viene considerato come
il piu piccolo tra tutti i valori.
⋄
Un’altra struttura generale per operare selezioni e SELECT-WHEN-OTHERWISE-END:
SELECT;
WHEN (confrontologico_1) istruzioni_1;
WHEN (confrontologico_2) istruzioni_2;
OTHERWISE istruzione_3;
END;
4. Manipolazione di dataset in formato .sas7bdat 26
Ogni operazione di selezione e attuabile sia con il costrutto IF che con SELECT anche se
ci sono situazioni in cui uno dei due risulta essere piu “comodo”. Nella scelta vanno tenute
presenti le loro caratteristiche:
• ogni istruzione IF e un’istruzione a se
• in particolare, ciascuna ELSE si riferisce alla relativa IF
• le istruzioni vengono svolte nell’ordine in cui si presentano
• con l’istruzione SELECT si possono specificare quante condizioni si desidera, tramite
le relative istruzioni WHEN che vengono considerate nel loro complesso e devono essere
mutuamente esclusive
• l’OTHERWISE si riferisce all’insieme delle WHEN
• e occorre ricordarsi di concludere con END
Con entrambi i costrutti:
• si possono specificare condizioni articolate utilizzando le parentesi e gli operatori logici
• si possono scrivere delle condizioni nidificate
• se le istruzioni da svolgere sono piu d’una, vanno inserite tra le istruzioni DO; e END;
Esempio 4.3: Uso di RETAIN
Ritorniamo ora al comando RETAIN che adesso utilizzeremo in un contesto diverso. Suppo-
niamo di dover acquisire un insieme di dati che e composto di due tipi di record della forma
e di voler ricostruire le informazioni in modo da ottenere una matrice in cui le righe hanno
la stessa struttura e contengono variabili provenienti da entrambi i tipo di record:
Primo tipo:
tipo: col. 1, tipo di record
codice: col. 3-6, codice identificativo dell’unita statistica
nome: col. 8-18, nome dell’individuo
cognome: col. 20-30, cognome dell’individuo
eta: col. 32-33, eta
sesso: col. 35, sesso
Secondo tipo:
tipo: col. 1, tipo di record
codice: col. 3-6, codice identificativo dell’unita statistica
tempo: col. 8-10, durata della degenza (in giorni)
reparto: col. 12-21, reparto di ricovero
medico: col. 23-33, medico che ha seguito il paziente
Il file contenente i dati e nella forma:
4. Manipolazione di dataset in formato .sas7bdat 27
Finestra dell’editor di testo
1 0011 Antonio Zurlo 54 M
2 0011 12 chirurgia Roberti
2 0011 30 medicina Brotto
1 2045 Carla Fabi 27 F
2 2045 5 ortopedia Lucchi
1 0892 Paolo Giusti 5 M
2 0892 7 pediatria Semola
2 0892 10 chirurgia Roberti
2 0892 4 oculistica Pretto
Il dataset da costruire dovra contenere un record per ogni ricovero e riportare le seguenti
informazioni: codice, nome, cognome, eta, sesso, tempo, reparto, medico.
Per ottenere questo risultato dobbiamo lasciare in sospeso i valori delle variabili nel
buffer e dare due diversi comandi di input, condizionati al tipo di record; questa operazione
e possibile grazie alla singola chiocciola (@). Il record rimane nel buffer di input e puo essere
riletto con un altro comando di INPUT all’interno dello stesso passo di DATA. Quando siamo
in presenza di un record del primo tipo (tipo=1) acquisiamo il valore delle variabili: nome,
cognome, eta, sesso nel buffer di input e non riportiamo il record nel dataset. Grazie al
comando RETAIN i valori di queste variabili rimangono nel buffer di input e possono cosı essere
collegate alle informazioni della riga successiva. Il buffer viene scaricato solo al termine della
lettura di righe del secondo tipo. Vediamo per esteso il codice necessario:
Finestra di Program Editor
DATA ospedale;
INFILE ’i:\labsas\ospedale.txt’ TRUNCOVER;
INPUT tipo @;
SELECT;
WHEN (tipo=1)
DO;
INPUT codice 3-6 nome$ 8-18 cognome$ 20-30 eta 32-33 sesso$ 35;
RETAIN codice nome cognome eta sesso;
DELETE;
END;
WHEN (tipo=2)
DO;
INPUT tempo 8-10 reparto$ 12-21 medico$ 23-30;
DROP tipo;
OUTPUT;
END;
END;
RUN;
Si noti che quando ci sono piu istruzioni da eseguire esse devono essere raggruppate tra il
comando DO; ed il comando END;.
⋄
4.3 Unione di dataset
Puo succedere che le informazioni necessarie alle nostre analisi risiedano in file diversi che
vanno collegati correttamente. I comandi che servono per unire piu dataset sono:
4. Manipolazione di dataset in formato .sas7bdat 28
SET listadeidataset;
MERGE listadeidataset;
Il comando SET ci permette di unire piu dataset aggiungendo al primo le osservazioni del
secondo e cosı via. E chiaro che perche l’unione avvenga correttamente e necessario che i
nomi delle variabili che contengono la stessa informazione siano uguali nei due dataset. Le
variabili che compaiono in un solo dataset saranno riportate per le unita statistiche degli
altri dataset come valori mancanti. Il comando MERGE consente invece di unire piu dataset
aggiungendo al primo dataset le variabili contenute negli altri, associando le unita statistiche
secondo una chiave (una variabile o piu).
Esempio 4.4: Uso di MERGE
Nel primo dataset dati1 abbiamo le seguenti variabili: impianto (nome dell’impianto),
inizio (data di entrata in funzione dell’impianto), respo (nome del responsabile), mentre
nel secondo di nome dati2 abbiamo: impianto (nome dell’impianto), anno (anno di produ-
zione), produzione (quantita prodotta), tempo (periodo di blocco della produzione nell’arco
dell’anno espresso in giorni). Mentre nel primo insieme di dati ad ogni impianto corrisponde
un impianto, nel secondo vi sono per ogni impianto un numero di record pari al numero di
anni in cui l’impianto e stato in funzione. Utilizziamo, quindi, la variabile impianto come
chiave per costruire un unico dataset nel seguente modo:
Finestra di Program Editor
PROC SORT DATA=dati1;
BY impianto; RUN;
PROC SORT DATA=dati2;
BY impianto; RUN;
DATA nuovo;
MERGE dati1 dati2;
BY impianto;
RUN;
Si noti che prima di utilizzare il comando MERGE e necessario ordinare i dataset secondo la
chiave che si vuole utilizzare.
⋄
5. ESEMPI DI PROCEDURE STATISTICHE
In questo capitolo vedremo alcuni esempi di procedure statistiche; non discuteremo la parte
teorica, per la quale rimandiamo ai testi, ne pretendiamo di dare una spiegazione esaustiva
di tutte le potenzialita delle procedure, per le quali ci sono i manuali. L’intento di questo
quaderno e quello di indicare agli utenti una possibile strada operativa per le loro esercitazioni
e tesi una volta che hanno appreso la teoria, avviarli e metterli nelle condizioni di approfondire
i concetti sulla base delle specifiche esigenze.
PROC FREQ PROC ANOVA
PROC UNIVARIATE PROC CLUSTER
PROC CORR PROC FACTOR
PROC GPLOT PROC LOGISTIC
PROC REG PROC CORRESP
PROC TABULATE
5.1 PROC FREQ
La PROC FREQ ci consente di ottenere tabelle di frequenze (assolute, relative, cumulate, . . .)
a una o a piu entrate ed il calcolo di indici per valutare la presenza di forme di dipendenza.
La sintassi minima e:
PROC FREQ;
RUN;
Non specificando ulteriori comandi la procedura costruisce la tabella di frequenze semplici
per ciascuna variabile presente nel dataset attivo, indipendentemente dalla loro natura.
Esempio 5.1: Pane con fibre
A 48 pazienti sofferenti di problemi gastro-intestinali e stato fornito per i loro pasti un tipo
diverso di pane tra il pane comune, quello arricchito con crusca, quello arricchito con mais e
quello arricchito con entrambi. Dopo un mese di utilizzo ogni paziente ha dato un giudizio
complessivo sui problemi di digeribilita che ha riscontrato, classificandoli in: nessuno, pochi,
medi, molti.
Acquisiamo i dati in un file temporaneo di nome pane e indichiamo le variabili di interesse
con codtipo e prob; possiamo costruire le tabelle di frequenze semplici e una tabella a doppia
entrata nel seguente modo:
Finestra di Program Editor
PROC FREQ DATA=pane;
TABLES codtipo prob codtipo*prob / CHISQ;
RUN;
5. Esempi di procedure statistiche 30
- TABLES e il comando fondamentale della procedura FREQ. Nel nostro caso abbiamo
richiesto la creazione delle tabelle di frequenza semplici sia per la variabile codtipo
che per prob e di una tabella a doppia entrata.
E possibile specificare alla fine del comando alcune opzioni che riguardano il calcolo di indici
di dipendenza o la soppressione del calcolo di distribuzioni di frequenze.
- CHISQ e l’opzione per il calcolo di misure di associazione basate sul χ2
Tra le altre opzioni utilizzabili ricordiamo:
- AGREE per il calcolo di test e misure di concordanza
- MISSING include i valori mancanti, che altrimenti verrebbero eliminati, nel calcolo delle
percentuali e altre statistiche
- MEASURES per il calcolo di svariati test di associazione
- CL calcola gli intervalli di confidenza per i test calcolati da MEASURES
Il risultato del nostro programma e:
Finestra di Output
La procedura FREQ
Tipo di pane
Frequenza Percentuale
codtipo Frequenza Percentuale cumulata cumulata
--------------------------------------------------------------------------------
pane con crusca 12 25.00 12 25.00
pane con mais 12 25.00 24 50.00
pane con mais e crusca 12 25.00 36 75.00
pane comune 12 25.00 48 100.00
Test del chi quadrato
per proporzioni uguali
------------------------
Chi quadrato 0.0000
DF 3
Pr > ChiQuadr 1.0000
Problemi di digeribilita
Frequenza Percentuale
prob Frequenza Percentuale cumulata cumulata
-----------------------------------------------------------------
nessuno 17 35.42 17 35.42
pochi 15 31.25 32 66.67
medi 9 18.75 41 85.42
molti 7 14.58 48 100.00
Test del chi quadrato
per proporzioni uguali
------------------------
Chi quadrato 5.6667
DF 3
Pr > ChiQuadr 0.1290
5. Esempi di procedure statistiche 31
Tabella di codtipo per prob
codtipo(Tipo di pane) prob(Problemi di digeribilita)
Frequenza |
Percentuale |
Pct riga |
Pct col |nessuno |pochi |medi |molti | Totale
-----------------+--------+--------+--------+--------+
pane con crusca | 7 | 4 | 1 | 0 | 12
| 14.58 | 8.33 | 2.08 | 0.00 | 25.00
| 58.33 | 33.33 | 8.33 | 0.00 |
| 41.18 | 26.67 | 11.11 | 0.00 |
-----------------+--------+--------+--------+--------+
pane con mais | 2 | 2 | 3 | 5 | 12
| 4.17 | 4.17 | 6.25 | 10.42 | 25.00
| 16.67 | 16.67 | 25.00 | 41.67 |
| 11.76 | 13.33 | 33.33 | 71.43 |
-----------------+--------+--------+--------+--------+
pane con mais e | 2 | 5 | 3 | 2 | 12
crusca | 4.17 | 10.42 | 6.25 | 4.17 | 25.00
| 16.67 | 41.67 | 25.00 | 16.67 |
| 11.76 | 33.33 | 33.33 | 28.57 |
-----------------+--------+--------+--------+--------+
pane comune | 6 | 4 | 2 | 0 | 12
| 12.50 | 8.33 | 4.17 | 0.00 | 25.00
| 50.00 | 33.33 | 16.67 | 0.00 |
| 35.29 | 26.67 | 22.22 | 0.00 |
-----------------+--------+--------+--------+--------+
Totale 17 15 9 7 48
35.42 31.25 18.75 14.58 100.00
Statistiche per la tabella di codtipo per prob
Statistica DF Valore Prob
-------------------------------------------------------
Chi quadrato 9 16.9427 0.0496
Chi quadrato rapp verosim 9 18.8803 0.0262
Chi quadrato MH 1 0.0000 1.0000
Coefficiente Phi 0.5941
Coefficiente di contingenza 0.5108
V di Cramer 0.3430
ATTENZIONE: il 100% delle celle ha conteggi attesi minori
di 5. Il chi quadrato puo non essere un test valido.
Perogni cella della tabella a doppia entrata sono riportati nell’ordine: la frequenza asso-
luta, la frequenza relativa, la frequenza precentuale di riga (cioe la distribuzione condizionata
della variabile prob dato codtipo) e infine la frequenza percentuale di colonna (distribuzione
condizionata della variabile codtipo dato prob).
Considerando una significativita del 5% il valore del χ2 risulta significativo e quindi
sembra ci sia una certa dipendenza tra le due variabili ma SAS ci segnala che i valori
all’interno delle celle sono piuttosto esigui e quindi che la distribuzione del test potrebbe non
essere ben approssimata dalla distribuzione asintotica.
⋄
5.2 PROC UNIVARIATE
Lo scopo principale della PROC UNIVARIATE e quello di calcolare indici di sintesi di una
variabile statistica quantitativa. I risultati si presentano suddivisi in sei sezioni: gli indici
di sintesi basati sui momenti, misure e test di locazione, quantili, i valori estremi della
distribuzione e le osservazioni mancanti. Si noti che non sempre tutti gli indici e i test
5. Esempi di procedure statistiche 32
applicati sono interessanti per la nostra analisi o sono applicabili alla nostra variabile. E
compito nostro distinguere e ricavarne le informazioni di interesse. La sintassi minima e:
PROC UNIVARIATE;
RUN;
Non specificando ulteriori comandi la procedura calcola tutti gli indicatori per ciascuna
variabile che risulti di tipo numerico1 presente nel dataset attivo.
Vediamo ora un esempio.
Esempio 5.2: Spese per alcol e tabacco in Gran Bretagna (1◦ parte)
Nel file alcol.txt e stata registrata la spesa media settimanale (in sterline) in prodotti del
tabacco e bevande alcoliche per ciascuna delle 11 regioni britanniche.
Supponiamo di aver acquisito i dati e di averli memorizzati nel file temporaneo di nome
alcol e di aver chiamato le variabili di interesse alcohol e tobacco. Un primo interesse e
quello di calcolare indici di sintesi della distribuzione delle spese.
Finestra di Program Editor
PROC UNIVARIATE DATA=alcol;
VAR alcohol tobacco;
RUN;
Con il comando VAR specifichiamo per quali variabili deve essere eseguita l’analisi. Di
seguito riportiamo i risultati riguardanti alcohol.
Finestra di Output
La procedura UNIVARIATE
Variabile: Alcohol
Momenti
N 11 Somma dei pesi 11
Media 5.44363636 Somma delle osservazioni 59.88
Deviazione Std 0.79776278 Varianza 0.63642545
Skewness -0.4704039 Kurtosis -1.0164778
SS non corretta 332.3292 SS corretta 6.36425455
Coeff di var 14.6549609 Errore std media 0.24053453
Misure statistiche di base
Posizione Variabilita
Media 5.443636 Deviazione Std 0.79776
Mediana 5.630000 Varianza 0.63643
Moda . Intervallo 2.45000
Intervallo interquartile 1.34000
Test di locazione: Mu0=0
Test -Statistica- -----Valore p-----
T di Student t 22.63141 Pr > |t| <.0001
dei segni M 5.5 Pr >= |M| 0.0010
dei segni per ranghi S 33 Pr >= |S| 0.0010
1 comprese le variabili qualitative codificate con numeri
5. Esempi di procedure statistiche 33
Quantili (Definizione 5)
Quantile Stima
100% Max 6.47
99% 6.47
95% 6.47
90% 6.19
75% Q3 6.13
50% Mediana 5.63
25% Q1 4.79
10% 4.52
5% 4.02
1% 4.02
0% Min 4.02
La procedura UNIVARIATE
Variabile: Alcohol
Osservazioni estreme
---Inferiori--- ---Superiori---
Valore Oss Valore Oss
4.02 12 5.89 8
4.52 7 6.08 11
4.79 9 6.13 3
4.89 5 6.19 4
5.27 10 6.47 2
Valori mancanti
---Percentuale di---
Valore Tutte Oss
mancante Conteggio le oss mancanti
. 1 8.33 100.00
⋄
5.3 PROC REG, PROC GPLOT e PROC CORR
In questa sezione svolgeremo un breve esempio utilizzando il file acquisito precedentemente
per presentare tre procedure: PROC GPLOT, una delle procedure grafiche di SAS, PROC CORR,
per il calcolo di matrici di correlazione e PROC REG, la procedura deputata per svolgere la
stima dei parametri con il metodo dei minimi quadrati (ed e solo una delle tante procedure
di regressione utilizzabili in SAS) .
Esempio 5.3: Spesa per alcol e tabacco in Gran Bretagna (2◦ parte)
Abbiamo visto che l’insieme di dati che utilizziamo e composto di due variabili statistiche: la
spesa media settimanale per alcol e tabacco nelle 11 regioni britanniche, espressa in sterline.
Vogliamo verificare se esiste una relazione tra le due misure. Per prima cosa costruiamo
un grafico di dispersione che illustri l’andamento delle variabili. A tale scopo utilizziamo la
PROC GPLOT.
Finestra di Program Editor
PROC GPLOT DATA=alcol;
PLOT alcohol*tobacco / FRAME;
RUN;QUIT;
5. Esempi di procedure statistiche 34
Fig. 5.1: Grafico del spesa per prodotti del tabacco (in ascissa) e per bevande alcoliche (in ordinata)
Il comando principale della PROC GPLOT e PLOT assey*assex / opzioni; dove assey e il
nome della variabile da porre in ordinata mentre assex e invece l’ascissa. Dopo la barra (/)
possono essere indicate le opzioni che permettono di modificare le dimensioni degli assi, le
dimensioni dei caratteri e l’aspetto esteriore del grafico. Con FRAME indichiamo che il grafico
deve essere riquadrato. La procedura GPLOT, come altre procedure, continua l’esecuzione
fino all’incontro del comando conclusivo QUIT; Il grafico che otteniamo e riportato in figura
5.1.
Dal grafico si osserva che sembra esserci correlazione tra le due variabili e che un modello
di regressione lineare semplice potrebbe risultare soddisfacente. Calcoliamo la matrice di
correlazione:
Finestra di Program Editor
PROC CORR;
VAR alcohol tobacco;
RUN;
Finestra di Output
La procedura CORR
2 Variabili: Alcohol Tobacco
Statistiche semplici
Somma
Variabile N Media Dev std delle oss Minimo Massimo
Alcohol 11 5.44364 0.79776 59.88000 4.02000 6.47000
Tobacco 11 3.61818 0.59071 39.80000 2.71000 4.56000
5. Esempi di procedure statistiche 35
Coefficienti di correlazione di Pearson, N = 11
Prob > |r| rispetto a H0: Rho=0
Alcohol Tobacco
Alcohol 1.00000 0.22357
0.5087
Tobacco 0.22357 1.00000
0.5087
Il risultato della PROC CORR e composto da due parti: una brevissima analisi delle singole
variabili e la matrice di correlazione. Sotto il valore di ciascun coefficiente di correlazione e
riportata la significativita rispetto al test di uguaglianza a 0. In questo caso la correlazione
calcolata e piuttosto bassa e non significativa, nonostante il grafico ci faccia intuire una si-
tuazione diversa. Osservando meglio il grafico, pero, possiamo notare che sembra esserci un
outlier che ha un valore molto alto per la spesa in prodotti del tabacco ma decisamente basso
per la spesa di alcolici (in basso a destra nel grafico). Proviamo quindi ad eliminare l’osserva-
zione dall’analisi; per esempio possiamo utilizzare N , una variabile di sistema nascosta che
rappresenta la posizione di ciascuna osservazione nel dataset (in generale, possiamo utilizzare
qualsiasi variabile che identifichi univocamente l’unita).
Finestra di Program Editor
DATA alcolsenza;
SET alcol;
IF _N_=12 THEN DELETE;
RUN;
La relativa matrice di correlazione cambia in molto evidente:
Finestra di Output
Alcohol Tobacco
Alcohol 1.00000 0.78429
0.0072
Tobacco 0.78429 1.00000
0.0072
A questo punto calcoliamo il modello di regressione. :
Finestra di Program Editor
PROC REG DATA=alcolsenza;
MODEL alcohol = tobacco;
OUTPUT OUT=result PREDICTED=pred RESIDUAL=res;
RUN;QUIT;
5. Esempi di procedure statistiche 36
La sintassi minima per la PROC REG comprende solo l’istruzione MODEL, il resto e opzionale.
Nel comando MODEL viene specificato il modello di regressione, prima la variabile dipen-
dente, separata dalla lista di variabili esplicative tramite il segno di uguale. E possibile speci-
ficare delle opzioni utilizzando la barra (/). Nelle opzioni troviamo la possibilita ad esempio
di ottenere informazioni diagnostiche. Se si desidera stimare un modello polinomiale e ne-
cessario prima creare tramite un DATA STEP le variabili che rappresentano le potenze della
variabile esplicativa. Con il comando OUTPUT viene creato un dataset in formato .sas7bdat
con nome specificato in OUT= e contenente le variabili specificate di seguito. Nel nostro caso
abbiamo riportato i valori previsti (PREDICTED) con il nome pred e i residui della regressione
(RESIDUALS) con il nome res. Questo ci permette di utilizzare tali valori in ulteriori anali-
si. Si noti che la procedura si conclude con il comando QUIT;. Nella finestra di OUTPUT
otteniamo:
Finestra di Output
The REG Procedure
Model: MODEL1
Dependent Variable: Alcohol
Analysis of Variance
Sum of Mean Valore
Origine DF Squares Square F Pr > F
Model 1 2.54337 2.54337 12.78 0.0072
Error 8 1.59147 0.19893
Corrected Total 9 4.13484
Root MSE 0.44602 R-Square 0.6151
Dependent Mean 5.58600 Adj R-Sq 0.5670
Coeff Var 7.98461
Parameter Estimates
Parameter Standard
Variable DF Estimate Error Valore t Pr > |t|
Intercept 1 2.04122 1.00136 2.04 0.0759
Tobacco 1 1.00590 0.28132 3.58 0.0072
Nella prima parte viene riportata la scomposizione della varianza secondo il modello di
regressione stimato insieme ad alcune informazioni sulla variabile dipendente e al coefficiente
di determinazione R2. Nella seconda parte sono riportati le stime dei coefficienti insieme ad
una stima della variabilita e del t-test per la verifica dell’ipotesi nulla H0 : β = 0 contro
l’ipotesi alternativa H1 : β 6= 0 (dove con β intendiamo la stima del parametro stimato).
Nell’ultima colonna e riportato il valore p.
Da questi risultati accettiamo l’ipotesi alternativa per entrambi i coefficienti, il coefficiente
di determinazione e discreto e infatti il test F ci indica che il modello e da preferire rispetto
ad un modello che presenti la sola intercetta.
E bene osservare l’andamento dei valori previsti dal modello e dei residui:
Finestra di Program Editor
PROC GPLOT DATA=result;
AXIS1 VALUE = (F=SWISS H=0.7)
LABEL = (F=SWISS H=1 ’Prodotti del tabacco’)
5. Esempi di procedure statistiche 37
Fig. 5.2: Grafico della spesa per prodotti del tabacco (in ascissa), della spesa per bevande alcoliche
(simbolo: +) e dei valori previsti (simbolo: �).
ORDER = 3 TO 5 BY 1;
AXIS2 VALUE = (F=SWISS H=0.7)
LABEL = (F=SWISS H=1 ’Bevande alcoliche’);
PLOT alcohol*tobacco=1 pred*tobacco=’square’ / FRAME
OVERLAY
HAXIS=AXIS1
VAXIS=AXIS2;
RUN;QUIT;
PROC GPLOT DATA=result;
AXIS1 VALUE = (F=SWISS H=0.7)
LABEL = (F=SWISS H=1 ’Valori previsti’)
ORDER = 4 TO 7 BY 1;
AXIS2 VALUE = (F=SWISS H=0.7)
LABEL = (F=SWISS H=1 ’Residui’);
PLOT res*pred / FRAME
HAXIS=AXIS1
VAXIS=AXIS2;
RUN;QUIT;
AXESn (dove n e un numero) consente di definire l’aspetto esteriore di un asse, le componenti
piu importanti di questo comando sono: VALUE, LABEL e ORDER. Con VALUE indichiamo
quali sono le caratteristiche grafiche dei valori riportati sull’asse, in particolare F=SWISS
indica di utilizzare il set di caratteri SWISS e H=0.7 una dimensione del 70% rispetto alla
dimensione predefinita. Con LABEL possiamo indicare una etichetta per l’asse ed infine con
ORDER indichiamo il valore minimo e massimo e a quale intervallo vanno riportati i valori.
Per utilizzare uno stile AXESn esso deve essere indicato nelle opzioni del comando PLOT come
mostrato nell’esempio, HAXIS= per l’asse delle ascisse e VAXIS= per quello delle ordinate.
Per ottenere due grafici sovrapposti non e sufficiente specificarli nello stesso comando PLOT
ma e necessario nelle opzioni specificare OVERLAY. E possibile differenziare i simboli dei
due grafici con la sintassi assey*assex=’simbolo’, dove ’simbolo’ puo ssere un simbolo
definito (’star’, ’square’, · · ·) oppure un simbolo definito con il comando SYMBOLn che segue
una sintassi simile a quella di AXESn che noi non approfondiamo. Il simbolo definito con
SYMBOLn e utilizzato specificando il numero n: assey*assex=n.
I grafici sono riportati nelle figure 5.2 e 5.3.
5. Esempi di procedure statistiche 38
Fig. 5.3: Grafico dei valori previsti (in ascissa) e dei reisdui.
Dai grafici si nota che il modello puo essere considerato soddisfacente. Con una PROC
UNIVARIATE otteniamo ulteriori informazioni sulla qualita dei residui.
Finestra di Program Editor
PROC UNIVARIATE DATA=result;
VAR res;
RUN;
⋄
5.4 PROC TABULATE
La PROC TABULATE e una procedura che consente di costruire tabelle di frequenza e indici
statistici univariati, in particolare e utile per ottenere prospetti sintetici di indicatori uni-
variati secondo la classificazione di variabili qualitative. Le tabelle di default sono semplici
ma altamente personalizzabili. La PROC TABULATE calcola molte delle statistiche che so-
no calcolate da altre procedure di statistiche descrittive come PROC MEANS, FREQ e REPORT.
La procedura offre inoltre flessibilita nel classificare i valori delle variabili creando tra loro
relazioni gerarchiche e meccanismi per etichettare e visualizzare le variabili e le statistiche.
Esempio 5.4: esempio tabulate
In questo semplice esempio consideriamo i dati di dieta: su 28 persone sono state rilevate
le variabili sesso (sesso) e peso iniziale (peso1), sono state quindi suddivise in 4 gruppi
(distinti da 4 colori) per seguire un differente regime alimentare e successivamente ne e stato
misurato il peso finale (peso2).
Desideriamo qualche indicatore riassuntivo del peso dei soggetti classificati secondo sesso
e/o gruppo. Qui mostriamo solo qualche esempio delle possibilita ottenibili con questa
procedura; il codice e il seguente:
5. Esempi di procedure statistiche 39
Finestra di Program Editor
PROC TABULATE DATA=dieta;
CLASS sesso gruppo;
VAR peso1 peso2;
TABLE sesso ALL, gruppo ALL;
TABLE sesso, (peso1 peso2)*MEAN;
TABLE sesso, (peso1 peso2)*(MIN MAX);
TABLE gruppo sesso, peso1*(N MEAN);
TABLE sesso ALL, peso1*(N MEAN);
TABLE gruppo*sesso, peso2*(N MEAN);
RUN;
Con il comando CLASS si specifica quali sono le variabili di classificazione, solitamente qua-
litative; con il comando VAR si indicano quali sono le variabili quantitative su cui si desidera
calcolare gli indicatori; l’istruzione TABLE costruisce la tabella sulla base di quanto dichiarato
per le righe e le colonne e si possono richiedere quante tabelle si desidera. La pseudo variabile
ALL consente di ottenere le frequenze marginali o i totali marginali per qualunque statistica.
In generale si ricordi che prima della virgola va l’espressione che definira le righe ossia le
variabili di classificazione, mentre dopo la virgola va l’espressione che definira le colonne,
ossia le statistiche di interesse e su quali variabili vanno calcolate, collegate tra loro da un
asterisco; nel nostro esempio otterremo:
• TABLE sesso ALL, gruppo ALL: tabella di frequenze incrociate
• TABLE sesso, (peso1 peso2)*MEAN: media di ciascuna variabile, separatamente per
sesso
• TABLE sesso, (peso1 peso2)*(MIN MAX): statistiche di min e max separatamente
per sesso
• TABLE gruppo sesso, peso1*(N MEAN) numerosita e media separatamente per sesso
e per gruppo
• TABLE sesso ALL, peso1*(N MEAN): numerosita e media separatamente per sesso e
in totale
• TABLE gruppo*sesso, peso2*(N MEAN): numerosita e media separatamente per il
sesso incrociato con il gruppo
5.5 PROC ANOVA
La PROC ANOVA e una delle molte procedure utilizzabili in SAS per l’analisi della varianza; e
concepita per gli studi di piani bilanciati; in casi diversi e piu opportuno usare le specifiche
opzioni della PROC GLM. Tuttavia la PROC ANOVA puo tranquillamente essere utilizzata nei
disegni in cui tutti i fattori sono ortogonali tra loro (one-way anova, quadrati latini, etc).
Esempio 5.5: Composizione degli hotdog
Consideriamo i risultati di un laboratorio di analisi sulla composizione di tre diversi tipi di
hotdog in termini di calorie e quantita di sodio. I tipi di hotdog sono quelli di manzo, quelli
di pollo e quelli di carne mista (maiale, manzo e pollo). Dopo l’acquisizione procediamo con
l’anova; il codice e il seguente:
5. Esempi di procedure statistiche 40
Finestra di Program Editor
PROC ANOVA DATA=lib.hotdog;
CLASS tipo;
MODEL calorie sodio=tipo;
RUN;
Abbiamo indicato che il dataset attivo e hotdog quindi abbiamo dato le istruzioni fonda-
mentali:
- CLASS e l’istruzione che indica qual e la variabile di classificazione da considerare nel
modello, e un’istruzione necessaria e deve apparire prima dell’istruzione MODEL;
- MODEL indica quali sono le variabili dipendenti (quelle prima del segno di =) e gli effetti
indipendenti;
Nell’output prima troviamo un riassunto sui livelli di classificazione ed il numero di osserva-
zioni coinvolte quindi l’analisi della varianza vera e propria.
Finestra di Output
The ANOVA Procedure
Dependent Variable: calorie
Somma dei Media Valore
Origine DF quadrati quadratica F Pr > F
Model 2 17692.19510 8846.09755 16.07 <.0001
Error 51 28067.13824 550.33604
Corrected Total 53 45759.33333
R-Square Coeff Var Root MSE calorie Mean
0.386636 16.12935 23.45924 145.4444
Media Valore
Origine DF Anova SS quadratica F Pr > F
tipo 2 17692.19510 8846.09755 16.07 <.0001
L’F di Snedecor per le calorie vale 16.07 ed e altamente significativo, mentre quello per il sodio
vale 1.78 (risultato non riportato) che risulta non significativo. Dal boxplot (diagramma a
scatola e baffi) risulta evidente che l’apporto calorico degli hotdog di pollo e nettamente
inferiore a quello degli altri due tipi (figura 5.4). Il boxplot e stato ottenuto con il seguente
codice:
Finestra di Program Editor
PROC BOXPLOT DATA=lib.hotdog;
PLOT calorie*tipo;
RUN;
5. Esempi di procedure statistiche 41
Fig. 5.4: Boxplot delle calorie per tipologia di hotdog
5.6 PROC CLUSTER
La PROC CLUSTER divide le osservazioni di un dataset in gruppi gerarchici utilizzando uno
degli undici metodi previsti. I dati iniziali possono essere valori di variabili numeriche o
distanze. Se sono valori, la PROC CLUSTER calcola distanze euclidee.
La sintassi minima necessaria e la seguente:
PROC CLUSTER METHOD=nomemetodo DATA=nomefilesas7bdat;
RUN;
Nell’esempio che discuteremo sara proposta qualche istruzione opzionale.
Esempio 5.6: Consumo di proteine in Europa
Nel file proteine.txt sono memorizzati i dati riguardanti il consumo di proteine in 25 paesi
europei per 9 tipologie di cibo (i dati risalgono al 1973).
Acquisiamo i dati utilizzando l’INPUT a formato libero specificando dopo l’istruzione
INPUT l’elenco delle variabili. Il file ottenuto e pro.sas7bdat. La nostra intenzione e di capire
se e possibile raggruppare i vari paesi sulla base delle loro abitudini alimentari utilizzando
la PROC CLUSTER:
Finestra di Program Editor
PROC CLUSTER DATA=lib.pro METHOD=complete OUTTREE=albero;
VAR RedMeat WhiteMeat Eggs Milk Fish Cereals Starch Nuts FrVeg;
ID country;
RUN;
PROC TREE DATA=albero HORIZONTAL OUT=gruppi N=4 ;
ID country;
RUN;
Vediamo le istruzioni una per una:
- DATA= indica il dataset delle osservazioni che stiamo raggruppando in cluster;
5. Esempi di procedure statistiche 42
Fig. 5.5: Dendorgramma ottenuto dalla PROC TREE
- METHOD= tramite questa istruzione specifichiamo secondo quale criterio vogliamo siano
accorpate le unita. Il SAS ne prevede 11; in questo caso abbiamo scelto la distanza
del legame completo (ma i risultati utilizzando la distanza di McQuitty, quella basata
sui centroidi e sulla media sono molto simili);
- OUTTREE= con questa opzione indichiamo il nome di un file esterno in cui memorizzare
il risultato della procedura; tali informazioni sono quelle che servono alla procedura
successiva (PROC TREE) per costruire l’albero degli accorpamenti;
- con l’istruzione VAR specifichiamo quali sono le variabili da considerare per il calcolo
delle distanze; se la omettiamo verranno usate tutte le variabili numeriche;
- il SAS utilizzera il valore della variabile indicata con l’istruzione ID per identificare le
unita statistiche, in questo caso vedremo immediamente quali sono i Paesi accorpati
ad ogni passo, se la omettiamo verra usato il numero dell’osservazione;
La PROC TREE e la procedura che crea in dendrogramma, qui vediamo le opzioni:
- HORIZONTAL perche l’albero sia disegnato in orizzontale (il valore predefinito e vertica-
le);
- ID ha il significato gia visto;
- OUT= indichiamo il nome di un dataset che memorizzera il gruppo di appartenenza della
singola unita statistica al passo di nostro interesse indicato nell’opzione che segue;
- N= indica il numero di gruppi a cui siamo interessati.
5. Esempi di procedure statistiche 43
Dallo studio dell’albero (in figura 5.5) e della storia dei raggruppamenti possiamo in-
dividuare i cluster. Analizzando poi la distribuzione delle variabili all’interno dei cluster
possiamo individuare quali sono le piu significative per interpretare il fenomeno oggetto di
studio. Per prima cosa dobbiamo correttamente collegare il file che contiene le informazioni
riguardanti l’appartenenza ai gruppi con i dati originali e quindi procedere (per esempio)
con delle analisi descrittive. Nel nostro caso e possibile individuare principalmente 4 gruppi;
il primo e formato dai paesi dell’Europa Nord-Occidentale, in cui e alto il consumo di carni,
uova e latte; uno di paesi poveri (Bulgaria, Romania e Yugoslavia) il cui consumo e sotto la
media per tutti i tipi di cibo tranne i cereali; un gruppo, che comprende l’Italia, con scarso
consumo di alimenti proteici ma di cereali, frutta e verdura ed in fine il gruppo formato da
Portogallo, Spagna e Germania dell’Est, analogo al precedente ma con minore consumo di
cereali e maggiore consumo di pesce.
⋄
5.7 PROC FACTOR
La PROC FACTOR implementa l’analisi delle componenti principali e alcune sue particolariz-
zazioni come l’analisi fattoriale. L’analisi puo partire da dati multivariati grezzi come da
matrici di correlazione o matrici di covarianze. Consideriamo gli stessi dati dell’esempio
precedente.
Finestra di Program Editor
PROC FACTOR DATA=lib.pro NPLOT=3 SCREE ROTATE=v OUT=fact NFACTORS=3 ;
VAR RedMeat WhiteMeat Eggs Milk Fish Cereals Starch Nuts FrVeg ;
RUN;
La sintassi minima e costituita da PROC FACTOR e RUN; ma vediamo, oltre all’ormai solito
DATA= che indica qual e il dataset attivo, qualche interessante opzione:
- NPLOT indica il numero di fattori di cui fare il grafico; specificando NPLOT=n tutte le
coppie dei primi n fattori saranno rappresentate graficamente;
- SCREE produce una rappresentazione grafica degli autovalori
- ROTATE= specifica il metodo di rotazione prescelto, il valore di default e nessuno e v
indica la rotazione varimax
- OUT= crea un dataset che contiene tutti i dati gia memorizzati nel dataset iniziale e
indicato dopo DATA= piu le stime dei punteggi sui fattori per tutte le unita statisti-
che in variabili che si chiameranno factor1, etc.; questa opzione va usata assieme a
NFACTORS=
- NFACTORS= specifica il numero di variabili che contengono i punteggi fattoriali da
memorizzare
- VAR e l’istruzione che indica quali variabili devono essere coinvolte nel calcolo dei fattori
5. Esempi di procedure statistiche 44
L’OUTPUT della PROC FACTOR puo includere medie, deviazioni standard, correlazioni,
autovalori, autovettori, stime delle comunanze, le soluzioni ruotate e non ruotate, la varianza
espressa da ciascun fattore ignorando o eliminando altri fattori, rappresentazioni grafiche dei
fattori ruotati e non ruotati, punteggi fattoriali, etc.
Di seguito riportiamo solo i punteggi fattoriali della soluzione ruotata in cui vediamo che
il primo fattore coglie la variabilita dovuta al consumo delle carni bianche e delle uova, la
seconda essenzialmente quella del consumo del latte e il terzo quella del consumo di pesce.
Finestra di Output
Rotated Factor Pattern
Factor1 Factor2 Factor3
RedMeat 0.19631 0.62548 0.20536
WhiteMeat 0.93782 0.06740 -0.18199
Eggs 0.72908 0.43276 0.22308
Milk 0.25140 0.84634 0.12491
Fish -0.15646 0.08808 0.91758
Cereals -0.49204 -0.51394 -0.60082
Starch 0.54011 0.03545 0.57544
Nuts -0.63955 -0.56753 -0.11689
FrVeg 0.07907 -0.69118 0.47146
Variance Explained by Each Factor
Factor1 Factor2 Factor3
2.4863837 2.3723048 1.9106681
Final Communality Estimates: Total = 6.769357
RedMeat WhiteMeat Eggs Milk Fish
0.47193415 0.91716435 0.76859946 0.79509704 0.87418679
Cereals Starch Nuts FrVeg
0.86722031 0.62411676 0.74477733 0.70626033
5.8 PROC LOGISTIC
La PROC LOGISTIC stima modelli di regressione logistica per variabili risposta di tipo dico-
tomico o ordinale con il metodo della massima verosimiglianza. I sottoinsiemi di variabili
esplicative possono essere scelti sulla base di diversi metodi di selezione ed e possibile otte-
nere una vasta diagnostica per i modelli a risposta dicotomica. I possibili legami sono logit,
normit e log-log.
La sintassi minima e:
PROC LOGISTIC DATA=nomefilesas7bdat;
MODEL variabiledipendente = listadellevariabiliindipendenti;
RUN;
Esempio 5.7: Test d’urto
Consideriamo i dati riguardanti dei test d’urto condotti su una serie di macchine allo scopo
verificare il tipo e l’entita dei danni subiti dai manichini da test inseriti nell’abitacolo. Nel
dataset originale le variabili rilevate erano la marca, il modello e l’anno di produzione del-
l’automobile, quattro variabili per misurare i danni alla testa, alla gamba destra, alla gamba
5. Esempi di procedure statistiche 45
sinistra e al petto, la tipologia di protezione (airbag, cinture, etc.), se il manichino fosse al
posto dell’autista o del passeggero, il peso, il numero di porte e la tipologia dell’auto.
Dopo aver creato il dataset con le variabili di interesse e necessario dedicare un po’ di tem-
po ad uno studio preliminare delle informazioni. Attraverso la distribuzione delle frequenze
semplici rileviamo che non sempre esse si presentano nella forma a noi piu utile. Dobbiamo
controllare e, in caso ricodificare, le variabili, nel tentativo di trovare un compromesso tra
esaustivita e sintesi. Inoltre, puo capitare che una variabile ritenuta importante a priori si
presenti con una distribuzione anomala oppure “non sia una variabile” nella sottopopolazione
di interesse.
La prima questione da affrontare e la definizione della variabile dipendente. Decidiamo
di studiare i feriti gravi e a questo scopo creiamo la variabile ferito che assume valore 1
per tutte le unita che hanno riportato una misura di danno alla testa superiore a 1000 e 0
altrimenti.
Finestra di Program Editor
DATA crashtest;
SET crashtest;
IF headIC> 1000 THEN ferito=1;
ELSE ferito=0;
(...)
La seconda questione e la scelta delle variabili esplicative, infatti puo capitare che due o
piu variabili siano tra loro fortemente dipendenti, potendo creare, ad esempio, probelmi di
collinearita e quindi instabilita nelle stime. Nel nostro esempio considereremo come variabili
esplicative solo la posizione del manichino (autista o passeggero - dp), il peso della macchina
(wt) e il tipo di protezione utilizzata (protez).
Il passo seguente e quello di procedere con l’analisi bivariata tra le variabili indipendenti
e quella risposta. Con la PROC FREQ creiamo le tabelle a doppia entrata e calcoliamo gli
indici di associazione (ad esempio il χ2 o il V di Cramer) per le variabili nominali ed ordi-
nali, l’odds ratio per le variabili dicotomiche mentre un’analisi di regressione logistica per
ciascuna variabile quantitativa. Al termine di questa fase avremo individuato le variabili
stocasticamente indipendenti dalla variabile risposta, quelle cioe che non contribuiscono alla
sua spiegazione e possiamo eventualmente scremare ulteriormente l’insieme di variabili da
inserire nel modello.
Siamo pronti per svolgere a questo punto l’analisi di regressione logistica.
Finestra di Program Editor
PROC LOGISTIC DATA=crashtest DESCENDING;
CLASS dp protez;
MODEL ferito = dp protez wt / CTABLE;
RUN;
Vediamo alcune delle istruzioni opzionali:
- DESCENDING e un’opzione della procedura per invertire l’ordine delle risposte della
variabile dicotomica (noi siamo abituati a pensare 1=evento, 0=non evento, mentre il
valore predefinito in SAS e 1=evento, 2= non evento, siccome vengono messi in ordine
5. Esempi di procedure statistiche 46
crescente risultano associati il nostro 0 al suo 1 ed il nostro 1 al suo 2; con DESCENDING
stabiliamo che venga effettuata l’associazione piu coerente con il nostro usuale modo
di ragionare);
- CLASS con questa istruzione indichiamo a SAS quali variabili sono di natura dicotomica,
nominale o ordinale per cui deve stimare un parametro per ogni singola modalita. Per
rendere identificabile il modello, SAS pone uguale a zero il parametro associato alla
modalita che risulta ultima nell’ordinamento della variabile. Analogamente al momento
del calcolo degli odds ratio, questi saranno calcolati rispetto a questa modalita. E
importante tenere conto di questi fatti nell’interpretazione dei valori dei parametri.
- CTABLE opzione dell’istruzione MODEL= che stampa la tabella di classificazione del mo-
dello per la distribuzione delle osservazioni classificate correttamente e scorrettamente;
Tra le opzioni che non vediamo ricordiamo:
- SELECTION= specifica il metodo per selezionare le variabili nel modello (BACKWARD,
FORWARD oppure STEPWISE);
- SLE= serve per specificare il livello di significativita per accettare l’ingresso di una
variabile nel modello, mentre SLS= specifica quello per rimanere nel modello;
- ITPRINT stampa la storia delle iterazioni del modello.
Il risultato dell’elaborazione e stampato nella finestra di OUTPUT. Tra le altre cose,
troviamo la stima di massima verosimiglianza dei parametri, la stima dell’errore standard,
la statistica χ2 basata sul test di Wald, il p-value di tale statistica ed infine l’odds ratio ed
il relativo intervallo di confidenza. Alla fine ci sono alcuni indicatori di associazione tra le
probabilita predette e le risposte osservate. Riportiamo di seguito una parte dell’OUTPUT.
Finestra di Output
Analysis of Maximum Likelihood Estimates
Standard Wald
Parameter DF Estimate Error Chi-Square Pr > ChiSq
Intercept 1 -3.0084 0.6184 23.6664 <.0001
DP Driver 1 0.4845 0.1308 13.7099 0.0002
protez Motorized_belts 1 0.0786 0.3430 0.0525 0.8187
protez d_airbag 1 -1.3584 0.4195 10.4866 0.0012
protez manual_belts 1 1.1667 0.2220 27.6174 <.0001
Wt 1 0.000493 0.000199 6.1230 0.0133
Odds Ratio Estimates
Point 95% Wald
Effect Estimate Confidence Limits
DP Driver vs Passenger 2.635 1.578 4.401
protez Motorized_belts vs passive_belts 0.966 0.330 2.830
protez d_airbag vs passive_belts 0.230 0.064 0.819
protez manual_belts vs passive_belts 2.868 1.286 6.397
Wt 1.000 1.000 1.001
Notiamo che il modello e abbastanza interessante; essere dalla parte del guidatore e piu
pericoloso che essere dalla parte del passeggero e avere gli airbags e decisamente protettivo
mentre il peso (e quindi la massa della macchina) non ha un’influenza significativa quando
stiamo studiando i danni alla testa.
⋄
5. Esempi di procedure statistiche 47
5.9 PROC CORRESP
La PROC CORRESP consente di effettuare l’analisi delle corrispondenze semplici e multiple sia
su dati individuali che su tabelle di contingenza. La sintassi minima e:
PROC CORRESP DATA=nomefilesas7bdat < MCA >;
TABLES lista di variabili;
oppure
VAR lista di variabili;
RUN;
Ci sono due modi diversi di procedere. Se abbiamo dati individuali di tipo categoriale
useremo l’istruzione TABLES, se, invece, i dati sono gia in forma di tabella useremo l’istruzione
VAR; le due istruzioni sono mutuamente esclusive ma una delle due deve essere specificata.
Tutte le altre istruzioni sono opzionali.
MCA e l’opzione necessaria per fare un’analisi delle corrispondenze multiple.
Esempio 5.8: Tipologie di appartamenti
In questo esempio consideriamo i dati sulle caratteristiche di 117 appartamenti. Sono state
rilevate le seguenti variabili: costo dell’affitto (in Lire), area in metriquadrati, eta dello
stabile, numero di servizi disponibili (frigorifero, lavapiatti, etc.), se si trova in un quartiere
residenziale, se e un appartamento d’angolo, se e stato ristrutturato su misura.
Prima di avviare la procedura dobbiamo preparare i dati, il SAS infatti usera nella
finestra di OUTPUT e nei grafici le modalita delle variabili e siccome i nostri dati, come
spesso succede, sono stati codificati con numeri per noi diventera difficile interpretarli. Per
ovviare al problema possiamo ricodificare i dati dal formato numerico a quello alfanumerico.
In un DATA STEP ricodifichiamo le variabili con una serie di istruzioni IF:
Finestra di Program Editor
(...)
IF mq^=. & mq<=95 THEN bmq=’ 70-95mq’;
IF mq>95 & mq<=120 THEN bmq=’95-120mq’;
IF mq>120 & mq<=150 THEN bmq=’120-150mq’;
IF mq>150 & mq<=200 THEN bmq=’150-200mq’;
IF mq>200 & mq<=250 THEN bmq=’200-250mq’;
IF mq>250 THEN bmq=’>250mq’;
IF res=1 THEN bres=’ res’;
IF res=0 THEN bres=’nores’;
(...)
Per esempio abbiamo ricodificato la variabile mq (area in metriquadrati) in 6 classi: la nuova
variabile si chiama bmq, e di tipo carattere e ogni modalita risulta autoesplicativa. Anche le
variabili dicotomiche sono state trasformate in variabili di tipo carattere (bres). Con criteri
analoghi ricodifichiamo le variabili che riguardano i servizi (bser), il costo dell’affitto (baff),
l’eta della casa (bage), essere d’angolo (bang) e essere ristrutturato su misura (bsum).
A questo punto e conveniente studiare la distribuzione delle frequenze. Particolare
attenzione va posta alle modalita che presentano frequenze basse.
Il codice per un’analisi delle corrispondenze multiple e:
5. Esempi di procedure statistiche 48
Finestra di Program Editor
PROC CORRESP DATA=lib.case GREENACRE BENZECRI OUTC=coord MCA MISSING;
TABLES bres bang bsum bser bage baff bmq ;
RUN;
Oltre a TABLES che e l’istruzione necessaria perche i nostri dati sono individuali, anche in
questo caso abbiamo usato alcune istruzioni opzionali:
- GREENACRE calcola le inerzie corrette secondo i criteri di Greenacre, se si desiderano
quelle usuali bisogna non specificare nulla (lasciare il default), se si vogliono entrambe
bisogna specificare anche l’opzione UNADJUSTED;
- BENZECRI calcola le inerzie corrette secondo il metodo proposto da Benzecri;
- OUTC= crea un file esterno, nel nostro caso di nome coord, che contiene alcune in-
formazioni sull’analisi, tra cui le coordinate necessarie per la stampa di eventuali
grafici;
- MCA come si e detto e l’opzione per l’analisi delle corrispondenze multiple, non avendo
specificato diversamente il numero delle dimensioni sara 2;
- MISSING coinvolge i dati mancanti nell’elaborazione considerando il dato mancante una
modalita della variabile (altrimenti le osservazioni con dati mancanti vengono eliminate
dall’analisi);
Pur non avendola utilizzata ci sembra doveroso segnalare tra le istruzioni che non vediamo
in dettaglio SUPPLEMENTARY: i valori delle modalita delle variabili specificate dopo tale istru-
zione, pur non contribuendo al calcolo degli autovalori ed autovettori vengono riportate tra
i risultati e proiettate nel grafico.
Nella finestra di OUTPUT, visto che non abbiamo fatto richieste specifiche, troveremo:
- la radice degli autovalori, gli autovalori, il test χ2 e la percentuale di inerzia spiegata
corretta secondo Greenacre;
- le coordinate di colonna per i due assi principali;
- una tabella di statistiche per i punti-colonna;
- una tabella con i contributi relativi di ogni punto colonna all’inerzia globale;
- una tabella con la porzione di varianza spiegata da ogni variabile in relazione ad ogni
asse principale;
- una tabella con gli indicatori per ogni asse dei punti che contribuiscono maggiormente
a caratterizzare l’asse stesso e per ogni punto e riportato l’indice dell’asse lungo il quale
il punto e meglio rappresentato;
- una tabella con la quota di varianza del punto spiegata dall’asse considerato.
Il grafico, invece, non fa parte dei risultati previsti per default.
Abbiamo memorizzato parte dei dati nel file coord, con il prossimo passo di DATA inizia-
lizziamo le ulteriori variabili necessarie alla creazione del grafico, per il quale utilizziamo la
procedura GPLOT.
5. Esempi di procedure statistiche 49
Fig. 5.6: Grafico di dispersione per l’analisi delle corrispondenze.
Finestra di Program Editor
DATA coord;
SET coord;
y=dim1;
x=dim2;
Xsys=’2’;
Ysys=’2’;
text=_name_;
size=1;
label y=’asse y’ x=’asse x’;
KEEP x y text size Xsys Ysys inertia;
RUN;
PROC GPLOT DATA=coord;
PLOT y*x=1 / ANNOTATE=coord FRAME HAXIS=-1.6 to 2.2 by 0.2
VAXIS=-1.6 to 2.4 by 0.2
HREF=0 VREF=0;
RUN;
ANNOTATE= permette che sul grafico vengano usate le etichette attribuite alle coordinate,
come sono memorizzate in coord, HREF= e VREF= specificano quale sara l’origine degli assi.
La figura 5.6 mostra il grafico ottenuto mentre la prima parte dei risultati segue nella
finestra di OUTPUT.
La disposizione delle modalita nel grafico segue un andamaento a ferro di cavallo che
indica una sostanziale unidimensionalita delle frequenze osservate (effetto Guttman). Non ci
sorprende infatti vedere che c’e praticamente un solo asse principale, lungo il quale si snodano
le modalita del prezzo dell’affitto vicine, di volta in volta, all’aumentare dei servizi disponibili
e dei metri quadrati. Notiamo poi, che nel quadrante dove ci sono gli appartamenti piu ampi
e costosi troviamo la modalita che riguardano la ristrutturazione su misura mentre l’eta della
casa segue un andamento contrario.
5. Esempi di procedure statistiche 50
Finestra di Output
Benzecri Adjusted Inertia Decomposition
Principal Adjusted Cumulative
Inertia Inertia Percent Percent 13 26 39 52 65
----+----+----+----+----+---
0.39748 0.08824 63.62 63.62 ************************
0.27019 0.02207 15.91 79.53 ******
0.23284 0.01102 7.94 87.47 ***
0.21018 0.00617 4.45 91.92 **
0.20041 0.00451 3.25 95.17 *
0.18823 0.00280 2.02 97.19 *
0.18435 0.00234 1.69 98.88 *
0.17158 0.00112 0.81 99.69
0.16073 0.00043 0.31 100.00
Total 0.13871 100.00
⋄
6. ALTRO
In questo capitolo e riportato qualche suggerimento per affrontare varie problematiche, co-
muni tra chi utilizza SAS. Sono poche, piccole cose che possono risolvere qualche inevitabile
momento di impasse.
6.1 Dataset di versioni diverse
La lettura (e di conseguenza l’utilizzo) di dataset creati con versioni precedenti di SAS non
e automatica. Questo problema si puo facilmente risolvere tenendo i file separati in due
diverse directory, alle quali ci si riferira con i relativi nomi logici e sfruttando un’opzione
dell’istruzione LIBNAME. Supponiamo che i file su cui desideriamo lavorare siano stati creati
con la versione 6.12, allora dovremmo scrivere il seguente codice:
Finestra di Program Editor
LIBNAME lib1 V612 ’x:\directoryconfilevecchi’;
LIBNAME lib2 ’x:\directoryconfilenuovi’;
L’opzione V612 che compare tra il nome logico lib1 e la relativa directory che contiene
i file vecchi permette al SAS di riconoscerli e di gestirli nel modo corretto. Eventuali ela-
borazioni e quindi nuovi dataset potranno essere memorizzati nella nuova directory indicata
dal nome logico lib2 con il formato attuale. Se i file vecchi fossero stati creati con un’altra
versione di SAS, allora bisognerebbe sostituire V612 con l’opzione relativa.
6.2 Cambio di formato: numerico vs carattere
Puo capitare che le nostre variabili, pur essendo di natura numerica, siano state acquisite
in modo non corretto e che, controllandone il tipo tramite la PROC CONTENTS, si scopra che
sono considerate ’char’. Supponiamo di avere una variabile num, erroneamente memorizzata
come di tipo char. Per ottenere il cambio di tipo basta una riga di istruzioni:
Finestra di Program Editor
numnuova=num+0;
Analogamente possiamo trasformare variabili di tipo numerico in variabili di tipo carat-
tere; la riga di istruzioni e la seguente:
Finestra di Program Editor
varnuovachar=varvecchianumerica||"";
6. Altro 52
6.3 Ricostruzione di gruppi
Capita spesso che le osservazioni oggetto delle analisi siano logicamente raggruppabili e che
sia nostro interesse collegarle. Esempio tipico e il caso in cui il dataset e composto dai singoli
individui delle famiglie oggetto d’indagine e che ci interessi considerare le famiglie e non
solo gli individui. Per creare un nuovo dataset che raggruppi correttamente gli individui
in famiglie si puo scegliere tra diverse strade piu o meno contorte; qui riportiamo il modo
suggerito da SAS stesso, che utilizza alcuni costrutti interessanti come le variabili FIRST e
LAST, gli array e l’istruzione RETAIN.
In un DATA STEP il SAS identifica l’inizio e la fine di ciascun gruppo precedentemente
individuato da un’operazione di ordinamento (PROC SORT), creando due variabili temporanee
per ciascun gruppo: FIRST.nomevariabile e LAST.nomevariabile. Queste variabili tem-
poranee sono utilizzabili nella programmazione ma non sono memorizzate nel dataset finale.
Quando una osservazione e la prima di un gruppo, il valore della FIRST.nomevariabile
e posto a 1; per tutte le altre osservazioni dello stesso gruppo, quindi, il valore della
FIRST.nomevariabile e posto a 0. Analogamente, se un’osservazione e l’ultima del pro-
prio gruppo, il valore di LAST.nomevariabile e posto a 1 e per tutte le altre e posto a
0.
In SAS gli array, a differenza di altri linguaggi di programmazione, costituiscono sem-
plicemente una maniera conveniente di identificare gruppi di variabili; non costituisce una
struttura di dati ed esiste solo per la durata del DATA STEP. Per definire un array bisogna
utilizzare la corrispondente istruzione che ha la seguente forma:
Finestra di Program Editor
ARRAY nomedell’array (numerodeglielementi) elencodivariabili;
Con l’istruzione ARRAY, quindi, stiamo definendo:
• nomedell’array: il nome che identifica l’insieme di variabili
• numerodeglielementi: il numero degli elementi che verranno raggruppati
• elencodivariabili: i nomi delle variabili che saranno momentaneamente raggruppate
nell’array
Ogni volta che definiamo un array, SAS automaticamente associa a ciascun elemento
dell’array un riferimento che non e altro che la posizione dell’elemento nell’array.
A questo punto vediamo l’esempio concreto in cui facciamo collassare le osservazioni
appartenenti allo stesso gruppo in un’unica osservazione.
Finestra di Program Editor
DATA in;
INPUT gr y s $;
CARDS;
1 2 a
2 1 c
1 5 a
1 9 b
1 10 c
2 2 a
6. Altro 53
2 1 b;
RUN;
PROC SORT;
BY gr; RUN;
La prima parte dell’esempio e costituito semplicemente da un DATA STEP per vedere i dati
su cui opereremo; abbiamo 7 osservazioni e tre variabili (gr,y e s) che vengono memorizzate
nel dataset in. La prima variabile (gr) e quella che ci permette di identificare i gruppi, che
sono 2, quindi abbiamo ordinato le osservazioni secondo questa variabile.
Finestra di Program Editor
DATA out (KEEP=gr y1-y5 s1-s5);
RETAIN gr y1-y5 s1-s5;
ARRAY ay (5) y1-y5;
ARRAY as (5) $ s1-s5;
SET in;
BY gr;
IF FIRST.gr THEN DO;
i=1;
DO j=1 TO 5;
as(j)=’ ’;
ay(j)=.;
END;
END;
as(i)=s;
ay(i)=y;
IF LAST.gr THEN OUTPUT;
i+1;
RUN;
A questo punto carichiamo (con il comando SET) il dataset in e con l’opzione KEEP=
dell’istruzione DATA indichiamo che al termine delle elaborazioni salveremo un nuovo dataset
di nome out che conterra le variabili gr, y1, y2, y3, y4, y5, s1, s2, s3, s4 e s5.
Con il comando RETAIN indichiamo al SAS di non reinizializzare a dato mancante i valori
delle variabili indicate, pur scorrendo le righe del dataset iniziale.
Con le due istruzioni ARRAY dichiariamo le due strutture, la prima di nome ay di dimen-
sione 5 e che raggruppa le variabili da y1 a y5 e la seconda di nome as sempre di dimensione
5 e che raggruppa le variabili da s1 a s5. I vari gruppi avranno verosimilmente numero-
sita diverse quindi la dimensione dell’array dovra essere pari o maggiore alla numerosita del
gruppo piu grande.
Inizia quindi la fase operativa: se l’osservazione e la prima del gruppo, si entra in un
ciclo in cui il contatore i viene inizializzato a 1 e tutti gli elementi degli array, scorsi con
il contatore j, vengono inizializzati a dato mancante. Usciti dal ciclo di inizializzazione si
passa all’assegnazione; ai primi elementi dei due array (as(1) e ay(1)) vengono assegnati
i valori delle rispettive variabili s e y della riga (osservazione) che stiamo leggendo. Quindi
viene effettuato il confronto sulla variabile LAST e se l’osservazione non e l’ultima del gruppo
allora il contenuto del buffer fin qui completato non viene scritto nel nuovo dataset; viene
aggiornato il contatore i e si passa alla riga seguente. La riga dopo non sara la prima del
gruppo, quindi non si entrera nel ciclo di inizializzazione ma si passera subito alla fase di
assegnazione, questa volta del secondo elemento (as(2) e ay(2)) con i valori delle rispettive
variabili per quella riga (osservazione).
6. Altro 54
Quando si giungera all’ultimo elemento del gruppo, verra forzata la scrittura nel dataset
finale e, siccome la riga successiva sara necessariamente il primo elemento del gruppo se-
guente, verranno reinizializzati a dato mancante tutti gli elementi dell’array e si ricomincera
l’assegnazione dal primo.
E chiaro che la struttura di tutte le righe del dataset sara uguale e se la numerosita di un
gruppo e inferiore alla dimensione massima, gli ultimi elementi dell’array e quindi le variabili
corrispondenti nel dataset finale saranno dati mancanti.
6.4 Accenni sulle macro
Con una macro di SAS si intende un insieme di istruzioni SAS che possono ripetutamente
essere richiamate oppure che possono sostituire nomi di dataset o variabili con nomi simbolici.
E codice di programmazione che consiste in un sistema di variabili, istruzioni e funzioni
che vengono direttamente processate da SAS attraverso il processore di macro. Le macro
utilizzano le risorse in modo piu efficiente e permettono un maggior controllo del processo
dinamico soprattutto nelle situazioni in cui lo stesso codice deve essere ripetuto spesso. Se
siete pratici di altri linguaggi di programmazione, potete considerare le macro come una
subroutine.
Per esempio, nel caso si debba ripetere piu volte la stessa struttura di istruzioni, possiamo
definire la procedura o, in generale, l’insieme di operazioni necessarie, utilizzando le variabili
macro, dando loro un nome e indicandone i parametri.
SAS invoca lo strumento delle macro quando incontra uno dei seguenti caratteri: l’am-
persand (&) o il simbolo di percentuale (%) seguiti dal nome della macro variabile. Una volta
che la macro e stata definita puo essere richiamata da qualsiasi punto del nostro programma
SAS.
Schematicamente teniamo sempre presente che:
• per essere utilizzata una macro deve essere definita prima di essere chiamata
• deve iniziare con: %MACRO nomedellamacro
• deve terminare con: %MEND
• se si dimentica di terminare una macro allora il compilatore continuera a considerare
come parte della macro tutto cio che viene di seguito
• una macro puo contenere codice di DATA e PROC STEP, funzioni e istruzioni di program-
mazione macro.
• ci sono due tipi di riferimenti macro:
– riferimenti a variabili macro, che sono precedute da &
– definizioni e chiamate a macro, che sono precedute da %
• i nomi della macro seguono le regole di sintassi dei nomi di SAS
Quando viene trovata una variabile macro nel codice, allora viene creata una variabile
SAS. I valori delle variabili macro vengono memorizzati in un insieme di tabelle simboliche.
Ci sono due tipi di variabili macro:
- definite dal sistema
6. Altro 55
- definite dall’utente
Tramite l’istruzione %LET si definisce il valore della variabile macro e puo essere utilizzato
in punto qualsiasi del programma SAS. La forma dell’istruzione e la seguente:
Finestra di Program Editor
%LET nomedellavariabilemacro=valore;
Se viene omessa, il valore della variabile viene posto a 0. Per controllare il valore di una
variabile si puo utilizzare l’istruzione %PUT nomevariabilemacro; se si da come paramtero
ALL , si otterra la lista di tutte le variabili correnti.
La cosa piu interessante e parametrizzare le macro per renderle flessibili e quindi utiliz-
zabili con diversi valori d’ingresso. Il numero di parametri dipende dalla definizione della
macro ed e molto importante la loro posizione nell’elenco; al momento di passarli, quindi,
bisogna ricordarsi l’ordine ed il numero dei parametri dichiarati perche vengano interpretati
nel modo corretto.
Vediamo un brevissimo esempio. Scriviamo una macro per la creazione di un modello di
regressione:
• il nome della macro e provareg
• vi sono coinvolte due variabili macro: &x e &y
Finestra di Program Editor
%MACRO provareg(y, x, data=_last_);
PROC REG DATA=&data;
MODEL &y=&x;
RUN;
%MEND;
Nel seguito del programma potremo richiamare questa macro e passarle come parametri
due variabili che verranno sostituiti nel codice per la stima del modello di regressione. Se non
diamo specificazioni diverse, allora la macro considerera l’ultimo dataset creato, all’interno
del quale, naturalmente, devono esistere le variabili che vengono passate alla macro.
Finestra di Program Editor
%provareg(v1,v2);
RIFERIMENTI BIBLIOGRAFICI
Agostinelli C., Sartorelli S. (1998) Introduzione al linguaggio di Sas System, manuscript.
Agostinelli C., Sartorelli S. (1999) Introduzione al linguaggio di SAS System, Quaderno 1,
Quaderni ASID, Facolta di Scienze Statistiche, Universita di Padova, 1999.
Capiluppi C. (1997), Introduzione a Sas System, ed. Cleup, Padova.
Bianchi-Bandinelli, Bracci e La Forenza, (1989) Il sistema SAS, ed. Franco Angeli, Milano.
Sas Institute Inc., (1993) SAS Procedure Guide, Version 6, Sas Institute Inc., CARY, NC,
USA.
Sas Institute Inc., (1993) SAS Language, Version 6, Sas Institute Inc., CARY, NC, USA.
Sas Institute Inc., (1993) SAS/STAT Users Guide VOL.1, Version 6, Sas Institute Inc.,
CARY, NC, USA.
Sas Institute Inc., (1993) SAS/STAT Users Guide VOL.2, Version 6, Sas Institute Inc.,
CARY, NC, USA.