/*********************************************************** This example illustrates: How to create user-defined formats How to recode continuous variables into ordinal categories The following tests are illustrated: Chi-square goodness of fit test Binomial test of proportion for a two-level variable Exact Binomial test Pearson Chi-square test Fisher's exact test Cochran's test for trend Procs used: Proc Format Proc Means Proc Freq Proc Contents Filename: frequencies.sas ************************************************************/ OPTIONS FORMCHAR="|----|+|---+=|-/\<>*"; OPTIONS NODATE PAGENO=1 FORMDLIM=" "; PROC FORMAT; VALUE AGEFMT 1 = "1: Age 19-29" 2 = "2: Age 30-39" 3 = "3: Age >39"; VALUE HIAGEFMT 1 = "1: Age >39" 2 = "2: Age <=39"; VALUE HICHOLFMT 1 = "1: Chol >=240" 2 = "2: Chol <240"; VALUE CHOLCATFMT 1 = "1: Chol <200" 2 = "2: Chol 200-239" 3 = "3: Chol >=240"; VALUE PILLFMT 1 = "1: Pill" 2 = "2: No Pill"; VALUE WTFMT 1 = "1: Wt <120kg" 2 = "2: Wt 120-139kg" 3 = "3: Wt >=140kg"; VALUE HIBMIFMT 1 = "1: BMI>23" 2 = "2: BMI<=23"; RUN; libname b510 "c:\documents and settings\kwelch\desktop\b510"; DATA B510.WERNER; INFILE "werner2.dat"; INPUT ID 1-4 AGE 5-8 HT 9-12 WT 13-16 PILL 17-20 CHOL 21-24 ALB 25-28 CALC 29-32 URIC 33-36 PAIR 37-39; IF HT = 999 then HT = .; IF WT = 999 then WT = .; IF ALB = 99 then ALB = .; IF CALC = 99 then CALC = .; IF URIC = 99 then URIC = .; WTKG = WT*.39; HTCM = HT*2.54; BMI = WTKG/(HTCM/100)**2; IF BMI > 23 then HIBMI = 1; IF 0<=BMI<=23 then HIBMI = 2; IF AGE NOT=. THEN DO; IF AGE <= 29 THEN AGEGROUP=1; IF AGE > 29 AND AGE <= 39 THEN AGEGROUP=2; IF AGE > 39 THEN AGEGROUP=3; IF AGE > 39 THEN HIAGE=1; IF AGE <= 39 THEN HIAGE=2; END; IF CHOL >= 400 OR CHOL < 100 THEN CHOL=.; IF CHOL NOT=. THEN DO; IF CHOL >= 240 THEN HICHOL=1; IF CHOL < 240 THEN HICHOL=2; IF CHOL < 200 THEN CHOLCAT=1; IF CHOL >= 200 AND CHOL < 240 THEN CHOLCAT=2; IF CHOL >= 240 THEN CHOLCAT=3; END; IF WT NOT=. THEN DO; IF WT < 120 THEN WTCAT=1; IF WT >= 120 AND WT < 140 THEN WTCAT=2; IF WT >= 140 THEN WTCAT=3; END; DROP WTKG HTCM; RUN; TITLE "DESCRIPTIVE STATISTICS"; PROC MEANS; RUN; /*CHECK RECODES OF VARIABLES INTO CATEGORIES*/ TITLE "CHECKING RECODE OF WT INTO WTCAT"; PROC MEANS DATA=B510.WERNER; CLASS WTCAT; VAR WT; FORMAT WTCAT WTFMT.; RUN; TITLE "CHECKING RECODE OF AGE INTO AGEGROUP"; PROC MEANS DATA=B510.WERNER; CLASS AGEGROUP; VAR AGE; FORMAT AGEGROUP AGEFMT.; RUN; TITLE "CHECKING RECODE OF CHOL INTO HICHOL"; PROC MEANS DATA=B510.WERNER; CLASS HICHOL; VAR CHOL; FORMAT HICHOL HICHOLFMT.; RUN; TITLE "CHECKING RECODE OF CHOL INTO CHOLCAT"; PROC MEANS DATA=B510.WERNER; CLASS CHOLCAT; VAR CHOL; FORMAT CHOLCAT CHOLCATFMT.; RUN; /*ONEWAY FREQUENCIES*/ TITLE "ONEWAY FREQUENCIES"; PROC FREQ DATA=B510.WERNER ORDER=INTERNAL; TABLES PILL WTCAT AGEGROUP HIAGE HICHOL CHOLCAT; FORMAT AGEGROUP AGEFMT. HICHOL HICHOLFMT. PILL PILLFMT. WTCAT WTFMT. HIAGE HIAGEFMT. CHOLCAT CHOLCATFMT.; RUN; TITLE "BINOMIAL TEST"; PROC FREQ DATA=B510.WERNER ORDER=INTERNAL; TABLES HIBMI / BINOMIAL (P=.20); *EXACT BINOMIAL; FORMAT HIBMI HIBMIFMT.; RUN; TITLE "CHISQUARE GOODNESS OF FIT TEST"; PROC FREQ DATA=B510.WERNER ORDER=INTERNAL; TABLES CHOLCAT / CHISQ TESTP=(.20 .30 .50); FORMAT CHOLCAT CHOLCATFMT.; RUN; /*2x2 TABLE*/ TITLE "2x2 TABLE"; PROC FREQ DATA=B510.WERNER ORDER=INTERNAL; TABLES HIAGE*HICHOL / CHISQ EXPECTED; FORMAT HIAGE HIAGEFMT. HICHOL HICHOLFMT.; RUN; /*3X2 TABLE: ROW VARIABLE IS ORDINAL*/ TITLE1 "3X2 TABLE"; TITLE2 "THE ROW VARIABLE IS ORDINAL"; PROC FREQ DATA=B510.WERNER ORDER=INTERNAL; TABLES AGEGROUP*HICHOL / CHISQ TREND nocol nopercent; exact fisher / mc; FORMAT AGEGROUP AGEFMT. HICHOL HICHOLFMT. ; RUN; /*3X3 TABLE: BOTH ROW AND COLUMN ARE ORDINAL*/ TITLE "3X3 TABLE BOTH ORDINAL VARIABLES"; PROC FREQ DATA=B510.WERNER ORDER=INTERNAL; TABLES AGEGROUP*WTCAT / CHISQ CMH nocol nopercent; FORMAT AGEGROUP AGEFMT. WTCAT WTFMT.; RUN; /*More Examples*/ title; proc contents data=b510.cars; run; proc format; value originfmt 1="USA" 2="Europe" 3="Japan"; run; title; proc means data=b510.cars; class origin; format origin originfmt.; run; title "Row variable is nominal, column variable is ordinal"; proc freq data = b510.cars; tables origin*cylinder / chisq expected; format origin originfmt.; run; title "Row variable is nominal, column variable is ordinal"; proc freq data = b510.cars; tables origin*cylinder / chisq expected; format origin originfmt.; run; title "Row variable is nominal, column variable is ordinal"; title2 "Try Fisher's Exact test"; proc freq data = b510.cars; tables origin*cylinder / chisq expected; exact fisher / mc; format origin originfmt.; run;