SAS 4GL - Google

SAS 4GL

Z Wikipedii

Skocz do: nawigacji, szukaj

SAS 4GL (ang. SAS Institute 4th Generation Language - język 4 generacji Instytutu SAS) - język programowania pakietu statystycznego SAS.

SAS 4GL wbrew nazwie, sugerującej wysoki poziom abstrakcji, nie jest językiem obiektowym, nie posiada nawet definiowalnych przez użytkownika procedur w sensie klasycznych języków programowania (zamiast nich dostępny jest rozbudowany system makr). Posiada jednak wbudowane polecenia, zwane tutaj procedurami, realizujące potężny zasób algorytmów statystyki i analizy danych. Dobrze radzi sobie z dużymi zbiorami danych o milionach rekordów. Umożliwia pracę w trybie klient-serwer.

Spis treści

[edytuj] Typy danych

SAS posiada dwa typy danych:

  • liczba rzeczywista
  • tekst

Długość tekstu oraz liczbę bajtów zmiennej liczbowej można ustawiać odpowiednimi instrukcjami. Można także ustawić tzw. format - sposób prezentacji zmiennej na ekranie oraz informat - sposób ładowania zmiennej z pliku tekstowego.

Ponadto w data stepie (opisanym dalej) można grupować zmienne w tablice.

W wersji 9 wprowadzono tablice hashujÄ…ce.

[edytuj] Data step

Data step jest blokiem instrukcji odpowiedzialnym za przetwarzanie danych krok po kroku. Najprostsza jego forma:

data tabela_wynikowa;
        set tabela_wejściowa;
        ... przetwarzanie ...
run;

Gdzie "... przetwarzanie ..." oznacza dowolny ciąg instrukcji operujących na jednym wierszu z tabeli wejściowej i produkujących jeden wiersz tabeli wyjściowej.

run jest instrukcją kończącą blok data step.

Przetwarzając data step SAS utrzymuje w pamięci wektor bieżących wartości zmiennych. Instrukcje są wykonywane kolejno od początku do słowa run

[edytuj] Set

Natrafienie w data stepie na słowo kluczowe

set tabela1 [tabela2 ...];

powoduje załadowanie do wektora zmiennych kolejnego wiersza z tabeli tabela1. Jeśli zmienna o tej samej nazwie co dana kolumna w tabeli już istnieje, jest nadpisywana. Kiedy skończy się tabela 1, ładowane są dane z tabeli 2, itd. Próba załadowania danych, kiedy skończą się wiersze we wszystkich tabelach powoduje przerwanie działania data stepu (i jest to najczęstszy sposób jego zakończenia).

W data stepie może być wiele instrukcji set. Każda z nich stanowi osobny kursor.

Można sprawdzić, czy bieżący wiersz jest ostatnim:

set tabela1 [tabela2 ...] end=zmienna;

Wartość zadanej zmiennej zostanie ustawiona na 1 jeśli przetwarzany jest ostatni wiesz ze wszystkich tabel. W przeciwnym wypadku wyniesie 0.

Można też sprawdzać, która tabela jest przetwarzana podając po niej w nawiasach (in=zmienna). Zadana zmienna jest wówczas ustawiana na 1, gdy przetwarzany jest jakikolwiek wiersz z tej tabeli.

[edytuj] Przypisanie

zmienna=wyrażenie;

przypisuje wartość do danej zmiennej, dodając ją (jeśli potrzeba) do wektora zmiennych.

[edytuj] If

if warunek then instrukcja1; [else instrukcja2;]

wykonuje instrukcję 1 gdy warunek jest spełniony, i 2 jeśli nie jest.

if warunek;

sprawdza warunek, i jeśli nie jest spełniony wraca na początek data stepu, bez dalszego przetwarzania danych.

[edytuj] Do..End

Blok kodu można ująć pomiędzy do i end. Jest wtedy traktowany jak jedna instrukcja.

do;
    ....
end;

Instrukcje te pozwalają też na tworzenie pętli, np.:

do i=1 to k by 2;
    do a=i to 0 by -1;
        do u=a to 5;
            ....
        end;
    end;
end;

do while(a=b);
    ....
end;

[edytuj] By

Instrukcja

by zmienna1 [zmienna2...];

jest globalna dla całego data stepu. Nie ma znaczenia w którym miejscu wystąpi. By powoduje zmianę działania instrukcji set (a także opisanej dalej merge) - dane będą wczytywane nie najpierw z pierwszej tabeli, potem z drugiej itd, lecz w kolejności według zmiennej 1, następnie (jeśli wartości zmiennej1 były równe) według zmiennej 2, itd.

