Úvod do SASu pro Windows - Část III.
Základní metody analýzy dat v SASu

SAS je registrovaná ochranná známka SAS Institute, Inc., Cary, NC, USA

(c) 2000 Michal Kulich, 1998 Oliver Schabenberger


1. Popisné statistiky a exploratorní analýza

1.1 Výpočet a ukládání jednoduchých popisných statistik
1.2 Výpočet popisných statistik přes kombinace úrovní faktorových veličin
1.2.1 Tabulky popisných statistik v PROC MEANS
1.2.2 Tabulky popisných statistik v PROC UNIVARIATE
1.2.3 Tabulky popisných statistik v PROC TABULATE
1.3 Výpočet tabulek četností a procent
1.3.1 Tabulky četností v PROC FREQ
1.3.2 Tabulky četností v PROC TABULATE
1.4 Krabicové diagramy, normální diagramy a testy normality
1.5 Krabicové diagramy přes kombinace úrovní faktorových veličin

2. Testování hypotéz

2.1 Jednovýběrový t-test
2.2 Párový t-test
2.3 Dvouvýběrový t-test
2.4 Welchův test (porovnání středních hodnot za nestejného rozptylu)
2.5 Znaménkový test
2.6 Jednovýběrový Wilcoxonův test (signed rank)
2.7 Dvouvýběrový Wilcoxonův test (rank sum)
2.8 F-test rovnosti dvou rozptylů
2.9 Chí-kvadrát test dobré shody
2.10 Testování nezávislosti v kontingenční tabulce

1. Popisné statistiky a exploratorní analýza

V této kapitole budeme výpočty demonstrovat na datových souborech OSTRICE a ANKETA, které uvádíme níže.

PROC FORMAT;
    VALUE dusrez
      1='Urea' 2='Amm. sulf.' 3='IBDU' 4='Urea(SC)';    
    VALUE ospod
      1='2 roky' 2='5 let' 3='8 let';
RUN;
DATA ostrice;
  LABEL blok = 'Číslo pozorování'
        dusik = 'Režim hnojení dusíkem'
        osetr = 'Ošetření podloží'
        chloro = 'Chlorofyl v listech (mg/g)';
  FORMAT dusik dusrez.
         osetr ospod.;
  INPUT blok dusik osetr chloro @@;
  DATALINES;
  1  1  1  3.8  1  1  2  5.3  1  1  3  5.9
  1  2  1  5.2  1  2  2  5.6  1  2  3  5.4
  1  3  1  6.0  1  3  2  5.6  1  3  3  7.8
  1  4  1  6.8  1  4  2  8.6  1  4  3  8.5
  2  1  1  3.9  2  1  2  5.4  2  1  3  4.3
  2  2  1  6.0  2  2  2  6.1  2  2  3  6.2
  2  3  1  7.0  2  3  2  6.4  2  3  3  7.8
  2  4  1  7.9  2  4  2  8.6  2  4  3  8.4
;
RUN;
PROC FORMAT;
    VALUE $pohlf 'F'='Žena' 'M'='Muž';
RUN;
DATA anketa;
   LABEL pohl = 'Pohlaví'
         vek  = 'Věk'
         prijem = 'Příjem (Kč/měs.)'
         r1     = 'Obliba TV Nova'
         r2     = 'Obliba Auto Škoda'
         r3     = 'Obliba Coca Cola';
   FORMAT pohl $pohlf.;
   INPUT id pohl $ vek prijem r1 r2 r3;
   DATALINES;
1  F  35 17  7 2 2
17  M  50 14  5 5 3
33  F  45  6  7 2 7
49  M  24 14  7 5 7
65  F  52  9  4 7 7
81  M  44 11  7 7 7
2  F  34 17  6 5 3
18  M  40 14  7 5 2
34  F  47  6  6 5 6
50  M  35 17  5 7 5
;
RUN;

1.1 Výpočet jednoduchých popisných statistik

Základní popisné statistiky počítají například procedury MEANS, UNIVARIATE a SUMMARY, které teď postupně probereme.

1.1.1 Popisné statistiky v PROC MEANS

Základní  volání:

PROC MEANS DATA=jmsoub;
  VAR var1 ... varn;
RUN;

Procedura MEANS počítá počet nechybějících hodnot, průměr, směrodatnou odchylku, minimum a maximum každé z numerických veličin uvedených v příkazu VAR. Nevyhovuje-li nám tato sestava, protože chceme znát i jiné popisné statistiky, musíme vypsat klíčová slova pro všechny požadované statistiky jako argumenty PROC MEANS. Nabídka statistik procedury MEANS s jejich klíčovými slovy je uvedena v tabulce.

N počet nechybějících hodnot  VAR výběrový rozptyl
NMISS počet chybějících hodnot USS součet čtverců
MEAN průměr CSS součet čtverců od průměru
STD výb. směrodatná odchylka CV výběrový variační koeficient
MIN minimum STDERR  směrodatná chyba průměru
MAX maximum T T statistika (MEAN/STDERR)
RANGE  rozpětí PRT dosažená hladina (p-hodnota) oboustranného
T-testu pro hypotézu H0: EX=0 
SUM součet

Volání PROC MEANS potom vypadá třeba takto:

PROC MEANS DATA=jmsoub NMISS MEAN STDERR T PRT;
  VAR var1 ... varn;
RUN;

Vybrané statistiky lze uložit do datového souboru k dalšímu zpracování. K tomu slouží příkaz OUTPUT:

OUTPUT OUT=vystup MEAN=prum1 prum2 prum3 VAR=rozp1 rozp2 rozp3

Příkaz OUTPUT specifikuje jméno výstupního souboru v argumentu OUT= (bude mit jedno pozorování). Ten je následován argumenty pro jednotlivé požadované statistiky (viz tabulka) a ke každé statistice je za znaménkem = uveden seznam veličin výstupního souboru, do nichž se uloží hodnoty této statistiky pro jednotlivé veličiny ze seznamu VAR. V našem konkrétním případě budou uloženy hodnoty průměrů a výběrových rozptylů prvních tří veličin.

Zde je příklad, jenž počítá počty chybějících hodnot, průměry a směrodatné chyby průměrů pro veličiny VEK, PRIJEM, R1 a R2 z datového souboru ANKETA a uloží průměry pro VEK, PRIJEM a R1 do datového souboru VYSTUP.

