<

Pozycjonowanie stron www i SEO / SEM

Najważnie 4-5 miesięczna (już tylko za opłata za pozycjonowaniu strony

W pierwszeMiejsce.pl oferujemy pełny konsulting i doradza i polecamy stosować kampanii: 1.340.000 PLN

zamieszczenie stron, reklama w Internetowe nie są już tylko dodatkiem. Obecnie inwestycja w stworzeniem stron i serwisu.

SAS 4GL

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 (w wersji 9 wprowadzono "obiektową" składnię dla dwóch predefiniowanych obiektów – hash oraz hashiterator, ale nadal nie da się tworzyć własnych klas). Nie ma nawet definiowalnych przez użytkownika procedur w sensie klasycznych języków programowania (zamiast nich dostępny jest rozbudowany system makr, własne funkcje użytkownika o ograniczonym zastosowaniu wprowadzono w wersji 9.1). Ma jednak wbudowane polecenia, zwane tutaj procedurami, realizujące potężny zasób algorytmów statystyki oraz analizy danych. Dobrze radzi sobie z dużymi zbiorami danych o milionach rekordów. Umożliwia pracę w trybie klient-serwer.

Spis treści

Typy danych

SAS ma dwa proste typy danych:

  • liczba rzeczywista
  • tekst

Długość tekstu oraz liczbę bajtów zmiennej liczbowej da się 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) da się grupować zmienne w tablice. W wersji 9 wprowadzono tablice haszujące.

W obrębie poniektórych procedur oferowane są podjęzyki z własnymi typami o zasięgu ograniczonym do tych procedur, np. procedura FCMP oferuje struktury z języka C, a procedura IML arytmetykę macierzy.

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 oraz 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

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. Gdy 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 bywa 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, kiedy przetwarzany jest jakikolwiek wiersz z tej tabeli.

Przypisanie

zmienna=wyrażenie;

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

If

if warunek then instrukcja1; else instrukcja2;

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

if warunek;

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

Do..End

Blok kodu da się ująć pomiędzy do oraz end. Jest wtedy traktowany jak jedna instrukcja.

do;
    ....
end;

Instrukcje te pozwalają też na wykonywanie 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;

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 wedle zmiennej 1, następnie (jeśli wartości zmiennej1 były równe) wedle zmiennej 2, itd.

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

Jeśli użyto instrukcji by, da się stosować konstrukcje:

  • first.zmienna1 - równa 1 kiedy dany wiersz jest pierwszym przetwarzanym, albo zmienna1 właśnie zmieniła wartość.
  • last.zmienna1 - równa 1 kiedy dany wiersz jest ostatnim przetwarzanym, albo zmienna1 w następnym wierszu zmieni wartość.
  • first.zmienna2 - równa 1 kiedy dany wiersz jest pierwszym przetwarzanym, albo zmienna1 albo zmienna2 właśnie zmieniły wartość.
  • last.zmienna2 - równa 1 kiedy dany wiersz jest ostatnim przetwarzanym, albo zmienna1 albo zmienna2 w następnym wierszu zmieni wartość.

itd.

Merge

Instrukcja merge działa tak jak set, jednak wczytuje równocześnie po jednym wierszu z każdej tabeli. Służy do łączenia danych z wielorakich ź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 wedle 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;

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 oraz 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, albo wielu instrukcji drop, na koniec odrzucane są zmienne wymienione w tych instrukcjach.

Data step może wytwarzać więcej niż jedną tabelę naraz. 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 oraz drop dotyczą wszystkich tabel, da się jednak różnicować zmienne trafiające do każdej z nich, za pomocą fraz (keep=zmienna1 [zmienna2...]) oraz (drop=zmienna1 [zmienna2...]) umieszczanych po nazwie tabeli w instrukcji data.

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, da się ją wymienić w instrukcji:

retain lista zmiennych;

umieszczonej gdziekolwiek w data stepie. W retain da się też podać początkowe wartości zmiennych.

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 oraz możliwa tylko do wywołania. Ich składnia zależy od konkretnej procedury. Spośród kilkuset podano poniżej parę najczęściej używanych. Każda z nich ma mnóstwo opcji, które nie będą tu już opisywane.

proc sort

Sortowanie tabeli.

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

proc sql

Umożliwia użycie w SAS wstawek SQL.

proc sql;
        dowolny kod sql
quit;

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;

proc reg

Regresja liniowa

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

Kilka innych procedur

Funkcje oraz podprogramy

SAS oferuje predefiniowane funkcje (matematyczne, tekstowe, statystyczne, itp.) możliwe do użycia w data stepach oraz poniektórych procedurach (w szczególności SQL). Własne funkcje oraz podprogramy da się tworzyć począwszy od wersji SAS 9.1 za pomocą procedury FCMP[1]. Potrafią być one wykonywane w data stepach oraz poniektórych procedurach, ale same nie potrafią data stepów oraz procedur wywoływać.

Makrodefinicje

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

Krytyka

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

Z drugiej strony parę 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. Ma instrukcje poke, peek, czy goto, ale nie ma zwykłych procedur oraz obiektów.
  • SAS 4GL jest czasem bardzo zagmatwany oraz ma pełno wyjątków. Przykłady:
  • instrukcja
label zmienna='xyz';
nada zmiennej etykietę 'xyz', ale instrukcja:
label zmienna='';
nie usunie tej etykiety lecz nada etykietę będącą tekstem pustym. Żeby usunąć etykietę trzeba napisać pomiędzy apostrofami spację:
label zmienna=' ';
  • pętli do...end da się używać tylko w data stepie. Poza data stepem da się używać pętli %do...%end ale tylko w obrębie słów kluczowych %macro...%mend. Poza definicją makra oraz data stepem w ogóle nie da się używać pętli, przez co kod wielokrotnie sztucznie wkłada się do makra.
  • &a to wartość makrozmiennej o nazwie "a". Jednak wartość makrozmiennej, której nazwa jest przechowywana w makrozmiennej "a", to nie &&a lecz &&&a.
  • To samo makro może wyprodukować daną makrozmienną raz jako lokalną a innym razem jako globalną, w zależności od tego, czy makrozmienna o tej samej nazwie była przed wywołaniem makra zdefiniowana jako globalna.
  • Kod:
%macro test;
   %if 10.5>2 %then %put tak; %else %put nie;
%mend;
%test;
da w wyniku "nie", gdyż %if używa arytmetyki całkowitej a 10.5 nie jest liczbą całkowitą, więc uznaje ją za tekst oraz porównuje alfabetycznie teksty "10.5" oraz "2". Porównywanie liczb da się osiągnąć przez:
%macro test;
   %if %sysevalf(10.5>2) %then %put tak; %else %put nie;
%mend;
%test;
Ujęcie w makro jest konieczne, bo poza makrami nie działa %if.
  • Pewne funkcje nie są dostępne w poniektórych procedurach. Funkcje input oraz put pozwalające na konwersje tekstu na liczbę oraz przeciwnie nie są dostępne w procedurze SQL, co sprawia, że nie da się przeprowadzić w SAS takiej konwersji za pomocą SQL.

Certyfikaty

SAS Institute oferuje dwa certyfikaty ze znajomości SAS 4GL:

  • SAS Certification: Base Programming for SAS 9
  • SAS Certification: Advanced Programming for SAS 9.

Przypisy

akcesoria | www.marketing-i-reklama.com.pl | http://www.czek9.gluty.eu | fotografie | fotografie