Na początku SAS tworzył procedury i dane wyjściowe. Dane wyjściowe były bezkształtne i puste. Następnie SAS powiedział: „Niech powstanie ODS” i powstał ODS. Klienci zobaczyli, że ODS jest dobry, a SAS oddzielił obliczenia od wyświetlania i zarządzania danymi wyjściowymi.
Poprzedni akapit nadmiernie upraszcza System dostarczania danych wyjściowych SAS (ODS), ale prawda jest taka, że ODS jest potężną funkcją SAS. Można używać ODS do wysyłania tabel i grafiki SAS do różnych miejsc docelowych, w tym HTML, PDF, RTF i PowerPoint. Można kontrolować styl i atrybuty danych wyjściowych, tworząc w ten sposób raport dostosowany do potrzeb użytkownika. Na temat ODS napisano setki artykułów i książek. Bardzo podstawowym wprowadzeniem jest Olinger (2000) „ODS for Dummies.”
Dla programisty statystycznego najbardziej użytecznym miejscem docelowym jest miejsce docelowe OUTPUT. Miejsce docelowe OUTPUT wysyła tabelę lub wykres do zbioru danych SAS. W związku z tym można programowo uzyskać dostęp do każdego elementu danych wyjściowych.
Implikacje poprzedniego stwierdzenia są monumentalne. Nie potrafię przecenić znaczenia miejsca docelowego OUTPUT, więc powtórzę to jeszcze raz:
Miejsce docelowe ODS OUTPUT umożliwia przechowywanie dowolnej wartości, która jest wytwarzana przez dowolną procedurę SAS. Wartość tę można następnie odczytać za pomocą programu SAS.
Miejsce docelowe ODS OUTPUT odpowiada na częste pytanie zadawane przez nowych programistów na forach dyskusyjnych SAS: „Jak mogę wprowadzić statystykę do zbioru danych lub do zmiennej makro?”. Kroki są następujące:
- Użyj polecenia ODS TRACE ON (lub dokumentacji SAS), aby znaleźć nazwę tabeli ODS, która zawiera żądaną statystykę.
- Użyj polecenia ODS OUTPUT, aby określić nazwę tabeli i nazwę zbioru danych. Składnia to ODS OUTPUT TableName=DataSetName. Następnie uruchom procedurę, aby wygenerować tabelę.
- Odczytaj zbiór danych, aby uzyskać wartość statystyki.
Nowy w programowaniu #SAS? Jak uzyskać dowolną statystykę do zbioru danych. Click To Tweet
Znajdź nazwę tabeli ODS
Jako przykład załóżmy, że zamierzasz użyć PROC REG do wykonania regresji liniowej i chcesz przechwycić wartość R-kwadrat w zbiorze danych SAS. Dokumentacja procedury wymienia wszystkie tabele ODS, które procedura może utworzyć, lub można użyć polecenia ODS TRACE ON, aby wyświetlić nazwy tabel, które są tworzone przez PROC REG. Dane to 428 pojazdów ze zbioru danych Sashelp.Cars, który jest dystrybuowany z SAS:
ods trace on; /* write ODS table names to 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-------------
Patrząc na dane wyjściowe, można zauważyć, że trzecia tabela zawiera wartość R-kwadrat. Patrząc na dziennik SAS, można zobaczyć, że nazwa trzeciej tabeli to „FitStatistics.”
Zapisz tabelę w zbiorze danych SAS
Teraz, gdy wiesz, że nazwa tabeli ODS to „FitStatistics”, użyj miejsca docelowego ODS OUTPUT, aby zapisać tę tabelę w zbiorze danych SAS, jak poniżej:
ods output FitStatistics=Output; /* nazwa zbioru danych to 'Output' */proc reg data=Sashelp.Cars plots=none; /* to samo wywołanie procedury */ model Horsepower = EngineSize Weight;quit; proc print data=Output noobs;run;
Wyjście z PROC PRINT pokazuje strukturę zbioru danych wyjściowych. Zauważ, że zestaw danych często wygląda inaczej niż oryginalnie wyświetlona tabela. Zestaw danych zawiera kolumny niedrukujące (takie jak Model i Zależna), które nie pojawiają się w wyświetlonej tabeli. Zestaw danych zawiera również kolumny, które zawierają surowe wartości liczbowe i (sformatowane) wartości znakowe statystyk. Kolumny cValue1 i nValue1 reprezentują te same informacje, z tą różnicą, że cValue1 jest kolumną znakową, podczas gdy nValue1 jest kolumną numeryczną. To samo dotyczy kolumn cValue2 i nValue2. Wartości znakowe mogą zawierać wartości sformatowane lub zaokrąglone.
Odczytaj wartość statystyki do zmiennej makro
Z poprzedniego wyjścia PROC PRINT widać, że wartość liczbowa statystyki R-kwadrat znajduje się w pierwszym wierszu i w kolumnie nValue2. Można zatem odczytać i przetworzyć tę wartość za pomocą standardowej klauzuli WHERE. Na przykład poniższe polecenia używają podprogramu SYMPUTX do utworzenia zmiennej makro, która zawiera wartość statystyki R-kwadrat:
data _null_;set Output;if Label2="R-Square" then call symputx("RSq", nValue2);run; %put RSq = &RSq;
RSq = 0.6201360929
W dzienniku SAS widać, że wartość R-kwadrat jest teraz zawarta w zmiennej makro Rsq.
Przechowywanie statystyki w zmiennej makro to tylko jeden ze sposobów wykorzystania zbioru danych. Można również wczytać statystykę do PROC IML lub PROC SQL w celu dalszych obliczeń lub pokazać wartość statystyki na wykresie.
Przetwarzanie w grupach: Wiele próbek i wiele statystyk
W poprzednich rozdziałach pokazano, jak zapisać pojedynczą tabelę do zbioru danych SAS. Równie łatwo jest utworzyć zbiór danych zawierający wiele statystyk, po jednej dla każdego poziomu w analizie typu BY-group.
Załóżmy, że chcemy uruchomić kilka regresji, po jednej dla każdej wartości zmiennej Origin, która ma wartości „Azja”, „Europa” i „USA”. Następujące wywołanie PROC SORT sortuje dane według zmiennej Origin.posortowane dane są przechowywane w zbiorze danych CARS.
proc sort data=Sashelp.Cars out=Cars; by Origin;run;
Można następnie określić Origin w instrukcji BY w PROC REG, aby przeprowadzić trzy analizy regresji. Po uruchomieniu analizy grupowej BY, użytkownik może nie chcieć widzieć wszystkich wyników wyświetlanych na ekranie komputera, zwłaszcza jeśli jego celem jest zapisanie wyników w zestawie danych wyjściowych. Można użyć polecenia ODS EXCLUDE, aby wyłączyć wyjście SAS.
ods exclude all; /* usuń tabele na ekran */ods output FitStatistics=Output2; /* 'Output2' zawiera wyniki dla każdej grupy BY */proc reg data=Cars plots=none; by Origin; model Horsepower = EngineSize Weight;quit;ods exclude none; /* no longer suppress tables */ proc print data=Output2 noobs; where Label2="R-Square"; var Origin Label2 nValue2;run;
Wyjście z PROC PRINT pokazuje statystyki R-square dla każdego modelu. Zauważ, że zmienne BY-group (w tym przypadku Origin) są dodawane do zestawów danych wyjściowych, gdy przeprowadzasz analizę BY-group. Można teraz użyć tych statystyk w programach lub na wykresach.
Alternatywy dla używania ODS OUTPUT
Niektóre procedury zapewniają alternatywną opcję tworzenia zbioru danych wyjściowych, który zawiera statystyki. Zawsze należy sprawdzić w dokumentacji SAS, czy procedura zapewnia opcję, która zapisuje typowe statystyki do wyjściowego zbioru danych. Na przykład dokumentacja instrukcji PROC REG stwierdza, że można użyć opcji OUTEST= z opcją RSQUARE, aby uzyskać wyjściowy zbiór danych, który zawiera oszacowania parametrów i inne statystyki modelu, takie jak wartość R-kwadrat. Dlatego w tym przykładzie nie trzeba używać instrukcji ODS OUTPUT, aby skierować tabelę FitStatistics do zbioru danych. Zamiast tego można uzyskać statystykę w następujący sposób:
proc reg data=Cars NOPRINT outest=Output3 RSQUARE; /* statystyka w 'Output3' */ by Origin; model Horsepower = EngineSize Weight;quit; proc print data=Output3 noobs; format _RSQ_ 8.6; var Origin _RSQ_;run;
Podsumowanie
Podsumowując, instrukcja ODS OUTPUT umożliwia utworzenie zbioru danych, który zawiera dowolną statystykę tworzoną przez procedurę SAS. Można użyć instrukcji ODS OUTPUT, aby przechwycić statystykę i użyć jej później w swoim programie.
.