Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Na podstawie zbioru SASHELP.CLASS napisz kod, który … */
- /* *******************PRZETWARZANIE DANYCH************************** */
- /* 1. tworzy bibliotekę engine v9 wskazującą na katalog c:\sas\ */
- /* przed uruchomieniem witrualnej maszyny trzeba utworzyć na swoim dysku c folder o nazwie "sas"
- i dodać go do Shared Folders w ustawieniach wirtualnej maszyny */
- libname MYLIB v9 "/folders/myshortcuts/sas";
- /* 2. tworzy bibliotekę engine v8 wskazującą na katalog c:\sas\ */
- libname bibl v8 "c:\sas\";
- /* 3. tworzy bibliotekę engine odbc wskazującą na sterownik odbc o nazwie CRM */
- libname bib odbc dsn=CRM user=X pw=X;
- /* 4. czyta go instrukcją SET w jednym przebiegu datastepu */
- data x;
- do i=1 to n_obs;
- set sashelp.class nobs=n_obs;
- przebieg=_n_;
- output;
- end;
- run;
- /*5 czyta go i tworzy zbiór WYNIK z nową zmienną o nazwie DWA, która ma dwie pierwsze litery imienia */
- data x;
- set sashelp.class;
- DWA = substr(name, 1, 2);
- run;
- /*6 wybiera tylko wiersze z wiekiem większym niż 12 lat */
- data work.q;
- set sashelp.class
- (where= (age > 12));
- run;
- /*7 wybiera wiersze o imionach na literę A */
- proc print data=sashelp.class;
- where name like "A%";
- run;
- /*8 tworzy nową kolumnę DATA_URODZENIA na podstawie wieku i dzisiejszej daty w systemie */
- data zadanie8;
- set sashelp.class;
- DATA_URODZENIA = intnx(
- 'year', /* unit of time interval */
- today(), /* beginning date */
- -Age, /* number of intervals, negative goes to the past */
- 'same' /* alignment of interval date. "Same" is for same day of month */
- );
- format DATA_URODZENIA YEAR.;
- run;
- /*9 tworzy nową kolumnę i liczy liczbę liter w imieniu */
- data x;
- set sashelp.class;
- liczba_liter=length(name);
- run;
- /*10 tworzy nową kolumnę: flagę zerojedynkową posiadania literki a w imieniu */
- data x;
- set sashelp.class;
- flag=0;
- do i=0 to (length(name));
- if substr(name, i, 1) = 'a' then flag = 1;
- else flag=flag;
- end;
- run;
- /*11 tworzy nową kolumnę konkatenując imię z wiekiem i płcią, np. Alfred-14-M */
- data work.q11;
- set sashelp.class;
- new_field = strip(name) || "-" || strip(age) || "-" || sex;
- run;
- /*12 rozmnaża losowo każdą obserwację od 1 do 10 razy */
- data PD12;
- set sashelp.class;
- do i=1 to int(ranuni(1) * 10); /*ranuni- losowa liczba*/
- output;
- end;
- drop i;
- run;
- /*13 do zbioru WYNIK zapisuje tylko co drugą obserwację */
- data zadanie13;
- do point = 1 to nobs by 2;
- set sashelp.class point=point nobs=nobs;
- output;
- end;
- stop;
- run;
- data zadanie13 v2;
- set sashelp.class;
- DATA_URODZENIA=put(intnx('year',"&sysdate"d,-age),year4.);
- run;
- /*14 sortuje go po płci rosnąco i wieku malejąco */
- proc sort data=sashelp.class out=x;
- by sex descending age;
- run;
- /*15 na podstawie mechanizmu przetwarzania w grupach wylicza liczbę kobiet i mężczyzn */
- proc sql;
- SELECT sex, COUNT(sex) AS S FROM sashelp.class GROUP BY sex;
- run;
- /*16 na podstawie mechanizmu przetwarzania w grupach wylicza minimum i maksimum wieku dla płci */
- proc sort data=sashelp.class
- out=sorted_class;
- by sex;
- run;
- data min_age max_age;
- set sorted_class;
- by sex;
- if first.sex then
- output min_age;
- if last.sex then
- output max_age;
- run;
- /*17 na podstawie mechanizmu przetwarzania w grupach wylicza średnią wieku dla płci */
- proc sort data=sashelp.class out=pd17;
- by sex;
- run;
- proc means data=sashelp.class;
- class sex;
- var age;
- output out=pd17 mean()=mean;
- run;
- /*18 na podstawie zbioru SASHELP.AIR wylicza skumulowaną liczbę tysięcy pasażerów, data po dacie - rosnąco, na podstawie kolumny AIR */
- data zadanie18;
- set sashelp.air;
- WYNIK=sum(cum,air);
- retain cum;
- run;
- /*19 na podstawie funkcji lag wyrzuca do WYNIK tylko wiersze, dla których poprzedni wiersz był kobietą */
- data wynik;
- set sashelp.class;
- lagged=lag(sex);
- run;
- data wynik;
- set wynik;
- where lagged='F';
- drop lagged;
- run;
- /*20 tworzy nową kolumnę jako sumę lat ostatnich dwóch wierszy */
- data wynik1;
- set sashelp.class;
- lagged=lag(age);
- run;
- data wynik1;
- set wynik1;
- SumOfAge = Age + lagged;
- run;
- /*21 który do zbioru WYNIK wyrzuca tylko obserwacje o numerach od 5 do 7 */
- data WORK.WYNIK;
- set SASHELP.CLASS (firstobs = 5 obs =7);
- run;
- /*22 który do zbioru WYNIK wyrzuca tylko pierwszą obserwację */
- data wynik;
- set sashelp.class (obs=1);
- run;
- /*23 który do zbioru WYNIK wyrzuca tylko ostatnią obserwację */
- data zadanie23;
- set sashelp.class end=koniec;
- if koniec=1 then output;
- run;
- /*24 który tworzy nowe zmienne wiek1 do wiek20 i tak je uzupełnia, by np. dla wieku równego 10 kolumna wiek10 miała wartość 1 a inne 0 */
- data x;
- array t(20) wiek1-wiek20;
- set sashelp.class;
- do i=1 to 20;
- if age=i then t(i)=1;
- else t(i)=0;
- end;
- run;
- /*25 ze zbioru SASHELP.ZHC wybrać tylko te obserwacje, których kod PCMS jest w zbiorze SASHELP.ZTC */
- proc sql;
- select * from sashelp.ZHC
- except
- select PCMS from sashelp.ZHC;
- run;
- /*26 do zbioru SASHELP.ZHC dokleić kolumnę EUC ze zbioru SASHELP.ZTC łącząc po PCMS */
- proc sort data=SASHELP.ZHC
- out = work.a;
- by PCMS;
- run;
- data work.b;
- set SASHELP.ZTC (keep = EUC PCMS);
- run;
- proc sort data=work.b
- out = work.c;
- by PCMS;
- run;
- data work.d;
- merge work.a (in = in_a) work.c;
- by pcms;
- if in_a;
- run;
- /*27 zrobić test łączenia tabel SASHELP.ZHC i SASHELP.ZTC łącząc po PCMS,
- ile się połączyło, ile zostało obserwacji w pierwszym a ile w drugim */
- proc sort data=sashelp.ztc out=pd27ztc;
- by pcms;
- run;
- proc sort data=sashelp.zhc out=pd27zhc;
- by pcms;
- run;
- data polaczone pierwszy drugi;
- merge work.pd27zhc(in=zhc) work.pd27ztc(in=ztc);
- by pcms;
- if zhc and ztc then output polaczone;
- if zhc and not ztc then output pierwszy;
- if not zhc and ztc then output drugi;
- run;
- /*28 stworzyć zbiór WYNIK, który ma kolumny od age11 do age16 i name.
- Dla przykładu gdy uczeń ma 11 lat to zmienna age11 jest wypełniona
- i posiada wartość zmiennej płeć, a inne zmienne są puste */
- data zadanie28;
- array t(6) $ age11-age16;
- set sashelp.class;
- do i=1 to 6;
- if age=i+10 then t(i)=sex;
- end;
- keep name age11-age16;
- run;
- /*29 na podstawie zbioru SASHELP.CARS stworzyć zbiór WYNIK,
- który posiada informacje o modelach samochodów w wielu wierszach.
- Dla danego modelu w wierszach istnieją dwie dodatkowe kolumny o nazwach: PROPERTY i VALUE,
- w pierwszej jest nazwa kolumny zbioru oryginalnego a w drugiej jej wartość */
- data wynik; /* NIE JESTEM PEWNY TEGO KODU, PLS SPRAWDZ KTOS JESZCZE */
- length property value $200;
- do i=1 to obs;
- set sashelp.cars nobs=obs;
- array zmienne(*) _NUMERIC_;
- array zmiennechar(*) _CHARACTER_;
- do j=2 to 11;
- property=vname(zmienne(j));
- value=zmienne(j);
- output;
- if (j >= 3 AND j<=7) then do;
- property=vname(zmiennechar(j));
- value=zmiennechar(j);
- output;
- end;
- end;
- end;
- keep model property value;
- run;
- /*30 liczy odległość Levenshteina pomiędzy imieniem a słowem Alfred */
- data x;
- set sashelp.class;
- result=complev(Name, 'Alfred');
- run;
- /* 31 tworzy 19 zbiorów: od name1 do name19, każdy z jedną obserwacją, pierwszy z pierwszą obserwacją zbioru wejściowego,
- a ostatni z ostatnią */
- %macro do_task;
- %do i=1 %to 19;
- %let my_string=%sysfunc(catx(,name,&i));
- data &my_string.;
- set sashelp.class (firstobs=&i obs=&i);
- run;
- %end;
- %mend do_task;
- %do_task
- ;
- /* 32 tworzy zbiór WYNIK z powtórzonymi obserwacjami tyle razy ile wynosi wartość zmiennej wiek */
- data wynik;
- set sashelp.class;
- do i=1 to age;
- output;
- end;
- run;
- /* 33 tworzy tablicę dwuwymiarową w IML biorąc dwie pierwsze obserwacje i kolumny wiek i wagę oraz oblicza jej wyznacznik */
- PROC IML;
- USE sashelp.class;
- read point {1 2} var {age weight} into dane;
- print dane;
- wyznacznik=det(dane);
- print wyznacznik;
- quit;
- /* **************RAPORTOWANIE*********************** */
- /* 1 tworząc format grupy wiekowej: do 13 lat włącznie i powyżej, wyznaczyć
- procedurą MEANS liczby i uczniów i średnie wartości wieku */
- proc format;
- value wiek
- low-13='Mały'
- 13-high='Duży';
- run;
- proc means data=sashelp.class mean;
- class age;
- format age wiek.;
- var age;
- run;
- /* 2 wyznaczyć dwuwymiarową tablicę liczebności wieku i płci */
- proc sql;
- SELECT age, sex, COUNT(sex) AS S FROM sashelp.class GROUP BY age;
- run;
- /* 3 wyznaczyć tablicę liczebności wieku z jej kumulatywnymi
- statystykami liczebności i procentu */
- proc freq data=sashelp.class;
- table age /out=freq outcum;
- run;
- /* 4 tworzy raport HTML z tabelą z boczkiem imieniem a nagłówkiem
- płcią i wypełnionymi wartościami wiekiem */
- ods _all_ close;
- ods html body='rap4.htm' style=HTMLBlue file='C:\Users\ignac\Desktop\rap4.htm';
- proc tabulate data=sashelp.class; /* tabulate- wyswietla statystyki*/
- class name sex;
- var age;
- table name,sex='plec'*age;
- run;
- ods html close;
- ods listing;
- /* 5 tworzy raport w PDF na podstawie SASHELP.PRDSALE z informacjami o aktualnej
- sumie sprzedaży i procentach po latach i regionie z podsumowaniami */
- ods listing close;
- ods pdf
- file='/folders/myfolders/raport.pdf';
- proc tabulate data=sashelp.prdsale;
- class year region;
- var actual;
- table year='' all,actual='Sprzedaż'*region ;
- run;
- ods pdf close;
- ods listing;
- /* 6 tworzy seryjny raport dla każdego regionu, czyli tworzy tyle HTMLi ile
- regionów i w każdym raportuje sumę sprzedaży w rozbiciu po latach i produktach z podsumowaniami */
- proc sql noprint;
- select distinct region into :nazwy separated by '#'
- from sashelp.prdsale order by region;
- quit;
- %let n_name=&sqlobs;
- %put &n_name***&nazwy;
- %MACRO DO_MEAN;
- %DO I = 1 %TO &n_name;
- ods listing close;
- ods html body="\zad6&I..html";
- proc tabulate data=sashelp.prdsale (where=(region="%scan(&nazwy, &I, '#')"));
- class product year;
- var actual;
- table product='' all, mean=''*actual=''
- (year='' all)f=nlnum12.2
- / box='Actual mean';
- run;
- ods html close;
- ods listing;
- %END;
- %MEND DO_MEAN;
- %DO_MEAN;
- /* 7 tworzy listę makrozmiennych name1 do name19 wstawiając do nich nazwy uczniów w kolejności alfabetycznej */
- proc sql noprint;
- select name into :name1-:name99999
- from sashelp.class order by name;
- quit;
- %let n_name=&sqlobs;
- %put &name1;
- %put _user_;
- /* 8 tworzy listę makrozmiennych o nazwach uczniów wstawiając do nich ich płcie */
- data _null_;
- set sashelp.class;
- call symput(name,trim(sex));
- run;
- %put &Alice;
- /* 9 tworzy jedną długą makrozmienną wstawiając do niej listę
- imion uczniów w kolejności alfabetycznej oddzielanych znakiem # */
- proc sql noprint;
- select name into :imiona separated by '#'/*wszystkie wartości do 1 makrozmiennej*/
- from sashelp.class order by name; /* alfabetycznie*/
- quit;
- %let n_name=&sqlobs;
- %put &n_name &imiona;
- /* 10 tworzy makroprogram z parametrem płeć, który listuje (PROC PRINT) obserwacje dla wybranej płci */
- %macro drukuj(plec);
- proc print data=sashelp.class (where=(sex="&plec"));
- run;
- %mend;
- %drukuj(M);
- /* 11 tworzy wykres słupkowy z średnim wiekiem dla płci */
- proc gchart data=sashelp.class;
- vbar3d sex / type=mean
- sumvar=age;
- run;
- /* 12 tworzy wykres liniowy szeregu czasowego liczby pasażerów AIR ze zbioru SASHELP.AIR */
- proc plot data=x;
- plot Air*Date;
- run;
- /* 13 liczy percentyle zmiennej wiek: 5, 25, 50, 75 i 95 */
- proc univariate data=sashelp.class;
- var age;
- output out=percentile pctlpre=P_ pctlpts= 5 25 50 75 85;
- run;
- proc print data=percentile;
- run;
- /* 14 liczy odchylenie standardowe, średnią i rozstęp między-kwartylowy */
- proc univariate data=sashelp.class ;
- var age;
- output out=statystyki mean=mean qrange=qrange std=std; /*srednia,rozstęp, odchylenie*/
- run;
- proc print data=statystyki;
- run;
- /* 15 wrzuca do EXCELA do komórek A1,A2i A3 liczby 3,4,5. */
- proc univariate data=sashelp.class trimmed=1 0.01 0.1 winsorized=1 0.01 0.1 ;
- var age;
- run;
- /* 16 tworzy zbiór danych w którym są zapisane nazwy plików z katalogu c:\ */
- /* 17 tworzy pliki tekstowe o nazwach takich jak wartości zmiennej PRODUCT
- zbioru SASHELP.PRDSALE i wrzuca do nich informacje o aktualnej sprzedaży i roku */
- proc sql noprint;
- select distinct product into :nazwy separated by '#'/*wszystkie wartości do 1 makrozmiennej*/
- from sashelp.prdsale order by product;
- quit;
- %let n_name=&sqlobs;
- %put &n_name***&nazwy;
- %let dir=;
- %macro rob;
- %do i=1 %to 20;
- data _null_;
- file "&dir.%scan(&nazwy, &I, '#').txt";
- do l=1 to obs;
- set sashelp.prdsale (where=(product="%scan(&nazwy, &I, '#')") keep=actual year PRODUCT) nobs=obs;
- put actual year;
- end;
- run;
- %end;
- %mend;
- %rob;
- /* 18 tworzy wykres pudełkowy dla zmiennej wiek po płci */
- proc sort data=sashelp.class out=klasa;
- by sex;
- run;
- proc boxplot data=klasa;
- plot age*sex /
- boxstyle = schematic ;
- run;
- quit;
- /* 19 tworzy wykres rozproszenia wieku i wagi */
- proc plot data=sashelp.class;
- plot weight*age;
- run;
- quit;
- /* 20 liczy średnie odporne, np. obcięte lub windsorowane dla wieku */
- proc univariate data=sashelp.class trimmed=1 0.01 0.1 winsorized=1 0.01 0.1 ;
- var age;
- run;
- /* 21 tworzy jego listing do LaTeXa */
- ods tagsets.tablesonlylatex /* ??? */
- file="S\egzamin.txt" (notop nobot);
- proc univariate data=sashelp.class trimmed=1 0.01 0.1 winsorized=1 0.01 0.1 ;
- var age;
- run;
- ods tagsets.tablesonlylatex close;
- ods listing;
- /* 22 przerzuca statystyki dopasowania do rozkładu normalnego zmiennej
- wiek z procedury UNIVARIATE do zbioru danych ZGODNOSC */
- proc univariate data=sashelp.class normal;
- var age;
- output out=zgodnosc normaltest=normal ;
- run;
- /* ***********************STATYSTYKA************************* */
- /* 1 rysuje histogram zmiennej wiek z naniesioną krzywą Gaussa */
- proc univariate data=sashelp.class;
- var age;
- HISTOGRAM / NORMAL (COLOR=RED W=5) ;
- run;
- /* 2 wyznacza test chi-kwadrat dla płci i wieku, traktując obie jako nominalne, policzyć p-value */
- proc freq data=sashelp.class;
- tables sex*age /
- chisq ; /*chi-kwadrat*/
- run;
- /* 3 wyznacza statystykę V-Cramera dla płci i wieku */
- proc freq data=sashelp.class;
- tables sex*age / chisq ;
- run;
- /* 4 wyznacza statystę Giniego dla płci i wieku */
- proc univariate data=sashelp.class;
- var age ;
- class sex;
- output out=gini gini=gini;
- run;
- /* 5 liczy współczynnik korelacji Spearmana dla wieku i wagi */
- proc corr data= x sscp cov plots=matrix;
- var age;
- with weight;
- run;
- /* 6 liczy współczynnik korelacji Pearsona dla wieku i wagi */
- /* 7 liczy statystykę Kołmogorowa—Smirnowa testu zgodności empirycznego rozkładu wieku z teoretycznym normalnym */
- proc univariate data=sashelp.class normal;
- var age;
- run;
- /* 8 liczy statystykę Shapiro—Wilka testu zgodności empirycznego rozkładu wieku z teoretycznym normalnym */
- proc univariate data=sashelp.class normal;
- var age;
- run;
- /* 9 liczy korelację cząstkową Pearsona dla wieku i wagi z wyrugowanym wpływem wzrostu */
- proc corr data=sashelp.class rank pearson;
- var weight age ;
- partial height;
- run;
- /* 10 liczy współczynniki regresji liniowej dla wieku i wagi */
- proc reg data=sashelp.class outest=e;
- model age=height weight;
- run;
- quit;
- /* 11 liczy współczynnik determinacji regresji liniowej dla wieku i wagi */
- proc reg data=sashelp.class outest=e;
- model age=height weight/rsquare;
- run;
- quit;
- /* 12 przeprowadza diagnostykę modelu regresji liniowej wieku i wagi */
- proc reg data=sashelp.class;
- model age=weight / spec;
- output out=reszty r=r;
- plot r. * (p. age);
- plot student. * obs.;
- plot nqq. * student.;
- run;
- quit;
- proc univariate data=reszty mu0=0 alpha=0.01;
- var r;
- run;
- /* 13 bada homoskedastyczność modelu regresji liniowej wieku i wagi */
- proc reg data=sashelp.class;
- model age=weight / spec;
- output out=reszty r=r;
- plot r.*p. ;
- run;
- quit;
- /* 14 bada normalność reszt modelu regresji liniowej wieku i wagi */
- proc reg data=sashelp.class;
- model age=weight / spec;
- output out=reszty r=r;
- run;
- quit;
- proc univariate data=reszty normal;
- var r;
- qqplot r / normal(mu=est sigma=est);
- run;
- /* 15 przeprowadza selekcję zmiennych metodami krokowymi dla modelu regresji liniowej wielorakiej wieku zależnego od wagi i wzrostu */
- proc reg data = x;
- model Age = weight height/ vif selection = forward slentry = 0.99;
- run;
- quit;
- /* Moja opcja - Krzysiek */
- proc reg data=sashelp.class outest=e;
- model age=height weight/ selection=FORWARD slentry=0.1;
- run;
- quit;
- proc reg data=sashelp.class outest=e;
- model age=height weight/ selection=BACKWARD slstay=0.1;
- run;
- quit;
- proc reg data=sashelp.class outest=e;
- model age=height weight/ selection=STEPWISE slentry=0.1 slstay=0.1;
- run;
- quit;
- /* 16 liczy mierniki współliniowości dla modelu regresji liniowej wielorakiej wieku zależnego od wagi i wzrostu */
- proc reg data=sashelp.class outest=e;
- model age=height weight/ TOL VIF COLLIN;
- run;
- quit;
- /* 17 liczy współczynniki determinacji dla wszystkich modeli regresji liniowej wielorakiej wieku zależnego od wagi i wzrostu */
- proc reg data=sashelp.class outest=e;
- model age=height weight/ selection=rsquare;
- run;
- quit;
- /* 18 wyznacza wartości odstające i/lub wpływające w modelu regresji liniowej wieku i wzrostu */
- %let p=2;
- %let n=19;
- ods listing close;
- ods output OutputStatistics=statystyki;
- proc reg data=sashelp.class outest=e;
- model age=height/ influence vif collin spec collinoint r cli clm p;
- run;
- quit;
- ods output close;
- ods listing;
- data nietypowe;
- set statystyki;
- if
- abs(RStudent)>3
- or HatDiagonal>(2*&p/&n)
- or CooksD > (4/&n)
- or abs(DFFITS)> 2*sqrt(&p/&n)
- or min(of DFB:) > 2/sqrt(&n)
- or max(of DFB:) < -2/sqrt(&n)
- or abs(CovRatio-1) > 3*&p/&n
- ;
- run;
- /* 19 liczy procent wyjaśnienia wariancji przez główne składowe dla zmiennych wiek, waga i wzrost */
- proc princomp data=sashelp.class out=AGS n=3;
- var age weight height;
- run;
- /* 20 liczy prognozę wieku zależnego od wagi wynoszącej 80 w modelu regresji liniowej wieku i wagi */
- data klasa;
- weight=80;
- output;
- do i=1 to obs;
- set sashelp.class nobs=obs;
- output;
- end;
- stop;
- run;
- proc reg data=klasa;
- model age=weight ;
- output out=predyk p=predykcja;
- run;
- quit;
- /* 21 wyznacza klastry (skupienia) zmiennych (PROC VARCLUS) dla wszystkich zmiennych numerycznych
- zbioru SASHELP.CARS i dla wyjaśnionej wariancji (proporcji) 80% */
- proc varclus data=sashelp.cars PROPORTION=0.8;
- var _NUMERIC_;
- run;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement