ANALIZA DANYCH W STATA 8.0 CZĘŚĆ II ZAJĘCIA 2 (CZĘŚĆ II) Będziemy pracować na pliku bory tucholskie.dta Wszystkie przykłady najlepiej jest robić w Do-file Editor (wejście: doedit) Komentarze: Komentarze * Komentarz // Komentarz Polecenie // Komentarz Polecenie /* Komentarz */ Polecenie ciąg dalszy /* Komentarz Komentarz Komentarz */ Od początku linijki Od danego miejsca do końca linijki W środku linijki Kilka linijek Komentarze pozwalające napisać jedno polecenie w kilku linijkach: Polecenie /// Ewentualnie komentarz Ciąg dalszy polecenia Polecenie /* Ewentualnie komentarz Ewentualnie komentarz */ Ciąg dalszy polecenia CZĘŚĆ II ZAJĘCIA 2: 1/8
STATA odpoczywa help more help sleep help pause more powoduje pojawienie się more na ekranie sleep powoduje, że Stata zasypia na podaną liczbę milisekund pause zawiesza działanie programu; (a) powrót do wykonywania programu następuje po wpisaniu q lub ; (b) przerwanie działania programu następuje po wpisaniu BREAK Przykład 1: capture program drop roztocze program roztocze pause on local i = 1 while `i' < 10 { display `i' if `i' == 8 more if `i' == 5 pause TERAZ JEST PRZERWA local ++i sleep 5000 roztocze CZĘŚĆ II ZAJĘCIA 2: 2/8
Polecenie: continue help continue Dotyczy pętli forvalues, foreach, while continue continue, break Przerwanie bieżącego obrotu i rozpoczęcie wykonywania nowego obrotu Przerwanie bieżącego obrotu i zakończenie wykonywania pętli Przykład 2: Chcemy stworzyć program, który dla wpisanej po nazwie programu liczby całkowitej (większej niż 2) będzie podawał największą liczbę pierwszą nie przekraczającą wartości danej liczby. Kod programu: capture program drop karkonosze program karkonosze args liczba //Program dziala dla liczb wiekszych niz 2 forvalues kiziak = `liczba'(-1)2 { if "`mariuszek'" == "KONIEC" continue, break local sudety = `kiziak' - 1 local licznik = 1 forvalues kot = 2/`sudety' { if mod(`kiziak',`kot') == 0 continue, break local ++licznik if `licznik' == `sudety' { display "Najwieksza liczba pierwsza mniejsza rowna `liczba' to `kiziak'" local mariuszek = "KONIEC" Przykładowe działanie programu: karkonosze 7 karkonosze 8 CZĘŚĆ II ZAJĘCIA 2: 3/8
help tempvar help tempname help tempfile Tymczasowe zmienne, skalary i pliki Przykład 3 capture program drop szczecin program szczecin capture drop potulicka pomorzany dobiegniew? tempvar zmienna1 zmienna2 generate `zmienna1' = 8 generate `zmienna2' = "STRZELCE KRAJENSKIE WSCHOD" generate potulicka = `zmienna1' generate pomorzany = `zmienna2' tempname golczewo scalar `golczewo' = 7 scalar potulicka = 100 scalar list display `golczewo' " " potulicka generate dobiegniew1 = _n * potulicka generate dobiegniew2 = _n * `golczewo' szczecin Rzeczy tymczasowe kasują się po zakończeniu działania programu, niezależnie od tego jak działanie programu się zakończyło (prawidłowo czy np. klawisz BREAK, error message) W przypadku gdy skalary mają takie same nazwy jak zmienne, zmienne zawsze mają pierwszeństwo przed skalarami (o nazwie potulicka istniał skalar i zmienna; w poleceniu tworzącym zmienną dobiegniew1 wykorzystana została zmienna potulicka, a nie skalar potulicka) Gdy chcemy użyć koniecznie skalaru, nazwę skalaru trzeba poprzedzić funkcją scalar(), np.: generate dobiegniew1 = _n * scalar(potulicka) CZĘŚĆ II ZAJĘCIA 2: 4/8
Zaznaczanie obserwacji, na których mają być wykonane obliczenia help mark Przykładowy fragment kodu programu: syntax varlist [if] [in] marksample osiedle_bukowe tempvar osiedle_bukowe mark `osiedle_bukowe' `if' `in' markout `osiedle_bukowe' `varlist' Polecenie marksample osiedle_bukowe tworzy TYMCZASOWĄ zmienną zerojedynkową osiedle_bukowe, która przyjmuje wartość 1 dla obserwacji uwzględnionych w ograniczeniach if, in, weights (według polecenia syntax) oraz w instrukcji warunkowej by, wyłączając te obserwacje, dla których zmienne numeryczne wyszczególnione w varlist są równe missing values Dla pozostałych obserwacji zmienna osiedle_bukowe przyjmuje wartość 0 Jeżeli wśród zmiennych wyszczególnionych w varlist występuje co najmniej jedna zmienna tekstowa, zmienna osiedle_bukowe po poleceniu marksample przyjmuje dla wszystkich obserwacji wartość 0 mark `osiedle_bukowe' `if' `in' tymczasowej zmiennej osiedle_bukowe przypisze wartość 1 dla obserwacji uwzględnionych w ograniczeniach if, in oraz w instrukcji warunkowej by markout `osiedle_bukowe' `varlist' tymczasowej zmiennej osiedle_bukowe przypisze wartość 0 dla tych obserwacji, dla których co najmniej jedna zmienna z varlist jest równa missing values Lepiej używać polecenia marksample niż polecenia mark CZĘŚĆ II ZAJĘCIA 2: 5/8
Po wpisaniu macro shift Polecenie: macro shift `1' znika `2' staje się `1' `3' staje się `2' `4' staje się `3' itd. macro shift 1 równoważne macro shift macro shift 2 równoważne macro shift macro shift macro shift 3 równoważne macro shift macro shift macro shift itd. Przykład 4 capture program drop lublin program lublin local mariuszek wygoda mika zyczyn "rokitnia stara" tokenize `mariuszek' forvalues kot = 1/5 { display "1 = `1'; 2 = `2'; 3 = `3'; 4 = `4'" display "* = `*'" macro shift lublin CZĘŚĆ II ZAJĘCIA 2: 6/8
Programy nie zmieniające sortowania danych. Opcja: sortpreserve Jeśli definiując program umieścimy opcję sortpreserve, wówczas po zakończeniu programu zachowa się sortowanie pierwotne Przykład 5 capture program drop warnowo program warnowo, sortpreserve sort han pkb capture drop t gen t = _n warnowo Programy umożliwiające wprowadzenie instrukcji warunkowej by help byable Jeśli chcemy, żeby program wyświetlający tylko wyniki obliczeń i nie zmieniający zawartości bazy danych dopuszczał instrukcję warunkową by, to definiując program należy umieścić opcję byable(recall) W przypadku programów zmieniających zawartość bazy danych używanie instrukcji warunkowej by jest bardziej skomplikowane: byable(onecall) Przykład 6: Chcemy stworzyć program, który będzie podawał średnią wartość danej zmiennej liczbowej oraz opcjonalnie wartość maksymalną i minimalną (wprowadzamy opcje max i min). Program dopuszcza ważenie zmiennych, ograniczenia if i in oraz instrukcję warunkową by. Program niech będzie ładny. Utwórzmy w bazie danych 2 zmienne: stacja oraz wagi, które umożliwią sprawdzenie działania instrukcji by oraz ważenia zmiennych: generate stacja = "Choszczno" in 1/20 replace stacja = "Stargard Szczecinski" in 21/30 replace stacja = "Szczecin Dabie" in 31/l generate wagi = 100 in 1 replace wagi = 1 in 2/l Kod programu: CZĘŚĆ II ZAJĘCIA 2: 7/8
capture program drop osiedle_kasztanowe program osiedle_kasztanowe, byable(recall) version 8 syntax varlist [if] [in] [fweight] [, max min] local koniec "" foreach kot of local varlist { capture confirm numeric variable `kot' // Prosze zobaczyc pomoc help confirm if _rc!= 0 { display "Zmienna `kot' nie jest liczbowa" local koniec "koniec" if "`koniec'"!= "" exit marksample szczecinek tokenize `varlist' local i = 1 while "``i''"!= "" { summarize ``i'' [`weight'`exp'] if `szczecinek' display "Srednia = "r(mean) if "`max'"!= "" display "Maximum = "r(max) if "`min'"!= "" display "Minimum = "r(min) local i = `i' + 1 Przykładowe działanie programu: osiedle_kasztanowe pkb - han osiedle_kasztanowe p*, max osiedle_kasztanowe pkb if stacja=="choszczno", max min osiedle_kasztanowe han [fweight=wagi], max min bysort stacja: osiedle_kasztanowe pkb if stacja=="choszczno" [fweight=wagi], max min bysort stacja: osiedle_kasztanowe pkb han [fweight=wagi], max min osiedle_kasztanowe pkb-wagi CZĘŚĆ II ZAJĘCIA 2: 8/8