Jeśli którakolwiek tabela nie jest posortowana ani poindeksowana według tych zmiennych, zostanie zgłoszony błąd.

Jeśli użyto instrukcji by, można stosować konstrukcje:

  • first.zmienna1 - równa 1 gdy dany wiersz jest pierwszym przetwarzanym, albo zmienna1 wÅ‚aÅ›nie zmieniÅ‚a wartość.
  • last.zmienna1 - równa 1 gdy dany wiersz jest ostatnim przetwarzanym, albo zmienna1 w nastÄ™pnym wierszu zmieni wartość.
  • first.zmienna2 - równa 1 gdy dany wiersz jest pierwszym przetwarzanym, albo zmienna1 lub zmienna2 wÅ‚aÅ›nie zmieniÅ‚y wartość.
  • last.zmienna2 - równa 1 gdy dany wiersz jest ostatnim przetwarzanym, albo zmienna1 lub zmienna2 w nastÄ™pnym wierszu zmieni wartość.

itd.

[edytuj] Merge

Instrukcja merge działa tak jak set, jednak wczytuje jednocześnie po jednym wierszu z każdej tabeli. Służy do łączenia danych z różnych źródeł.

Jeśli nie użyto by, wiersze są łączone na zasadzie: pierwszy wiersz każdej tabeli z pierwszym wierszem każdej innej, drugi z drugim, itd.

Jeśli użyto instrukcji by, wiersze będą łączone według kluczy wymienionych w by. Jeśli w którejś z tabel zabraknie wiersza o identyfikatorze występującym w jakiejś innej tabeli, jej zmienne zostaną wypełnione wartością pustą, oznaczaną w SAS-ie przez kropkę. (in=zmienna) użyte przy tej tabeli zwróci wówczas zero.

Merge z by działa tak jak full join w języku SQL. Używając konstrukcji (in=zmienna) oraz if możemy zasymulować "join" left join albo right join:

data wynik;
        merge tabela1(in=in1) tabela2;
        by id;
        if in1; 
run;

Równoważny kod SQL:

create table wynik as
        select *
                from tabela1 as a
                left join tabela2 as b
                on a.id=b.id
                order by id;

[edytuj] Output

Instrukcja output powoduje umieszczenie jednego wiersza w tabeli wynikowej. Jeśli w data stepie nie ma ani jednej instrukcji output, zostanie ona domyślnie dodana na końcu.

O tym, które zmienne z wektora zmiennych znajdą się w zbiorze wynikowym możemy zadecydować używając instrukcji keep i drop:

keep zmienna1 [zmienna2 ...];
drop zmienna1 [zmienna2 ...];
output;
  1. Jeśli nie użyjemy żadnego keep, domyślnie brane są wszystkie zmienne z wektora zmiennych.
  2. Jeśli użyto choć jednego keep gdziekolwiek w data stepie, brane są wszystkie zmienne wymienione w którejkolwiek instrukcji keep.
  3. Jeśli użyto jednej, lub wielu instrukcji drop, na koniec odrzucane są zmienne wymienione w tych instrukcjach.

Data step może wytwarzać więcej niż jedną tabelę na raz. Wówczas wszystkie tabele muszą być wymienione we frazie data, a po output możemy podać, do których tabel ma trafić wiersz wyniku. keep i drop dotyczą wszystkich tabel, można jednak różnicować zmienne trafiające do każdej z nich, za pomocą fraz (keep=zmienna1 [zmienna2...]) i (drop=zmienna1 [zmienna2...]) umieszczanych po nazwie tabeli w instrukcji data.

[edytuj] Run

Instrukcja występująca na końcu kodu data stepu. Powoduje przejście z powrotem na początek data stepu. Kasuje przy tym wektor zmiennych (wypełnia go wartościami brakującymi). Aby uchronić zmienną przed skasowaniem, można ją wymienić w instrukcji:

retain lista zmiennych;

umieszczonej gdziekolwiek w data stepie. W retain można też podać początkowe wartości zmiennych.

[edytuj] Procedury

Słowo procedura w SAS-ie znaczy co innego niż w innych językach. Procedura nie jest definiowana przez użytkownika, lecz zaszyta w systemie i możliwa tylko do wywołania. Ich składnia zależy od konkretnej procedury. Spośród kilkuset podano poniżej kilka najczęściej używanych. Każda z nich ma mnóstwo opcji, które nie będą tu już opisywane.