PROC MEANS DATA=anketa MAXDEC=3 NMISS MEAN STDERR;
  VAR vek prijem r1 r2;
  OUTPUT OUT=vystup MEAN=prumvek prumprij prumr1;
RUN;

Argument MAXDEC=3 omezuje počet desetinných míst při tisku výsledků na 3. Zde je textový výstup z PROC MEANS:

Variable  Label              Nmiss          Mean     Std Error
--------------------------------------------------------------
VEK       Věk                    0        40.600         2.733
PRIJEM    Příjem (Kč/měs.)       0        12.500         1.360
R1        Obliba TV Nova         0         6.100         0.348
R2        Obliba Auto Škoda      0         5.000         0.577
--------------------------------------------------------------

A zde je výstup z PROC PRINT DATA=vystup; RUN;

OBS    _TYPE_    _FREQ_    PRUMVEK    PRUMPRIJ    PRUMR1
 1        0        10        40.6       12.5      6.1  

1.1.2 Popisné statistiky v PROC UNIVARIATE

PROC UNIVARIATE se liší tím, že nabízí trochu jiné statistiky než PROC MEANS a její textový výstup se nedá modifikovat. Její použití je jinak obdobné:

PROC UNIVARIATE DATA=jmsoub;
  VAR var1 var2 var3;
  OUTPUT OUT=vystup MEAN=prum1 prum2 prum3 VAR=rozp1 rozp2 rozp3;
RUN;

Příkaz OUTPUT funguje stejně jako v PROC MEANS, ale argumenty pro výstup statistik jsou trochu jiné (podrobnosti nebudeme uvádět).

Příklad s daty ANKETA:

PROC UNIVARIATE DATA=anketa;
  VAR vek prijem r1;
  OUTPUT OUT=vystup MEAN=prumvek prumprij prumr1;
RUN;

Takhle vypadá textový výstup pro veličinu VEK:

Variable=VEK           Věk
                 Moments                              Quantiles(Def=5)
 N                10  Sum Wgts         10   100% Max        52       99%        52
 Mean           40.6  Sum             406    75% Q3         47       95%        52
 Std Dev    8.643559  Variance   74.71111    50% Med        42       90%        51
 Skewness    -0.5408  Kurtosis   -0.16791    25% Q1         35       10%        29
 USS           17156  CSS           672.4     0% Min        24        5%        24
 CV         21.28955  Std Mean   2.733333                             1%        24
 
 T:Mean=0   14.85366  Pr>|T|       0.0001   Range           28
 Num ^= 0         10  Num > 0          10   Q3-Q1           12
 M(Sign)           5  Pr>=|M|      0.0020   Mode            35
 Sgn Rank       27.5  Pr>=|S|      0.0020
 
                 Extremes
    Lowest    Obs     Highest    Obs
        24(       4)       44(       6)
        34(       7)       45(       3)
        35(      10)       47(       9)
        35(       1)       50(       2)
        40(       8)       52(       5)

Kromě popisných statistik, které umí i PROC MEANS, tu máme i šikmost a špičatost, výběrové kvantily, medián, modus, extrémní pozorování a několik testových statistik (o těch bude pojednáno jinde).

1.1.3 Popisné statistiky v PROC SUMMARY

PROC SUMMARY funguje úplně stejně jako PROC MEANS, ale nevytváří žádný textový výstup, pokud ji o to nepožádáme uvedením argumentu PRINT.

1.2  Výpočet popisných statistik přes kombinace úrovní faktorových veličin

Zde si ukážeme, jak počítat popisné statistiky pro podskupiny pozorování definované hodnotami jedné nebo více faktorových veličin a vysvětlíme použití procedur MEANS, UNIVARIATE a TABULATE k tomuto účelu. PROC MEANS a PROC TABULATE používají příkaz CLASS k definici skupin podle úrovní faktorových veličin a nevyžadují tedy předchozí setřídění datového souboru. PROC UNIVARIATE používá příkaz BY, což znamená, že data musí být nejdřív setříděna procedurou SORT. PROC TABULATE slouží zejména k vytváření textového výstupu ve formě složitějších tabulek s požadovanou úpravou.

1.2.1 Tabulky popisných statistik v PROC MEANS

Představme si, že potřebujeme spočítat průměr a směrodatnou odchylku množství chlorofylu v listech ostřice zvlášť pro každý druh ošetření a každý způsob hnojení dusíkem. Protože v datech OSTRICE máme tři úrovně ošetření (OSETR) a čtyři úrovně hnojení (DUSIK), dohromady existuje 12 možných kombinací hodnot těchto dvou veličin. Pro každou z 12 takto vytvořených skupin počítáme průměr a výběrovou směrodatnou odchylku veličiny CHLORO. Použijeme proceduru MEANS, v níž uvedeme jména faktorových proměnných DUSIK a OSETR v příkazu CLASS takto:

PROC MEANS DATA=ostrice N MEAN STD MAXDEC=3;
  CLASS dusik osetr;
  VAR chloro;
RUN;

Zde je výstup:

Analysis Variable : CHLORO Chlorofyl v listech (mg/g)

     DUSIK   OSETR  N Obs   N          Mean       Std Dev
---------------------------------------------------------
Urea        2 roky      2   2         3.850         0.071
            5 let       2   2         5.350         0.071
            8 let       2   2         5.100         1.131
Amm. sulf.  2 roky      2   2         5.600         0.566
            5 let       2   2         5.850         0.354
            8 let       2   2         5.800         0.566
IBDU        2 roky      2   2         6.500         0.707
            5 let       2   2         6.000         0.566
            8 let       2   2         7.800         0.000
Urea(SC)    2 roky      2   2         7.350         0.778
            5 let       2   2         8.600         0.000
            8 let       2   2         8.450         0.071
---------------------------------------------------------

Smysluplnost počítání směrodatné odchylky ze dvou pozorování teď pomiňme. Výsledek je jinak přesně to, co jsme si přáli. Můžeme si požádat i o jakékoli jiné statistiky, které počítá PROC MEANS a můžeme si je nechat uschovat do souboru:

PROC MEANS DATA=ostrice MEAN VAR RANGE MAXDEC=3;
  CLASS dusik osetr;
  VAR chloro;
  OUTPUT OUT=ostat MEAN=prumcl VAR=varcl RANGE=rozcl;
