In principio SAS creava procedure e output. L’output era informe e vuoto. Poi SAS disse: “Che ci sia l’ODS”, e ci fu l’ODS. I clienti videro che l’ODS era buono, e SAS separò il calcolo dalla visualizzazione e dalla gestione dell’output.
Il paragrafo precedente semplifica eccessivamente il SAS Output Delivery System (ODS), ma la verità è che l’ODS è una potente caratteristica di SAS. Potete usare ODS per inviare tabelle e grafici SAS a varie destinazioni di output, inclusi HTML, PDF, RTF e PowerPoint. Potete controllare lo stile e gli attributi dell’output, creando così un report personalizzato. Ci sono stati centinaia di articoli e libri scritti su ODS. Un’introduzione molto basilare è Olinger (2000) “ODS for Dummies.”
Per un programmatore statistico la destinazione più utile è la destinazione OUTPUT. La destinazione OUTPUT invia una tabella o un grafico a un set di dati SAS. Di conseguenza, è possibile accedere programmaticamente a ogni elemento dell’output.
Le implicazioni della precedente affermazione sono monumentali. Non posso sopravvalutare l’importanza della destinazione OUTPUT, quindi permettetemi di ripeterla:
La destinazione ODS OUTPUT vi permette di memorizzare qualsiasi valore prodotto da qualsiasi procedura SAS. È quindi possibile leggere tale valore utilizzando un programma SAS.
La destinazione ODS OUTPUT risponde a una domanda comune che viene posta dai nuovi programmatori sui forum di discussione SAS: “Come posso ottenere una statistica in un set di dati o in una variabile macro? I passi sono i seguenti:
- Utilizza ODS TRACE ON (o la documentazione SAS) per trovare il nome della tabella ODS che contiene la statistica che vuoi.
- Utilizza l’istruzione ODS OUTPUT per specificare il nome della tabella e un nome del set di dati. La sintassi è ODS OUTPUT TableName=DataSetName. Poi eseguite la procedura per generare la tabella.
- Leggi il set di dati per ottenere il valore della statistica.
Nuovo alla programmazione #SAS? Come ottenere qualsiasi statistica in un set di dati. Click To Tweet
Trova il nome della tabella ODS
Come esempio, supponiamo che tu intenda usare PROC REG per eseguire una regressione lineare, e vuoi catturare il valore R-square in un set di dati SAS. La documentazione della procedura elenca tutte le tabelle ODS che la procedura può creare, oppure è possibile utilizzare l’istruzione ODS TRACE ON per visualizzare i nomi delle tabelle prodotte da PROC REG. I dati sono i 428 veicoli nell’insieme di dati Sashelp.Cars, che viene distribuito con SAS:
ods trace on; /* scrivere i nomi delle tabelle ODS nel log */proc reg data=Sashelp.Cars plots=none; model Horsepower = EngineSize Weight;quit;ods trace off; /* stop writing to log */
Output Added:-------------Name: FitStatisticsLabel: Fit StatisticsTemplate: Stat.REG.FitStatisticsPath: Reg.MODEL1.Fit.Horsepower.FitStatistics-------------
Guardando l’output, puoi vedere che la terza tabella contiene il valore R-square. Guardando il log di SAS, puoi vedere che il nome della terza tabella è “FitStatistics.”
Salva la tabella in un set di dati SAS
Ora che sai che il nome della tabella ODS è “FitStatistics”, usa la destinazione ODS OUTPUT per scrivere quella tabella in un set di dati SAS, come segue:
ods output FitStatistics=Output; /* il nome del set di dati è 'Output' */proc reg data=Sashelp.Cars plots=none; /* stessa chiamata di procedura */ model Horsepower = EngineSize Weight;quit; proc print data=Output noobs;run;
L’output della PROC PRINT mostra la struttura del set di dati di output. Notate che l’insieme di dati appare spesso diverso dalla tabella originale visualizzata. Il set di dati contiene colonne non stampabili (come Model e Dependent) che non appaiono nella tabella visualizzata. Il set di dati contiene anche colonne che contengono i valori numerici grezzi e i valori di carattere (formattati) delle statistiche. Le colonne cValue1 e nValue1 rappresentano le stesse informazioni, tranne che cValue1 è una colonna di caratteri mentre nValue1 è una colonna numerica. Lo stesso vale per le colonne cValue2 e nValue2. I valori dei caratteri potrebbero contenere valori formattati o arrotondati.
Leggete il valore della statistica in una variabile macro
Dall’output PROC PRINT precedente, potete vedere che il valore numerico della statistica R-square è nella prima riga ed è nella colonna nValue2. Potete quindi leggere ed elaborare quel valore usando una clausola WHERE standard. Per esempio, le seguenti dichiarazioni usano la subroutine SYMPUTX per creare una variabile macro che contiene il valore della statistica R-quadro:
data _null_;set Output;if Label2="R-Square" then call symputx("RSq", nValue2);run; %put RSq = &RSq;
RSq = 0.6201360929
Il registro SAS mostra che il valore del quadrato R è ora contenuto nella variabile macro Rsq.
Memorizzare la statistica in una variabile macro è solo un modo per utilizzare il set di dati. Potresti anche leggere le statistiche in PROC IML o PROC SQL per ulteriori calcoli, o mostrare il valore della statistica in un grafico.
L’elaborazione per gruppi: Campioni multipli e statistiche multiple
Le sezioni precedenti mostrano come salvare una singola tabella in un set di dati SAS. È altrettanto facile creare un set di dati che contenga statistiche multiple, una per ogni livello in un’analisi BY-group.
Supponiamo di voler eseguire diverse regressioni, una per ogni valore della variabile Origin, che ha i valori “Asia,” “Europa,” e “USA. La seguente chiamata a PROC SORT ordina i dati in base alla variabile Origine; i dati ordinati vengono memorizzati nell’insieme di dati CARS.
proc sort data=Sashelp.Cars out=Cars; by Origin;run;
Potete quindi specificare Origin nell’istruzione BY in PROC REG per eseguire tre analisi di regressione. Quando eseguite un’analisi BY-group, potreste non voler vedere tutti i risultati visualizzati sullo schermo del computer, specialmente se il vostro obiettivo è quello di salvare i risultati in un set di dati di output. Potete usare l’istruzione ODS EXCLUDE per sopprimere l’output di SAS.
ods exclude all; /* sopprime le tabelle sullo schermo */ods output FitStatistics=Output2; /* 'Output2' contiene i risultati per ogni gruppo BY */proc reg data=Cars plots=none; by Origin; model Horsepower = EngineSize Weight;quit;ods exclude none; /* non sopprimere più le tabelle */ proc print data=Output2 noobs; where Label2="R-Square"; var Origin Label2 nValue2;run;
L’output di PROC PRINT mostra le statistiche R-square per ogni modello. Notate che le variabili BY-group (in questo caso, Origin) sono aggiunte ai set di dati di output quando eseguite un’analisi BY-group. Ora è possibile utilizzare le statistiche nei programmi o nei grafici.
Alternative all’uso di ODS OUTPUT
Alcune procedure forniscono un’opzione alternativa per creare un set di dati di output che contiene statistiche. Controllate sempre la documentazione SAS per vedere se la procedura fornisce un’opzione che scrive statistiche comuni in un set di dati di output. Per esempio, la documentazione per l’istruzione PROC REG afferma che è possibile utilizzare l’opzione OUTEST= con l’opzione RSQUARE per ottenere un set di dati di output che contiene le stime dei parametri e altre statistiche del modello come il valore R-square. Invece, potete ottenere la statistica come segue:
proc reg data=Cars NOPRINT outest=Output3 RSQUARE; /* statistiche in 'Output3' */ by Origin; model Horsepower = EngineSize Weight;quit; proc print data=Output3 noobs; format _RSQ_ 8.6; var Origin _RSQ_; run;
Sommario
In sintesi, l’istruzione ODS OUTPUT permette di creare un set di dati che contiene qualsiasi statistica prodotta da una procedura SAS. Potete usare l’istruzione ODS OUTPUT per catturare una statistica e usarla successivamente nel vostro programma.