Blogs

In het begin creëerde SAS procedures en output. De uitvoer was vormloos en leeg. Toen zei SAS: “Laat er ODS zijn”, en er was ODS.Klanten zagen dat ODS goed was, en SAS scheidde de berekening van de weergave en het beheer van de uitvoer.

De voorgaande alinea overdreven vereenvoudigt het SAS Output Delivery System (ODS), maar de waarheid is dat ODS een krachtige functie van SAS is. U kunt ODS gebruiken om SAS-tabellen en -grafieken naar verschillende uitvoerbestemmingen te sturen, zoals HTML, PDF, RTF en PowerPoint. U kunt de stijl en de attributen van de uitvoer bepalen en zo een rapport op maat maken. Er zijn honderden artikelen en boeken over ODS geschreven. Een zeer eenvoudige inleiding is Olinger (2000) “ODS for Dummies.”

Voor een statistisch programmeur is de meest nuttige bestemming de OUTPUT-bestemming. De OUTPUT-bestemming stuurt een tabel of grafiek naar een SAS-gegevensverzameling. Bijgevolg kunt u programmatisch toegang tot elk element van de output.

De implicaties van de vorige verklaring zijn monumentaal. Ik kan niet genoeg benadrukken het belang van de OUTPUT bestemming, dus laat me het nog een keer zeggen:

De ODS OUTPUT bestemming stelt u in staat om elke waarde die wordt geproduceerd door een SAS-procedure op te slaan. U kunt die waarde vervolgens lezen met behulp van een SAS-programma.

De ODS OUTPUT-bestemming beantwoordt een veelgestelde vraag die door nieuwe programmeurs op SAS-discussieforums wordt gesteld: “Hoe kan ik een statistiek in een dataset of in een macrovariabele krijgen?” De stappen zijn als volgt:

  1. Gebruik ODS TRACE ON (of de SAS documentatie) om de naam van de ODS tabel te vinden die de statistiek bevat die u wilt.
  2. Gebruik het ODS OUTPUT statement om de tabelnaam en een datasetnaam op te geven. De syntaxis is ODS OUTPUT TableName=DataSetName. Voer vervolgens de procedure uit om de tabel te genereren.
  3. Lees de dataset om de waarde van de statistiek te verkrijgen.

Nieuw in #SAS programmeren? Hoe krijg je een willekeurige statistiek in een dataset. Click To Tweet

Vind de naam van de ODS-tabel

Als voorbeeld, stel dat u van plan bent PROC REG te gebruiken om een lineaire regressie uit te voeren, en u wilt de R-square-waarde vastleggen in een SAS-gegevensreeks. De documentatie voor de procedure geeft een lijst van alle ODS-tabellen die de procedure kan maken, of u kunt de ODS TRACE ON-instructie gebruiken om de tabelnamen weer te geven die door PROC REG worden geproduceerd. De gegevens zijn de 428 voertuigen in de gegevensreeks Sashelp.Cars, die met SAS wordt gedistribueerd:

ods trace on; /* schrijf ODS-tabelnamen naar log */proc reg data=Sashelp.Cars plots=none; model Horsepower = EngineSize Weight;quit;ods trace off; /* stoppen met schrijven naar log */

odsoutput1

Output Added:-------------Name: FitStatisticsLabel: Fit StatisticsTemplate: Stat.REG.FitStatisticsPath: Reg.MODEL1.Fit.Horsepower.FitStatistics-------------

Als u naar de uitvoer kijkt, kunt u zien dat de derde tabel de R-kwadraatwaarde bevat. Als u naar het SAS-logboek kijkt, ziet u dat de naam van de derde tabel “FitStatistics.”

Sla de tabel op in een SAS-dataset

Nu u weet dat de naam van de ODS-tabel “FitStatistics” is, gebruikt u de ODS OUTPUT-bestemming om die tabel naar een SAS-dataset te schrijven, als volgt:

ods output FitStatistics=Output; /* de naam van de dataset is 'Output' */proc reg data=Sashelp.Cars plots=none; /* dezelfde procedure-aanroep */ model Horsepower = EngineSize Weight;quit; proc print data=Output noobs;run;

odsoutput2

De uitvoer van PROC PRINT toont de structuur van de uitvoergegevensreeks. Merk op dat de gegevensverzameling er vaak anders uitziet dan de oorspronkelijk weergegeven tabel. De gegevensverzameling bevat niet-afdrukkolommen (zoals Model en Afhankelijke) die niet voorkomen in de weergegeven tabel. De gegevensset bevat ook kolommen die de ruwe numerieke waarden en de (geformatteerde) tekenwaarden van de statistieken bevatten. De kolommen cValue1 en nValue1 geven dezelfde informatie weer, behalve dat de cValue1 een karakterkolom is terwijl nValue1 een numerieke kolom is. Hetzelfde geldt voor de kolommen cValue2 en nValue2. De tekenwaarden kunnen geformatteerde of afgeronde waarden bevatten.

Leest de waarde van de statistiek in een macrovariabele

U ziet in de vorige PROC PRINT uitvoer dat de numerieke waarde van de R-square statistiek in de eerste rij staat en in de nValue2 kolom. U kunt die waarde dus lezen en verwerken met behulp van een standaard WHERE-clausule. In de volgende opdrachten wordt bijvoorbeeld de subroutine SYMPUTX gebruikt om een macrovariabele te maken die de waarde van de R-kwadraatstatistiek bevat:

data _null_;set Output;if Label2="R-Square" then call symputx("RSq", nValue2);run; %put RSq = &RSq;

RSq = 0.6201360929

Het SAS-logboek laat zien dat de R-kwadraatwaarde nu is opgenomen in de macrovariabele Rsq.

Het opslaan van de statistiek in een macrovariabele is slechts één manier om de gegevensreeks te gebruiken. U zou de statistiek ook in PROC IML of PROC SQL kunnen inlezen voor verdere berekeningen, of de waarde van de statistiek in een grafiek kunnen tonen.

BY-groep verwerking: Meerdere steekproeven en meerdere statistieken

De vorige paragrafen laten zien hoe u een enkele tabel in een SAS-gegevensverzameling opslaat. Het is net zo eenvoudig om een gegevensverzameling te maken die meerdere statistieken bevat, een voor elk niveau in een BY-groepsanalyse.

Voorstel dat u verschillende regressies wilt uitvoeren, een voor elke waarde van de variabele Origin, die de waarden “Azië”, “Europa” en “VS” heeft. De volgende aanroep van PROC SORT sorteert de gegevens op de variabele Oorsprong. De gesorteerde gegevens worden opgeslagen in de CARS-gegevensreeks.

proc sort data=Sashelp.Cars out=Cars; by Origin;run;

U kunt vervolgens Origin opgeven in de BY-instructie in PROC REG om drie regressieanalyses uit te voeren. Wanneer u een BY-groepsanalyse uitvoert, wilt u misschien niet alle resultaten op het computerscherm zien, vooral niet als het de bedoeling is de resultaten op te slaan in een uitvoergegevensset. U kunt de ODS EXCLUDE-instructie gebruiken om SAS-uitvoer te onderdrukken.

ods exclude all; /* tabellen naar scherm onderdrukken */ods output FitStatistics=Output2; /* 'Output2' bevat resultaten voor elke BY-groep */proc reg data=Cars plots=none; by Origin; model Horsepower = EngineSize Weight;quit;ods exclude none; /* tabellen niet langer onderdrukken */ proc print data=Output2 noobs; where Label2="R-Square"; var Origin Label2 nValue2;run;

odsoutput3

De uitvoer van PROC PRINT toont de R-square statistieken voor elk model. Merk op dat de BY-groepvariabelen (in dit geval Origin) worden toegevoegd aan de uitvoergegevensreeksen wanneer u een BY-groepanalyse uitvoert. U kunt de statistieken nu gebruiken in programma’s of grafieken.

Alternatieven voor het gebruik van ODS OUTPUT

Sommige procedures bieden een alternatieve optie voor het maken van een uitvoergegevensset die statistieken bevat. Raadpleeg altijd de SAS-documentatie om te zien of de procedure een optie biedt die veelgebruikte statistieken naar een uitvoergegevensverzameling schrijft. In de documentatie voor het PROC REG statement staat bijvoorbeeld dat u de OUTEST= optie met de RSQUARE optie kunt gebruiken om een uitvoergegevensverzameling te verkrijgen die de parameterschattingen en andere modelstatistieken zoals de R-kwadraatwaarde bevat.Voor dit voorbeeld hoeft u dus niet het ODS OUTPUT statement te gebruiken om de FitStatistics tabel naar een gegevensverzameling te leiden. In plaats daarvan kunt u de statistiek als volgt verkrijgen:

proc reg data=Cars NOPRINT outest=Output3 RSQUARE; /* statistieken in 'Output3' */ by Origin; model Horsepower = EngineSize Weight;quit; proc print data=Output3 noobs; format _RSQ_ 8.6; var Origin _RSQ_;run;

odsoutput4

Samenvatting

In het kort kunt u met het ODS OUTPUT-commando een gegevensreeks maken die elke statistiek bevat die door een SAS-procedure wordt geproduceerd. U kunt de ODS OUTPUT-instructie gebruiken om een statistiek vast te leggen en deze later in uw programma te gebruiken.

Tags Aan de slag

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.