RUN;

Zde je výpis souboru OSTAT:

PROC PRINT DATA=ostat; RUN
OBS      DUSIK       OSETR     _TYPE_    _FREQ_     PRUMCL     VARCL     ROZCL

  1             .         .       0        24      6.35417    2.12085     4.8
  2             .    2 roky       1         8      5.82500    2.12786     4.1
  3             .    5 let        1         8      6.45000    1.89143     3.3
  4             .    8 let        1         8      6.78750    2.40411     4.2
  5    Urea               .       2         6      4.76667    0.77467     2.1
  6    Amm. sulf.         .       2         6      5.75000    0.16700     1.0
  7    IBDU               .       2         6      6.76667    0.85467     2.2
  8    Urea(SC)           .       2         6      8.13333    0.49467     1.8
  9    Urea          2 roky       3         2      3.85000    0.00500     0.1
 10    Urea          5 let        3         2      5.35000    0.00500     0.1
 11    Urea          8 let        3         2      5.10000    1.28000     1.6
 12    Amm. sulf.    2 roky       3         2      5.60000    0.32000     0.8
 13    Amm. sulf.    5 let        3         2      5.85000    0.12500     0.5
 14    Amm. sulf.    8 let        3         2      5.80000    0.32000     0.8
 15    IBDU          2 roky       3         2      6.50000    0.50000     1.0
 16    IBDU          5 let        3         2      6.00000    0.32000     0.8
 17    IBDU          8 let        3         2      7.80000    0.00000     0.0
 18    Urea(SC)      2 roky       3         2      7.35000    0.60500     1.1
 19    Urea(SC)      5 let        3         2      8.60000    0.00000     0.0
 20    Urea(SC)      8 let        3         2      8.45000    0.00500     0.1

Všimněme si, že na rozdíl od výstupu z procedury MEANS na obrazovku nyní SAS uvedl statistiky nejen pro oněch 12 kombinací, ale i pro celý soubor a pro jednotliné úrovně DUSIK a OSETR zvlášť. Veličina _TYPE_ uvádí, o jaký druh statistiky se jedná (0=všechno, 1 a 2=jednotlivé úrovně faktorů, 3=kombinace 2 faktorů), veličina _FREQ_ informuje o počtu použitých pozorování.

V proceduře MEANS lze použít i příkaz BY namísto příkazu CLASS, ale data pak musí být setříděna a výstup vypadá trochu odlišně.

1.2.2 Tabulky popisných statistik v PROC UNIVARIATE

Před použitím PROC UNIVARIATE musíme data nejprve setřídit podle faktorových veličin, jež definují požadované skupiny:

PROC SORT DATA=ostrice;
  BY dusik osetr;
RUN;

a potom vyvoláme proceduru UNIVARIATE s příkazem BY:

PROC UNIVARIATE DATA=ostrice;
  VAR chloro;
  BY dusik osetr;
  OUTPUT OUT=ostat2 N=nobs MEAN=prumchl STD=stdchl;
RUN;

Textový výstup obsahuje 12 sestav popisných statistik, které v tomto případě nejsou příliš zajímavé, protože máme málo pozorování. Výstup do souboru OSTAT2 nám dává

OBS    DUSIK         OSETR     NOBS    PRUMCHL    STDCHL
  1    Urea          2 roky      2       3.85     0.07071
  2    Urea          5 let       2       5.35     0.07071
  3    Urea          8 let       2       5.10     1.13137
  4    Amm. sulf.    2 roky      2       5.60     0.56569
  5    Amm. sulf.    5 let       2       5.85     0.35355
  6    Amm. sulf.    8 let       2       5.80     0.56569
  7    IBDU          2 roky      2       6.50     0.70711
  8    IBDU          5 let       2       6.00     0.56569
  9    IBDU          8 let       2       7.80     0.00000
 10    Urea(SC)      2 roky      2       7.35     0.77782
 11    Urea(SC)      5 let       2       8.60     0.00000
 12    Urea(SC)      8 let       2       8.45     0.07071

1.2.3 Tabulky popisných statistik v PROC TABULATE

Procedura TABULATE vytváří tabulky popisných statistik zformátované podle přání uživatele. Kromě specifikace požadovaných popisných statistik, proměnných, pro něž se statistiky mají počítat a faktorů, jež rozdělují pozorování na skupiny, vyžaduje i relativně složitý popis formátu výsledné tabulky. Použití této procedury budeme demonstrovat pouze na dvou příkladech, podrobnější popis je uveden v manuálu SAS Procedures Guide.

PROC TABULATE DATA=ostrice;
  CLASS dusik osetr;
  VAR chloro;
  TABLE dusik*osetr, (N MEAN STD)*chloro;
RUN;

Příkaz CLASS uvádí faktorové proměnné, které budou definovat skupiny pozorování, a příkaz VAR numerické proměnné, jejichž statistiky se budou počítat. Formát tabulky je určen příkazem TABLE. První část příkazu TABLE popisuje řádky tabulky, které budou v našem příkladě odpovídat všem 12 kombinacím faktorů DUSIK a OSETR. Druhá část příkazu TABLE (oddělená čárkou) udává formát sloupců. V našem případě budou ve sloupcích tři statistiky pro proměnnou CHLORO. Jejich klíčová slova v podstatě odpovídají těm, která jsou uvedena v tabulce u PROC MEANS. Zde je výsledná tabulka:

---------------------------------------------------------------
|                      |     N      |    MEAN    |    STD     |
|                      ----------------------------------------
|                      |Chlorofyl v |Chlorofyl v |Chlorofyl v |
|                      |  listech   |  listech   |  listech   |
|                      |   (mg/g)   |   (mg/g)   |   (mg/g)   |
---------------------------------------------------------------
|Režim     |Ošetření   |            |            |            |
|hnojení   |podloží    |            |            |            |
|dusíkem   |           |            |            |            |
------------------------            |            |            |
|Urea      |2 roky     |        2.00|        3.85|        0.07|
|          ----------------------------------------------------
|          |5 let      |        2.00|        5.35|        0.07|
|          ----------------------------------------------------
|          |8 let      |        2.00|        5.10|        1.13|
---------------------------------------------------------------
|Amm. sulf.|2 roky     |        2.00|        5.60|        0.57|
|          ----------------------------------------------------
|          |5 let      |        2.00|        5.85|        0.35|
|          ----------------------------------------------------
|          |8 let      |        2.00|        5.80|        0.57|
---------------------------------------------------------------
|IBDU      |2 roky     |        2.00|        6.50|        0.71|
|          ----------------------------------------------------
|          |5 let      |        2.00|        6.00|        0.57|
|          ----------------------------------------------------
|          |8 let      |        2.00|        7.80|        0.00|
---------------------------------------------------------------
|Urea(SC)  |2 roky     |        2.00|        7.35|        0.78|
|          ----------------------------------------------------
|          |5 let      |        2.00|        8.60|        0.00|
|          ----------------------------------------------------
|          |8 let      |        2.00|        8.45|        0.07|
---------------------------------------------------------------

Nevýhodou procedury TABULATE je, že používá k vytváření tabulek znaky, které nejsou součástí české znakové sady. Tato tabulka již ale byla upravena. Teď jeden složitější příklad:

PROC TABULATE DATA=ostrice;
  CLASS dusik osetr;
  VAR chloro;
  TABLE dusik ALL, (osetr ALL)*MEAN*chloro;
  KEYLABEL ALL='Dohromady'
           MEAN='Průměr';
RUN;
----------------------------------------------------------------------------
|                      |           Ošetření podloží           |            |
|                      ----------------------------------------            |
|                      |   2 roky   |   5 let    |   8 let    | Dohromady  |
|                      -----------------------------------------------------
|                      |   Průměr   |   Průměr   |   Průměr   |   Průměr   |
|                      -----------------------------------------------------
|                      |Chlorofyl v |Chlorofyl v |Chlorofyl v |Chlorofyl v |
|                      |  listech   |  listech   |  listech   |  listech   |
|                      |   (mg/g)   |   (mg/g)   |   (mg/g)   |   (mg/g)   |
----------------------------------------------------------------------------
|Režim hnojení dusíkem |            |            |            |            |
------------------------            |            |            |            |
|Urea                  |        3.85|        5.35|        5.10|        4.77|
----------------------------------------------------------------------------
|Amm. sulf.            |        5.60|        5.85|        5.80|        5.75|
----------------------------------------------------------------------------
|IBDU                  |        6.50|        6.00|        7.80|        6.77|
----------------------------------------------------------------------------
|Urea(SC)              |        7.35|        8.60|        8.45|        8.13|
----------------------------------------------------------------------------
|Dohromady             |        5.83|        6.45|        6.79|        6.35|
----------------------------------------------------------------------------

Procedurou TABULATE je samozřejmě možné vytvářet i tabulky četností (klíčové slovo N).

1.3 Výpočet tabulek četností a procent

Tabulky četností a procenta počítá PROC FREQ (libovolný počet rozměrů) a PROC TABULATE (do tří rozměrů).

1.3.1 Tabulky četností v PROC FREQ

Procedura FREQ slouží k výpočtu, výpisu a ukládání kontingenčních tabulek. Její struktura je

PROC FREQ DATA=tabdata;
  TABLES var1*var2 var3*var4 </ parametry>;
/*  < zbytek jsou nepovinné příkazy > */
  WEIGHT vaha;
  BY klasvar;
RUN;

Příkaz TABLES obsahuje seznam požadovaných tabulek. Například var1*var2 znamená dvourozměrnou tabulku četností podle úrovní veličin VAR1 (řádky) a VAR2 (sloupce). Jednorozměrná tabulka by byla prostě var1 a trojrozměrná tabulka by se psala var1*var2*var3. Seznam tabulek lze psát zkráceným zápisem tvaru (var1 var2 var3)*var4, což vytvoří tři dvourozměrné tabulky. Příkaz WEIGHT způsobí, že tabulky nebudou obsahovat četnosti, ale součty hodnot dané veličiny (zde VAHA). Příkaz BY působí standartně: spočítá se jedna tabulka pro každou úroveň veličiny KLASVAR. Předchozí setřídění dat je nutné pro použití BY.

Příkaz TABLES má několik užitečných parametrů uváděných za lomítkem na konci řádky. Parametr OUT=stabul vytvoří soubor STABUL a uschová do něj poslední spočtenou tabulku. Přepínač MISSING způsobí, že chybějící hodnoty jsou chápány jako zvláštní úroveň faktorové proměnné.

Zde je aplikace procedury FREQ na data OSTRICE:

PROC FREQ DATA=ostrice;
  TABLES blok*dusik / OUT=tabul;
RUN;

Textový výstup (v tomto případě trochu nudný) dává:

TABLE OF BLOK BY DUSIK

BLOK(Číslo pozorování)     DUSIK(Režim hnojení dusíkem)

Frequency|
Percent  |
Row Pct  |
Col Pct  |Urea    |Amm. sul|IBDU    |Urea(SC)|  Total
         |        |f.      |        |        |
----------------------------------------------
       1 |      3 |      3 |      3 |      3 |     12
         |  12.50 |  12.50 |  12.50 |  12.50 |  50.00
         |  25.00 |  25.00 |  25.00 |  25.00 |
         |  50.00 |  50.00 |  50.00 |  50.00 |
----------------------------------------------
       2 |      3 |      3 |      3 |      3 |     12
         |  12.50 |  12.50 |  12.50 |  12.50 |  50.00
         |  25.00 |  25.00 |  25.00 |  25.00 |
         |  50.00 |  50.00 |  50.00 |  50.00 |
----------------------------------------------
Total           6        6        6        6       24
           25.00    25.00    25.00    25.00   100.00

Ve výstupním souboru TABUL je osm pozorování:

OBS    BLOK   DUSIK         COUNT    PERCENT
 1       1     Urea            3        12.5
 2       1     Amm. sulf.      3        12.5
 3       1     IBDU            3        12.5
 4       1     Urea(SC)        3        12.5
 5       2     Urea            3        12.5
 6       2     Amm. sulf.      3        12.5
 7       2     IBDU            3        12.5
 8       2     Urea(SC)        3        12.5

Nechceme-li v naší tabulce procenta řádková, sloupcová, resp. celková, přidáme do příkazu TABLES přepínače NOROW, NOCOL, resp. NOPERCENT. Pak dostaneme třeba

