Wprowadzenie do programowania w SAS-ie oraz estymacji rozkładów Henryk.Maciejewski@pwr.wroc.pl 1 Plan Co to jest SAS System Moduły Środowisko Organizacja danych przetwarzanych w SAS Programowanie w języku SAS 4GL Estymacja parametryczna rozkładów zmiennych losowych 2
Co to jest SAS System Historycznie SAS = Statistical Analysis System Obecnie (a) platforma do budowania systemów wspomagania decyzji (DSS) (zbiór modułów do analizy danych), (b) zbiór specjalizowanych aplikacji DSS Przykładowe moduły Base SAS język do przetwarzania danych, procedury analityczne) STAT procedury analizy statystycznej ACCESS dostęp do danych w różnych formatach (DBMS) GRAPH AF, webaf środowiska budowania aplikacji OLAP EIS... OR, QC, ETS,... specjalizowane procedury (badania operacyjne, niezawodność i kontrola jakości, szeregi czasowe, etc. Enterprise Miner aplikacja data mining Data Warehouse Administrator 3 Środowisko programu SAS MVA (MultiVendor Architecture): programy SAS wykonują się na VMS, CMS, OS/390, Unix, Windows, OS/2 bez modyfikacji Dane przetwarzane przez programy SAS: Pliki SAS (SAS files) Np. SAS data sets, views, MDDBs Które przechowywane są w bibliotekach SAS (SAS libraries) Referencja (LIBREF) do folderu, kartoteki itp. systemu operacyjnego, np. LIBNAME projekt c:\dane\projekt ; 4
Biblioteki (SAS Libraries) Biblioteki tworzone automatycznie przez SAS SASHELP SASUSER WORK -- SAS system files -- user profile files -- Biblioteka tymczasowa (pozostałe są permanentne) Odwołania do plików SAS kwalifikowane nazwy libraryname.filename, e.g., projekt.dane dane -- plik w bibliotece projekt -- plik w bibliotece WORK 5 Pliki danych SAS (SAS Data Sets) SAS data sets, dwa typy: DATA tablica fizycznie przechowująca dane VIEW kod (query), który tworzy logiczny data set Konwencje nazw Wiersze nazywają się obserwacjami Kolumny nazywają się zmiennymi (variables) SAS data set składa się z: Deskryptora - zawiera atrybuty data set-u i jego zmiennych Części zawierającej dane 6
Pliki danych SAS (SAS Data Sets) Wyświetlanie deskryptora SAS data set-u PROC CONTENTS DATA=projekt.test; RUN; -----Alphabetic List of Variables and Attributes----- # Variable Type Len Pos Format Informat Label ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 1 sex Char 2 16 $3. $3. sex 4 teach_duration Num 8 8 11. 11. teach_duration 2 teacher_code Num 8 0 11. 11. teacher_code 3 titel_code Char 12 18 $12. $12. titel_code Typy zmiennych w SAS character numeric Atrybuty zmiennych Length - długość zmiennej: numeric: 3-8, character 1-32767 (MS Windows) Format - jak wyświetlać (drukować) wartości zmiennej Informat - jak konwertować (skanować) input string do wartości zmiennej Label - opis zmiennej 7 Pliki danych SAS (SAS Data Sets) Wyświetlanie wartości w data set PROC PRINT DATA= projekt.test; RUN; Obs sex teacher_code titel_code teach_duration 1 M 1 006 1 2 M 2 502 1 3 M 3. 4 M 4 1 5 M 5 022 1 6 M 6 006 1 7 W 7 1 8 M 8 006 1 Missing value brak danych Wskazuje że w danej obserwacji nie przechowujemy wartoći dla danej zmiennej missing numeric value reprezentowana przez. (kropka) missing character value reprezentowana przez spację 8
Programowanie w SAS Pierwszy Program data test; teachers=283; students=853; all=teachers+students; s_per_t=students/teachers; DATA STEP tworzy data set test Tworzy zmienne w test Wykonuje data step proc print data=test; PROC STEP Wyświetla data set test Data Set WORK.FHS Obs teachers students all s_per_t 1 283 853 1136 3.01413 9 Przetwarzanie danych w programach SAS SAS Data Set Raport Raw data file DBMS tables (e.g.,.mdb)... DATA Step PROC Step... DATA Step... Plik zewnętrzny SAS Data Set Remote access (ftp, TCP/IP socket, etc.) Program w SAS SAS Log 10
Części programu: DATA Step, PROC Step DATA Step PROC Step Wczytuje dane wejściowe Np. data set, Pliki zewnętrzne itd. Przetwarza dane Tworzy wyjście Np. data sets, Plik zewnętrze Raporty Analiza danych, Tworzenie raportów (tekst, graf, HTML, PDF, itd.) 11 Algorytm DATA Step data students; input name $ sex $ note1 note2; avg=mean(note1,note2); datalines; Anna F 4 5 Ian M 3. Eva F 1 4 ; Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 12
Algorytm DATA Step-u Główna pętla DATA step: data step wczytuje jedną obserwację, Dane są umieszczane w PDV = Program Data Vector; PDV jest inicjowany na wartości missing na początku każdej iteracji data step Wykonuje instrukcje (statements) zapisane w DATA step (na danej obserwacji), Zapisuje obserwację do wynikowego data set (implicit OUTPUT) Uwaga: Implicit OUTPUT nie działa jeśli jawnie użyjemy OUTPUT statement w DATA step Dane wejściowe dla DATA step wskazujemy np. instrukcją: SET statement czytaj dane we z data set INPUT statement wczytaj linię z pliku zewnętrznego (np. wskazanego przez instrukcję INFILE) 13 Wybrane idiomy programisty Wybieramy obserwacje Wybieramy zmienne Tworzenie i modyfikowanie zmiennych Instrukcja OUTPUT Łączenie data set-ów (stacking, merging) BY-group processing Czytanie, pisanie plików zewnętrznych 14
Wybieramy obserwacje data male; if sex= F then delete; Zapisz wybrane obserwacje Używając subsetting IF: usuń obserwację jeśli wyrażenie true; data male; if sex= M ; or: data male; where sex= M ; zapisz obserwację jeśli wyrażenie true; Używając WHERE (instrujację lub data set option ) instrukcja WHERE data male; set students (where=(sex= M )); WHERE data set option 15 Wybieramy obserwacje data male; if sex= F then delete; data male; if sex= M ; or: data male; where sex= M ; Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Obs name sex note1 note2 avg 1 Ian M 3. 3 data male; set students (where=(sex= M )); 16
Wybieramy zmienne data avg_only; drop sex note1 note2; data avg_only; keep name avg; or: data avg_only; set students (drop= sex note1 note2); Zapisz tylko wybrane zmienne Używając instrukcji DROP, KEEP Używając data set options DROP, KEEP data avg_only; set students (keep= name avg); 17 Wybieramy zmienne data avg_only; drop sex note1 note2; data avg_only; keep name avg; or: data avg_only; set students (drop= sex note1 note2); Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Obs name avg 1 Anna 4.5 2 Ian 3.0 3 Eva 1.5 data avg_only; set students (keep= name avg); 18
Tworzymy nowe zmienne data pass (drop= sex note1 note2 avg); if avg < 2 then result='passed'; else result='failed'; Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Obs name result 1 Anna failed 2 Ian failed 3 Eva passed 19 Tworzymy nowe zmienne ŻLE: data pass; set students (drop= sex note1 note2 avg); if avg < 2 then result='passed'; else result='failed'; Uwaga: W przykładzie zmienne sex, note1,2 i avg nie są czytane w wejściowego data set, stąd wartość avg jest niezainicjowana w DATA step (czyli jest missing) Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Obs name avg result 1 Anna. passed 2 Ian. passed 3 Eva. passed 20
Instrukcja OUTPUT data males females; if sex='f' then output females; if sex='m' then output males; drop sex; Zapisuje aktualną obserwację do wyjściowego data set Uwaga: jeśli OUTPUT jest użyty jawnie w DATA step, implicit OUTPUT nie działa w data stepie (patrz algorytm DATA step) Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 females males 1 Anna 1 Ian 2 Eva 21 Instrukcja OUTPUT generacja danych data generator; do x=1 to 100; y=rannor(-1); output; end; Uwaga: nie ma instrukcji podającej źródło danych we (np. SET lub INPUT), stąd wykona się jedna iteracja gł. pętli DATA step Wynik: 100 liczb losowych z rozkładu normalnego N(0,1) Obs x y 1 1 0.52813 2 2 0.51177...... 99 99-0.23971 100 100 0.92665 22
Łączenie Data Set-ów (instrukcja SET) data all; set males females; data all2; set males(in=m) females(in=f); if m then sex= M ; if f then sex= F ; Przetwarzaj obserwacje z pierwszego data set, potem z drugiego itd. Rozróżnianie z którego zbioru pochodzi dana obserwacja: males(in=m) tworzy zmienną automatyczną m (m=1 dla obserwacji ze zbioru males; m=0 w przeciwnym przypadku) Uwaga: zmienne automatyczne (m and f) nie są zapisywane do wyjściowego data set Obs name note1 note2 avg sex 1 Ian 3. 3.0 M 2 Anna 4 5 4.5 F 3 Eva 2 1 1.5 F 23 Łączenie Data Set-ów (instrukcja MERGE) data lib; input name $ @8 date yymmdd10. title $20. ; datalines; Anna 2000/12/14 Hamlet Anna 2000/12/14 SAS Programming Witek 2001/07/12 XML ; proc sort data=students out=students_sort; by name; data st_books; merge students_sort lib; by name; keep name sex title; Match-merging data sets: Data set STUDENTS: Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Data set LIB: Obs name date title 1 Anna 2000-12-14 Hamlet 2 Anna 2000-12-14 SAS Programming 3 Witek 2001-07-12 XML Result data set: Obs name sex title 1 Anna F Hamlet 2 Anna F SAS Programming 3 Eva F 4 Ian M 5 Witek XML 24
BY-group Processing w DATA Stepie data best_note worst_note; set exam; by st_code; if first.st_code then output best_note; if last.st_code then output worst_note; keep st_code sem note; BY-group jest podzbiorem obserwacji ze wspólną wartością zmiennej BYvariable (data set musi być posortowany wg tej zmiennej) Użycie instrukcji BY w DATA step tworzy zmienne automatyczne, np. FIRST.st_code LAST.st_code ustawiane przez DATA step na 1 dla pierwszej (ostatniej) obserwacji w BYgroup-ie Data set EXAM: st_code sem note 1 WS96/97 1 1 WS96/97 4 1 WS95/96 6 2 WS99/00 1 2 WS00/01 3 3 WS99/00 1 3 WS99/00 1... BY-group BY-group 25 Zmienne automatyczne Przykład sprawdzamy czy nie ma błędnych danych wejściowych: data results err_log; infile C:\temp\results.txt ; input name $ jump date yymmdd8.; if _error_ then output err_log; else output results; Tworzone przez DATA step; nie są częścią Program Data Vectora; nie są zapisywane do wynikowego data set, np. _N_ - nr iteracje DATA stepu _ERROR_ - ustawiane na 1 jeśli jest błąd przetwarzania danych (błędne dane we, błąd w operacji matematycznej) FIRST.by_variable LAST. by_variable patrz BY-group processing 26
Czytanie plików zewnętrznych data results err_log; infile C:\temp\results.txt ; input name $ 1-10 jump @24 date yymmdd8.; if _error_ then output err_log; else output results; Instrukcja INFILE wskazuje plik do czytania (może być fizyczna ścieżka lub FILEREF przypisane przez FILENAME fileref path ; INPUT Wczytaj (przynajmniej jedną) linię z pliku Konwertuj linię do wartości zmiennych wg: Specyfikacji zmiennych, np. name $ - character variable jump, date numeric variables Specyfikacji kolumn, np. name $ 1-10 zakres kolumn Informaów, np. date yymmdd. informat daty 27 Czytanie plików zewnętrznych data xy; input x y; datalines; 1 2 3 4 5 6 7 8 ; Obs x y 1 1 2 2 4 5 Modyfikacja funkcjonalności INPUT: INPUT var1 var2 var3 @@; INPUT nie czyta nowej linii jak długo w buforze linii są jeszcze dane nie skonwertowane do zmiennych data xy_ok; input x y @@; datalines; 1 2 3 4 5 6 7 8 ; Obs x y 1 1 2 2 3 4 3 5 6 4 7 8 28
Zapis plików zewnętrznych data _null_; *no data set; set exam; file 'c:\temp\exam.txt'; put student_code 1-4 ', ' sem @24 note 3.1 ; Instrukcja FILE wskaż plik do którego nastąpi zapis Instrukcja PUT zapisz jedną linię do pliku wy, używając FORMAT-ów zmiennych lub FORMAT-ów podanych w instrukcji PUT data _null_ nie twórz wyjściowego data set-u 29 Instrukcja RETAIN data wzrosty_miesieczne; set gielda; *data kurs mies; BY mies; RETAIN pocz; IF FIRST.mies then pocz=kurs; IF LAST.mies then DO; Wzrost=kurs-pocz; Output; end; Składnia polecenia RETAIN: RETAIN var initial_val; Zmienna var nie będzie inicjowana na missing na początku kolejnych iteracji DATA step (wartość będzie zachowana z poprzedniej iteracji) Również: var+expression; Co jest równoważne: RETAIN var 0; var=sum(var,expression); 30
Estymacja parametryczna rozkładów zmiennych losowych Estymacja na podstawie prób pełnych za pomocą procedur: PROC CAPABILITY (z modułu SAS/QC) PROC UNIVARIATE (z modułu Base SAS) Estymacja na podstawie prób obciętych PROC RELIABILITY (z modułu SAS/QC) 31 PROC CAPABILITY proc capability data=test; var t; histogram t / weibull ; Wykonaj analizę parametryczną rozkładu zmiennej t (zmienna numeryczna w zbiorze test) Polecenie histogram z opcją weibull realizuje dopasowanie rozkładu Weibulla do danych W wyniku dostajemy estymowane parametry rozkładu (patrz np. wykres histogramu z nałożoną funkcją gęstości) oraz wyniki testów zgodności rozkładów Możemy również użyć polecenia cdfplot oraz probplot 32
PROC CAPABILITY histogram i estymowana funkcja gęstości 33 PROC CAPABILITY test zgodności rozkładów Jeśli p Value jest mniejsze niż założony poziom istotności testu (np. 0.05), wówczas odrzucamy hipotezę zerową o zgodności rozkładów (czyli badana zmienna t nie ma rozkładu Weibulla) Goodness-of-Fit Tests for Weibull Distribution Test Statistic DF p Value Cramer-von Mises W-Sq 0.1169997 Pr > W-Sq 0.063 Anderson-Darling A-Sq 0.8760160 Pr > A-Sq 0.024 Chi-Square Chi-Sq 20.3972448 9 Pr > Chi-Sq 0.016 34
PROC CAPABILITY szacowanie prawdopodobieństwa zdarzenia proc capability data=test; var t; spec lsl=0.8 usl=1.3; histogram / weibull; 35 PROC CAPABILITY szacowanie prawdopodobieństwa zdarzenia Percent Outside Specifications for Weibull Distribution Lower Limit Upper Limit LSL 0.800000 USL 1.30000 Obs Pct < LSL 6.572770 Obs Pct > USL 2.816901 Est Pct < LSL 8.967087 Est Pct > USL 1.405525 36
PROC RELIABILITY proc reliability data=test; distribution Weibull; pplot t*censor( 1 ) / covb cfit = yellow cframe = ligr ccensor = red; inset / cfill = ywh; Wykonaj analizę parametryczną rozkładu zmiennej t, przy czym obserwacje w zbiorze test, w których zmienna censor przyjmuje wartość 1 należy traktować jako próby obcięte Polecenie distribution realizuje dopasowanie wskazanego rozkładu do danych W wyniku dostajemy parametry rozkładu estymowane na podst. próby obciętej oraz wykres pplot, na podstawie którego oceniamy zgodność rozkładów (jeśli próba pochodzi z rozkładu Weibulla, dane powinny układać się wzdłuż prostej). 37 PROC RELIABILITY - pplot 38