[edytuj] proc sort

Sortowanie tabeli.

proc sort data=nazwa_tabeli;
        by zmienna1 [zmienna2 ...];
run;

[edytuj] proc sql

Umożliwia użycie w SAS wstawek SQL.

proc sql;
        dowolny kod sql
quit;

[edytuj] proc freq

Wyświetla ile razy wystąpiła dana wartość danej zmiennej, albo kombinacja wartości kilku zmiennych.

Przykład:

proc freq data=tabela;
        tables zmienna1 zmienna2 zmienna3*zmienna4;
run;


[edytuj] proc reg

Regresja liniowa

proc reg data=tabela;
        model zmienna_objaśniana=zmienna_objaśniająca1 zmienna_objaśniająca2 ...;
run;

[edytuj] Kilka innych procedur

[edytuj] Makrodefinicje

Prawdziwym odpowiednikiem procedur w SASie nie są instrukcje PROC, lecz makrodefinicje. SAS posiada bardzo rozbudowany preprocesor, który pozwala m.in. dynamicznie zmieniać treść programu w trakcie jego wykonania oraz rekurencyjnie zagnieżdżać makra.

[edytuj] Krytyka

SAS w środowisku statystyków jest często chwalony za swe rozbudowane możliwości.

Z drugiej strony kilka jego cech budzi raczej krytykÄ™.

  • JÄ™zyk ma wiÄ™cej wspólnego ze stylem programowania z lat 60., w takich jÄ™zykach jak Fortran, czy Basic, niż ze współczesnymi koncepcjami programistycznymi. Posiada instrukcje poke, peek, czy goto, ale nie posiada zwykÅ‚ych procedur i obiektów.
  • SAS 4GL jest czasem bardzo zagmatwany i posiada peÅ‚no wyjÄ…tków. PrzykÅ‚ady:
  • instrukcja
label zmienna='xyz';
nada zmiennej etykietÄ™ 'xyz', ale instrukcja:
label zmienna='';
nie usunie tej etykiety. Żeby usunąć etykietę należy napisać pomiędzy apostrofami spację:
label zmienna=' ';
  • pÄ™tli do...end można używać tylko w data stepie. Poza data stepem można używać pÄ™tli %do...%end ale tylko w obrÄ™bie słów kluczowych %macro...%mend. Poza definicjÄ… makra w ogóle nie da siÄ™ używać pÄ™tli, przez co kod czÄ™sto sztucznie wkÅ‚ada siÄ™ do makra.
  • Ostatnim punktem krytyki jest polityka firmy SAS, która nie sprzedaje swojego oprogramowania, a jedynie wypożycza je na okreÅ›lony czas.

Przedstawiciele klubów już u prezydenta
Marek Kuchciński (PiS), Grzegorz Dolniak (PO), Stanisław Żelichowski (PSL) i Jerzy Szmajdziński (Lewica) przyjechali przed godz. 13.30 do Pałacu Prezydenckiego na spotkanie z prezydentem Lechem Kaczyńskim.
Żołnierze wrócą do aresztu?
Czy trzej wypuszczeni na wolność żołnierze związani ze sprawą ostrzału w Nangar Khel wrócą za kratki? Jak dowiedział się reporter "Teraz MY" TVN Prokuratura Wojskowa z Poznania złożyła dziś odwołanie od decyzji sądu uchylającej Jackowi J., Robertowi B. i Damianowi L. areszt tymczasowy.
Szarama: nie transmituje siÄ™ prac komisji, gdy sÄ… korzystne dla PiS
Członek sejmowej komisji śledczej badającej okoliczności śmierci Barbary Blidy Wojciech Szarama (PiS) zaapelował o jak najobszerniejsze relacje medialne z prac tej komisji. Jego zdaniem TVP i TVN24 nie relacjonują jej posiedzeń, kiedy zeznania świadków są korzystne dla PiS.
Rodzina Olewników może otrzymać ochronę
Komendant główny policji Andrzej Matejuk zapowiada, że jeśli rodzina Olewników wystąpi do policji o ochronę, to ją otrzyma.
Macierewicz: Szczepański był dobrowolnym współpracownikiem WSI
Szef sejmowego biura prasowego Jarosław Szczepański był dobrowolnym tajnym współpracownikiem Wojskowych Służb Informacyjnych - zeznał Antoni Macierewicz, b. szef komisji weryfikacyjnej WSI.
Linki: Strona g³ówna