PROC FREQ DATA=ostrice; TABLES blok*dusik / NOROW NOCOL NOPERCENT; RUN
TABLE OF BLOK BY DUSIK

BLOK(Číslo pozorování)     DUSIK(Režim hnojení dusíkem)

Frequency|Urea    |Amm. sul|IBDU    |Urea(SC)| Total
         |        |f.      |        |        |
----------------------------------------------
       1 |      3 |      3 |      3 |      3 |     12
----------------------------------------------
       2 |      3 |      3 |      3 |      3 |     12
----------------------------------------------
Total           6        6        6        6       24

Jak je vidět, zabránit SASu v tištění nežádoucích detailů dá někdy dost práce.

1.3.2 Tabulky četností v PROC TABULATE

Procedura TABULATE umožňuje sestavovat tabulky četností, procent a popisných statistik (viz též kapitola 1.2.3). Ovládání je poměrně složité, zde se omezíme na jediný nekomentovaný příklad.

PROC TABULATE DATA=anketa;
  CLASS pohl r3;
  TABLE r3*(N PCTN<pohl ALL>), pohl ALL;
  KEYLABEL N='Četnost'
           PCTN='Proc.'
           ALL='Dohromady';
RUN;
---------------------------------------------------------------
|                      |         Pohlaví         |            |
|                      ---------------------------            |
|                      |    Žena    |    Muž     | Dohromady  |
---------------------------------------------------------------
|Obliba    |           |            |            |            |
|Coca Cola |           |            |            |            |
------------------------            |            |            |
|2         |Četnost    |        1.00|        1.00|        2.00|
|          ----------------------------------------------------
|          |Proc.      |       50.00|       50.00|      100.00|
---------------------------------------------------------------
|3         |Četnost    |        1.00|        1.00|        2.00|
|          ----------------------------------------------------
|          |Proc.      |       50.00|       50.00|      100.00|
---------------------------------------------------------------
|5         |Četnost    |           .|        1.00|        1.00|
|          ----------------------------------------------------
|          |Proc.      |           .|      100.00|      100.00|
---------------------------------------------------------------
|6         |Četnost    |        1.00|           .|        1.00|
|          ----------------------------------------------------
|          |Proc.      |      100.00|           .|      100.00|
---------------------------------------------------------------
|7         |Četnost    |        2.00|        2.00|        4.00|
|          ----------------------------------------------------
|          |Proc.      |       50.00|       50.00|      100.00|
---------------------------------------------------------------

1.4  Krabicové diagramy, normální diagramy a testy normality

Procedura UNIVARIATE na požádání zhotoví velmi primitivní listové diagramy (stem and leaf plots), krabicové diagramy (box plots) a normální diagramy (normal probability plots) anebo provede testy normality. Obrázky se tisknou znakově do OUTPUT window (proto jsou primitivní) pomocí argumentu PLOT. Test normality se vypíše, je-li uveden argument NORMAL. Je-li rozsah výběru do 2000, počítá se Durbin-Watsonova statistika, jinak Kolmogorovova-Smirnovova. Zde je příklad:

PROC UNIVARIATE DATA=ostrice PLOT NORMAL; VAR chloro; RUN;

Následuje výňatek z výpisu, výsledek testu normality (Durbin-Watsonova) je zvýrazněn tučně.

Univariate Procedure

Variable=CHLORO        Chlorofyl v listech (mg/g)

                 Moments                               Quantiles(Def=5)
 N                24  Sum Wgts         24   100% Max       8.6       99%       8.6
 Mean       6.354167  Sum           152.5    75% Q3        7.8       95%       8.6
 Std Dev    1.456314  Variance   2.120851    50% Med      6.05       90%       8.5
 Skewness   0.085636  Kurtosis   -0.84535    25% Q1        5.4       10%       4.3
 USS         1017.79  CSS        48.77958     0% Min       3.8        5%       3.9
 CV         22.91905  Std Mean   0.297269                             1%       3.8
 
 T:Mean=0   21.37515  Pr>|T|       0.0001   Range          4.8
 Num ^= 0         24  Num > 0          24   Q3-Q1          2.4
 M(Sign)          12  Pr>=|M|      0.0001   Mode           5.4
 Sgn Rank        150  Pr>=|S|      0.0001
 W:Normal   0.939364  Pr<W         0.1623
 
   Stem Leaf                     #  Boxplot
      8 566                      3     |
      8 4                        1     |
      7 889                      3  +-----+
      7 0                        1  |     |
      6 8                        1  |     |
      6 00124                    5  *--+--*
      5 669                      3  |     |
      5 2344                     4  +-----+
      4                                |
      4 3                        1     |
      3 89                       2     |
        ----+----+----+----+
       
                       Normal Probability Plot
    8.75+                                     *  *+++
        |                                   * +++
        |                               **+*++
        |                              *++
        |                           ++*
    6.25+                       **+***
        |                    ***
        |               **+*+
        |             +++
        |         ++++*
    3.75+      *++ *
        +----+----+----+----+----+----+----+----+----+----+
             -2        -1         0        +1       +2

Lepší grafické výstupy lze vytvořit pomocí vyšších grafických procedur modulu SAS/GRAPH (viz zvláštní text).

1.5  Krabicové diagramy přes kombinace úrovní faktorových veličin

Při současném použití příkazu BY a argumentu PLOT v PROC UNIVARIATE se vykreslí krabicový diagram po skupinách daných kombinacemi všech úrovní veličin uvedených v příkazu BY. Jen krátký příklad:

PROC SORT DATA=ostrice; BY dusik; RUN;
PROC UNIVARIATE DATA=ostrice PLOT;
  VAR chloro;
  BY dusik;
RUN;
Variable=CHLORO        Chlorofyl v listech (mg/g)

         |
       9 +
         |
         |
         |                                             +-----+
     8.5 +                                             *-----*
         |                                             |     |
         |                                             |     |
         |                                             |  +  |
       8 +                                             |     |
         |                                             +-----+
         |                                 +-----+
         |                                 |     |
     7.5 +                                 |     |
         |                                 |     |
         |                                 |     |
         |                                 |     |
       7 +                                 |     |
         |                                 |     |
         |                                 *--+--*        0
         |                                 |     |
     6.5 +                                 |     |
         |                                 |     |
         |                        |        |     |
         |                     +-----+     |     |
       6 +                     |     |     +-----+
         |            |        |     |        |
         |            |        *--+--*        |
         |            |        |     |        |
     5.5 +            |        |     |
         |         +-----+     +-----+
         |         |     |        |
         |         |     |
       5 +         |     |
         |         |     |
         |         *--+--*
         |         |     |
     4.5 +         |     |
         |         |     |
         |         |     |
         |         |     |
       4 +         |     |
         |         +-----+
         |            |
         |
     3.5 +
         
------------+-----------+-----------+-----------+-----------
   DUSIK              Urea    Amm. sul        IBDU    Urea(SC)

2. Testování hypotéz

2.1 Jednovýběrový t-test

Jednovýběrový t-test provádí procedura UNIVARIATE automaticky a procedura MEANS na požádání (klíčová slova T a PRT). Obě procedury počítají oboustranný test hypotézy H0: mi=0. Chceme-li testovat jinou střední hodnotu než nulovou, musíme nejdříve všechny hodnoty veličiny vhodně posunout. Zde je příklad, kde chceme testovat, zda je střední slanost řeky rovna 2,5.

DATA reka;
  INPUT slanost;
  DATALINES;
1.6
2.6
2.4
2.3
2.5
2.7
2.6
2.2
;
RUN;
DATA reka; SET reka;
  rozdil = slanost - 2.5;
RUN;
PROC UNIVARIATE DATA=reka; VAR rozdil; RUN;
/* anebo */
PROC MEANS DATA=reka T PRT; VAR rozdil; RUN;

Zde je část výstupu z PROC UNIVARIATE (výsledky t-testu jsou zvýrazněny tučně):

Univariate Procedure
Variable=ROZDIL

                 Moments                               Quantiles(Def=5)
 N                 8  Sum Wgts          8   100% Max       0.2       99%       0.2
 Mean        -0.1375  Sum            -1.1    75% Q3        0.1       95%       0.2
 Std Dev    0.350255  Variance   0.122679    50% Med     -0.05       90%       0.2
 Skewness   -1.68436  Kurtosis    3.26575    25% Q1      -0.25       10%      -0.9
 USS            1.01  CSS         0.85875     0% Min      -0.9        5%      -0.9
 CV         -254.731  Std Mean   0.123834                             1%      -0.9
 
 T:Mean=0   -1.11036  Pr>|T|       0.3035   Range          1.1
 Num ^= 0          7  Num > 0           3   Q3-Q1         0.35
 M(Sign)        -0.5  Pr>=|M|      1.0000   Mode           0.1
 Sgn Rank       -5.5  Pr>=|S|      0.4219
T je hodnota testové statistiky, Pr>|T| je dosažená hladina testu. Zde je výstup z PROC MEANS:
Analysis Variable : ROZDIL

           T  Prob>|T|
----------------------
  -1.1103588    0.3035
----------------------

2.2 Párový t-test

Párový t-test není nic jiného než jednovýběrový t-test aplikovaný na rozdíl hodnot dvou korelovaných veličin. Příklad:

DATA kukurice;
  INPUT pozemek odrA odrB;
  rozdil = odrA - odrB;
  DATALINES;
1  48.2  41.5
2  44.6  40.1
3  49.7  44.0
4  40.5  41.2
5  54.6  49.8
6  47.1  41.7
7  46.8  51.4
;
RUN;
PROC MEANS DATA=kukurice T PRT; VAR rozdil; RUN;
Analysis Variable : ROZDIL

           T  Prob>|T|
----------------------
   1.9830204    0.0946
----------------------

2.3 Dvouvýběrový t-test

Dvouvýběrový t-test k porovnání středních hodnot dvou výběrů se stejným  rozptylem počítá mj. procedura TTEST. Hodnoty obou výběrů musí být v datech uloženy v jediné numerické veličině (třeba X), zatímco jiná veličina se dvěma úrovněmi (třeba S) určuje, do kterého výběru každé pozorování patří. T-test se provede takto:

PROC TTEST DATA=mojedata;
  CLASS S;
  VAR X;
RUN;

Zde je příklad:

DATA reka;
  INPUT sud slanost;
  DATALINES;
5   5.0
5   6.9
5   6.0
5   5.8
5   2.8
5   5.3
5   4.1
5   4.5
3   1.6
3   2.6
3   2.4
3   2.3
3   2.5
3   2.7
3   2.6
3   2.2
;
RUN;
PROC TTEST DATA=reka;
  CLASS sud;
  VAR slanost;
RUN;
TTEST PROCEDURE

Variable: SLANOST

SUD       N          Mean       Std Dev     Std Error    Variances        T       DF    Prob>|T|
-----------------------------------------------------    ---------------------------------------
  3       8    2.36250000    0.35025501    0.12383385    Unequal    -5.7867      8.1      0.0004
  5       8    5.05000000    1.26603995    0.44761272    Equal      -5.7867     14.0      0.0000

For H0: Variances are equal, F' =  13.07    DF = (7,7)    Prob>F' = 0.0031

Výsledek dvouvýběrového t-testu je vyznačen tučně. Ve sloupci T je hodnota T-statistiky, DF obsahuje počet stupňů volnosti a Prob>|T| dosaženou hladinu testu. O řádek výš je výsledek Welchova testu, dole je F test na porovnání rozptylů.

2.4 Welchův test (porovnání středních hodnot za nestejného rozptylu)

Welchův test je přibližný test na porovnání středních hodnot dvou výběrů z normálního rozdělení při nestejném rozptylu (Behrens-Fisherův problém). Testová statistika je stejná jako u t-testu, ale počet stupňů volnosti referenčního t-rozdělení je aproximován. Welchův test je uveden ve standartním výstupu procedury TTEST (viz příklad).

TTEST PROCEDURE

Variable: SLANOST

SUD       N          Mean       Std Dev     Std Error    Variances        T       DF    Prob>|T|
-----------------------------------------------------    ---------------------------------------
  3       8    2.36250000    0.35025501    0.12383385    Unequal    -5.7867      8.1      0.0004
  5       8    5.05000000    1.26603995    0.44761272    Equal      -5.7867     14.0      0.0000

For H0: Variances are equal, F' =  13.07    DF = (7,7)    Prob>F' = 0.0031

2.5 Znaménkový test

Znaménkový test porovnává medián náhodného výběru s nulou a je automaticky počítán v proceduře UNIVARIATE.

PROC UNIVARIATE DATA=kukurice;
  VAR rozdil;
RUN;
Univariate Procedure

Variable=ROZDIL

                 Moments                               Quantiles(Def=5)
 N                 7  Sum Wgts          7   100% Max       6.7       99%       6.7
 Mean       3.114286  Sum            21.8    75% Q3        5.7       95%       6.7
 Std Dev    4.155089  Variance   17.26476    50% Med       4.8       90%       6.7
 Skewness   -1.40445  Kurtosis   0.865916    25% Q1       -0.7       10%      -4.6
 USS          171.48  CSS        103.5886     0% Min      -4.6        5%      -4.6
 CV         133.4203  Std Mean   1.570476                             1%      -4.6
 
 T:Mean=0    1.98302  Pr>|T|       0.0946   Range         11.3
 Num ^= 0          7  Num > 0           5   Q3-Q1          6.4
  M(Sign)        1.5  Pr>=|M|      0.4531   Mode          -4.6
 Sgn Rank         10  Pr>=|S|      0.1094  

Hodnota testové statistiky znaménkového testu je označena M(Sign) a dosažená hladina testu je Pr>=|M|.

2.6 Jednovýběrový Wilcoxonův test (signed rank)

Stejně jako znaménkový test, i jednovýběrový Wilcoxonův test porovnává medián náhodného výběru s nulou a je automaticky počítán v proceduře UNIVARIATE.

PROC UNIVARIATE DATA=kukurice;
  VAR rozdil;
RUN;
Univariate Procedure

Variable=ROZDIL

                 Moments                               Quantiles(Def=5)
 N                 7  Sum Wgts          7   100% Max       6.7       99%       6.7
 Mean       3.114286  Sum            21.8    75% Q3        5.7       95%       6.7
 Std Dev    4.155089  Variance   17.26476    50% Med       4.8       90%       6.7
 Skewness   -1.40445  Kurtosis   0.865916    25% Q1       -0.7       10%      -4.6
 USS          171.48  CSS        103.5886     0% Min      -4.6        5%      -4.6
 CV         133.4203  Std Mean   1.570476                             1%      -4.6
 
 T:Mean=0    1.98302  Pr>|T|       0.0946   Range         11.3
 Num ^= 0          7  Num > 0           5   Q3-Q1          6.4
 M(Sign)         1.5  Pr>=|M|      0.4531   Mode          -4.6
 Sgn Rank         10  Pr>=|S|      0.1094
Hodnota testové statistiky Wilcoxonova testu je označena Sgn Rank a dosažená hladina testu je Pr>=|S|.

2.7 Dvouvýběrový Wilcoxonův test (rank sum)

Tento test počítá procedura NPAR1WAY s argumentem WILCOXON. Syntaxe je jinak úplně stejná jako u dvouvýběrového t-testu.

PROC NPAR1WAY DATA=reka WILCOXON;
  CLASS sud;
  VAR slanost;
RUN;
N P A R 1 W A Y  P R O C E D U R E

Wilcoxon Scores (Rank Sums) for Variable SLANOST

Classified by Variable SUD

                                    Sum of         Expected          Std Dev             Mean
       SUD              N           Scores         Under H0         Under H0            Score
       5                8            100.0             68.0       9.51490060       12.5000000
       3                8             36.0             68.0       9.51490060        4.5000000

Average Scores Were Used for Ties

Wilcoxon 2-Sample Test (Normal Approximation) (with Continuity Correction of .5)

S =  100.000                   Z =  3.31060                   Prob > |Z| = 0.0009

T-Test Approx. Significance = 0.0048

Kruskal-Wallis Test (Chi-Square Approximation)

CHISQ =  11.311                   DF =  1                   Prob > CHISQ = 0.0008

Výsledek je vyznačen tučně. S je součet pořadí přes první skupinu, Z je standartisovaná Wilcoxonova statistika, Prob>|Z| je dosažená hladina testu spočítaná z normální aproximace.

2.8 F-test rovnosti dvou rozptylů

F-test rovnosti rozptylů dvou výběrů z normálního rozdělení je automaticky prováděn procedurou TTEST. Výstup z příkladu je zde:

TTEST PROCEDURE

Variable: SLANOST

SUD       N          Mean       Std Dev     Std Error    Variances        T       DF    Prob>|T|
-----------------------------------------------------    ---------------------------------------
  3       8    2.36250000    0.35025501    0.12383385    Unequal    -5.7867      8.1      0.0004
  5       8    5.05000000    1.26603995    0.44761272    Equal      -5.7867     14.0      0.0000

For H0: Variances are equal, F' =  13.07    DF = (7,7)    Prob>F' = 0.0031

Pozor na interpretaci F statistiky! SAS ji značí F', protože se vždy jedná o podíl většího a menšího odhadu rozptylu obou výběrů, tj.

F' = max(s12,s22)/min(s1 2,s22),

což je vždy větší než 1. Tento test zamítá pro velké hodnoty testové statistiky a je to test oboustranný.

2.9 Chí-kvadrát test dobré shody

Procedura FREQ umí počítat chí-kvadrát test dobré shody při známých pravděpodobnostech. V podstatě se jedná o testování hypotézy, že realisace vektoru z multinomického rozdělení odpovídá danému vektoru pravděpodobností. Test této hypotézy se vyvolá zadáním argumentu TESTP=(p1 p2 .. pk) v příkazu TABLES, kde p1 .. pn jsou konkrétní hodnoty hypotetických pravděpodobností.

Jako příklad se podívejme na počet dětí narozených v jednotlivých měsících (Anděl, Matematická statistika). Hypotéza je, že děti se rodí rovnoměrně.

DATA deti;
INPUT mesic pdni pdeti;
DATALINES;
1 31 21182
2 28 19960
3 31 22787
4 30 22805
5 31 23120
6 30 21859
7 31 21367
8 31 20357
9 30 20946
10 31 20037
11 30 18728
12 31 19592
;
RUN;
PROC FREQ DATA=deti;
  TABLES mesic / TESTP=(0.08493 0.07671 0.08493 0.08219 0.08493 0.08219
                        0.08493 0.08493 0.08219 0.08493 0.08219 0.08493);
  WEIGHT pdeti;
RUN;

Příkaz WEIGHT dává SASu na vědomí, že každé pozorování vstupních dat representuje více než jedno dítě (počet dětí je uveden ve veličině PDETI). V argumentu TESTP musíme uvést dvanáct hodnot teoretických pravděpodobností. Tyto hodnoty jsou 28/365, 30/365 nebo 31/365, podle toho, o jaký měsíc se jedná. Protože SAS požaduje vypsání konkrétních hodnot a nelíbí se mu výrazy typu 28/365, musíme si všechny pravděpodobnosti spočítat sami, zaokrouhlit je na rozumný počet desetinných míst a ručně vypsat. Při práci s moderním softwarovým produktem třetího tisíciletí, jako je SAS, se prostě neobejdeme bez kalkulačky a dosyta si užijeme bezduchého kopírování řady číslic, s tím je třeba se smířit.

A zde máme perně vydřený výsledek:

Test   Cumulative  Cumulative
MESIC   Frequency   Percent   Percent   Frequency    Percent
-------------------------------------------------------------
    1      21182       8.4       8.5       21182        8.4
    2      19960       7.9       7.7       41142       16.3
    3      22787       9.0       8.5       63929       25.3
    4      22805       9.0       8.2       86734       34.3
    5      23120       9.1       8.5      109854       43.5
    6      21859       8.6       8.2      131713       52.1
    7      21367       8.5       8.5      153080       60.6
    8      20357       8.1       8.5      173437       68.6
    9      20946       8.3       8.2      194383       76.9
   10      20037       7.9       8.5      214420       84.8
   11      18728       7.4       8.2      233148       92.2
   12      19592       7.8       8.5      252740      100.0

Chi-Square Test for Specified Proportions
-----------------------------------------
Statistic = 1004.104     DF = 11     Prob = 0.001

Skutečná hodnota statistiky je 1003.744, chyba vznikla zaokrouhlením teoretických pravděpodobností.

2.10 Testování nezávislosti v kontingenční tabulce

V proceduře FREQ můžeme testovat nezávislost v tabulce typu M x N pomocí chí-kvadrát testu, testu poměrem věrohodností (tzv. G2 test) anebo Fisherovým faktoriálovým testem. Stačí přidat argumenty CHISQ případně EXACT k příkazu TABLES.

Jako příklad budeme testovat, zda postoj voličů k zákonu právě projednávanému parlamentem (třeba zákon o zachování hmotnosti) souvisí s jejich politickou orientací (Zvára, Štěpán: Pravděpodobnost a matematická statistika):

DATA pruzkum;
  INPUT postoj $ orient $ pocet;
  DATALINES;
pro levice 4
proti levice 7
pro pravice 9
proti pravice 5
;
RUN;
PROC FREQ DATA=pruzkum;
  TABLES postoj*orient / CHISQ NOROW NOCOL NOPERCENT;
  WEIGHT pocet;
RUN;

V proceduře FREQ vytváříme příkazem TABLES tabulku 2 x 2 podle postoje k navrhovanému zákonu a politické orientace. Počet pozorování v jednotlivých políčkách tabulky je uveden v proměnné POCET, kterou zadáme do příkazu WEIGHT. Argument CHISQ příkazu TABLES požaduje provedení testů nezávislosti. Protože se jedná o čtyřpolní tabulku, bude automaticky proveden i Fisherův test. Ostatní argumenty potlačují výpis procent v tabulce. Zde je textový výstup s vyznačenými relevantními částmi:

TABLE OF POSTOJ BY ORIENT

POSTOJ     ORIENT

Frequency|levice  |pravice |  Total
----------------------------
pro      |      4 |      9 |     13
----------------------------
proti    |      7 |      5 |     12
----------------------------
Total          11       14       25

STATISTICS FOR TABLE OF POSTOJ BY ORIENT

Statistic                     DF     Value        Prob
------------------------------------------------------
Chi-Square                     1     1.924       0.165
Likelihood Ratio Chi-Square    1     1.948       0.163
Continuity Adj. Chi-Square     1     0.968       0.325
Mantel-Haenszel Chi-Square     1     1.847       0.174
Fisher's Exact Test (Left)                       0.163
                    (Right)                      0.964
                    (2-Tail)                     0.238
Phi Coefficient                     -0.277
Contingency Coefficient              0.267
Cramer's V                          -0.277

Sample Size = 2

Hodnota chí-kvadrát statistiky je 1,924 a hodnota G2 statistiky je 1,948, obojí na 1 stupni volnosti. Dosažené hladiny jsou 0,165, resp. 0,163. Dosažená hladina oboustranného Fisherova testu je 0,238.

Zde je příklad na větší řídkou tabulku. Budeme testovat, zda v datech ANKETA spolu souvisí pohlaví respondenta (POHL) a obliba firmy Auto Škoda (R2).

PROC FREQ DATA=anketa;
  TABLES pohl*r2 / CHISQ EXACT NOROW NOCOL NOPERCENT;
RUN;

Protože se nejedná o čtyřpolní tabulku, museli jsme požádat o Fisherův test argumentem EXACT.

TABLE OF POHL BY R2

POHL(Pohlaví)     R2(Obliba Auto Škoda)

Frequency|       2|       5|       7|  Total
-------------------------------------
Žena     |      2 |      2 |      1 |      5
-------------------------------------
Muž      |      0 |      3 |      2 |      5
-------------------------------------
Total           2        5        3       10

STATISTICS FOR TABLE OF POHL BY R2

Statistic                     DF     Value        Prob
------------------------------------------------------
Chi-Square                     2     2.533       0.282
Likelihood Ratio Chi-Square    2     3.314       0.191
Mantel-Haenszel Chi-Square     1     1.920       0.166
Fisher's Exact Test (2-Tail)                     0.524
Phi Coefficient                      0.503
Contingency Coefficient              0.450
Cramer's V                           0.503

Sample Size = 10

WARNING: 100% of the cells have expected counts less
than 5. Chi-Square may not be a valid test

SAS varuje před asymptotickými testy, protože teoretické četnosti jsou menší než 5. Podíváme-li se na Fisherův test, vidíme, že dosažená hladina je 0,524.

Návrat na hlavní stránku