%Let Pgm=Utl_TblTmpLat; Proc datasets Library=work kill; run; quit; /*---------------------------------------------*\ | | | A template for producing Tables and | | Listings for Pharmaceutical Reporting | | with more flexibility and ease than | | standardized macros | | | \*---------------------------------------------*/ Options ls=157 ps=51;run; /* Create Sample Data */ Data DemRaw(Label="Create Input for Simple Demographics Table"); Retain Pat 0; Label Trt = 'Treatment' Pat = 'Patient' Wgt = 'Weight' Hgt = 'Height' Bpd = 'Diastolic Blood Pressure' Bps = 'Systolic Blood Pressure' Qol = 'Quality of Life Overall Score' Wbc = 'White Blood Cell Count' Rbc = 'Red Blood Cell Count' Age = 'Age' Bun = 'Urea Nitogen' Cre = 'Creatinine' Ast = 'AST Lab Value' Alt = 'Alt Lab Value' Glu = 'Glucose' Hiv = 'Aids 0-no 1-yes' Sex = 'Gender Male Female' Usa = 'Usa patient' Itt = 'Intend to Treat' Enr = 'Enrolled' Pox = 'Ever Had Chicken Pox' Ane = 'Ever Anemic' Smo = 'Smoker' Dia = 'Diabetic' Inc = 'Income Level Lwr, Med , Upr' Occ = 'Occupation Man, Tec, Lbr' Edu = 'Bac Mas Phd' Bla = 'African American' Mar = 'Married' Kid = 'Children' Pet = 'Type of Family Pet' ; Do Trt=1 to 5; Do Itr= 100000 to 100160; Pat+1; Select; when (Uniform(573791) < .3 ) Do; Inc=1; Occ=1; Edu=1;Pet=1; End; when (Uniform(589763) < .6 ) Do; Inc=2; Occ=2; Edu=2;Pet=2; End; Otherwise Do; Inc=3; Occ=3; Edu=3;Pet=3; End; End; %macro MkeVar(Lst); %Let Frq=Hiv Flu Sex Usa Itt Enr Pox Ane Smo Dia Bla Mar Kid; %Do Idx=1 %To 13; %Scan(&Lst.,&Idx.) = Int(1000*Uniform(-1)); If Uniform(78931) < .5 then %Scan(&Frq.,&Idx.)=0;Else %Scan(&Frq.,&Idx.)=1; %End; %Mend MkeVar; %MkeVar(Bpd Bps Qol Wbc Rbc Age Bun Cre Ast Alt Glu Wgt Hgt) Drop Itr SavTrt; Output; SavTrt=Trt; Trt=6; Output; Trt=SavTrt; End; End; Run; Proc Format; value $Grp2Des 'Hiv' = 'Aids 0-no 1-yes' 'Sex' = 'Gender Male Female' 'Usa' = 'Usa Patient' 'Itt' = 'Intend to Treat' 'Enr' = 'Enrolled' 'Pox' = 'Ever Had Chicken Pox' 'Ane' = 'Ever Anemic' 'Smo' = 'Smoker' 'Dia' = 'Diabetic' 'Inc' = 'Income Level Lower Third , Middle Third, Upper Third' 'Occ' = 'Occupation Manager, Technician, Laborer' 'Edu' = 'Educational Level Bachelors, Masters and Phd' 'Bla' = 'African American' 'Mar' = 'Married' 'Kid' = 'Children' 'Pet' = 'Type of Family Pet' 'Wgt' = 'Weight' 'Hgt' = 'Height' 'Bpd' = 'Diastolic Blood Pressure' 'Bps' = 'Systolic Blood Pressure' 'Qol' = 'Quality of Life Overall Score' 'Wbc' = 'White Blood Cell Count' 'Rbc' = 'Red Blood Cell Count' 'Age' = 'Age' 'Bun' = 'Urea Nitogen' 'Cre' = 'Creatinine' 'Ast' = 'AST Lab Value' 'Alt' = 'Alt Lab Value' 'Glu' = 'Glucose' ; Value $Num2Trt '_1'='Vze' '_2'='Pbo' '_3'='Asa' '_4'='Apc' '_5'='Pot' '_6'='All' ; Value $Inc2Lvl '1'='Lwr Third in Income' '2'='Middle Third in Income' '3'='Upper Third in Income'; Value $Edu2Lvl '1'='Bachelors Degree' '2'='Masters Degree' '3'='Phd'; Value $Pet2Lvl '1'='Dog for Family Pet' '2'='Cat for Family Pet' '3'='Fish for Family Pet'; Value $Occ2Lvl '1'='Manager' '2'='Technical' '3'='Laborer'; Value $Hiv2Lvl 0='HIV Positive' 1='HIV Negative'; Value $Sex2Lvl 0='Male' 1='Female'; Value $Itt2Lvl 0='Could Not Treat' 1='Intent to Treat'; Value $Usa2Lvl 0='US Citizen' 1='Foreign National'; Value $Enr2Lvl 0='Enrolled' 1='Not Enrolled'; Value $Pox2Lvl 0='Had Cicken Pox' 1='No Chicken Pox'; Value $Ane2Lvl 0='Anemic' 1='Not Anemic'; Value $Smo2Lvl 0='Smoker' 1='Non Smoker'; Value $Dia2Lvl 0='Diabetic' 1='Not Diabetic'; Value $Bla2Lvl 0='African American' 1='Not African American'; Value $Mar2Lvl 0='Married' 1='Single'; Value $Kid2Lvl 0='Children' 1='No Children'; Value $Flu2Lvl 0='Influenza' 1='No Influenza'; run; Proc Print; run; /* Pat Trt Wgt Hgt Bpd Bps Qol Wbc Rbc Hiv Sex Age Bun Cre Ast Alt Glu Usa Itt Enr Pox Ane Smo Dia Inc Occ Edu Bla Mar Kid Flu 1 Pbo 314 516 480 986 915 895 397 0 1 385 628 698 434 776 868 0 1 0 1 1 1 0 LWR Man PHD 1 1 0 0 2 Pbo 69 546 31 125 733 392 687 0 0 11 652 438 362 726 184 0 1 0 0 0 1 0 UPR TEC MAS 0 0 0 0 3 Pbo 852 512 297 93 447 338 897 1 0 972 286 348 518 158 379 0 0 0 0 1 0 1 UPR TEC MAS 0 0 0 0 4 Pbo 814 367 717 978 644 653 517 1 1 959 543 747 723 977 388 1 0 1 0 0 1 1 LWR Man PHD 1 0 1 1 5 Pbo 315 731 799 955 286 518 519 0 1 804 913 979 363 612 520 0 0 0 1 1 0 1 MED LBR BAC 1 0 1 1 6 Pbo 606 464 45 365 16 417 971 1 1 368 73 343 480 176 775 1 0 1 0 1 1 1 UPR TEC MAS 0 1 0 1 7 Pbo 716 538 593 731 848 981 264 0 0 808 8 894 55 528 847 0 0 1 1 0 0 1 LWR Man PHD 0 1 0 1 8 Pbo 906 521 936 452 528 216 275 0 1 314 152 626 934 197 72 0 1 1 0 0 0 0 MED LBR BAC 1 0 1 1 9 Pbo 907 640 81 77 225 431 844 1 0 117 564 565 928 797 513 1 1 0 0 0 0 1 UPR TEC MAS 1 0 1 1 10 Pbo 818 279 128 743 858 323 732 0 0 806 191 167 695 17 125 1 1 1 1 0 1 1 LWR Man PHD 0 1 1 1 11 Pbo 452 807 235 806 301 192 699 1 1 340 28 40 469 422 547 0 1 0 1 0 0 1 LWR Man PHD 0 0 0 1 12 Pbo 627 694 891 209 700 149 73 0 0 583 658 489 323 461 758 1 1 1 1 0 1 0 MED LBR BAC 1 0 1 1 13 Pbo 405 882 958 306 986 338 459 0 0 698 490 309 799 441 527 1 0 0 0 0 0 1 MED LBR BAC 0 1 0 1 14 Pbo 525 114 319 9 379 821 252 0 0 37 949 890 886 424 11 1 1 1 0 0 0 0 LWR Man PHD 0 0 1 1 15 Pbo 805 573 336 808 307 399 739 1 0 301 348 437 236 242 318 0 1 0 0 1 0 0 MED LBR BAC 1 0 1 0 16 Pbo 810 728 492 884 994 23 869 1 1 922 764 369 665 789 47 0 0 1 0 1 1 0 LWR Man PHD 0 1 1 1 17 Pbo 401 76 885 788 892 488 605 1 1 883 215 643 898 388 124 1 1 0 1 1 1 0 MED LBR BAC 1 1 1 1 18 Pbo 692 921 395 396 426 65 927 0 1 847 248 823 68 272 533 1 1 1 1 1 1 0 UPR TEC MAS 0 0 0 1 19 Pbo 475 256 553 393 711 815 56 1 0 323 448 532 768 734 808 1 1 1 1 0 1 1 UPR TEC MAS 0 1 0 0 20 Pbo 984 598 546 401 659 970 805 1 1 671 806 517 404 61 574 1 0 1 1 1 0 1 UPR TEC MAS 0 1 0 1 21 Pbo 76 740 870 486 969 42 438 0 0 228 27 554 244 423 735 1 1 1 1 0 0 0 MED LBR BAC 0 0 0 1 22 Pbo 606 451 598 680 325 907 949 1 1 817 331 496 109 244 319 1 0 0 0 1 0 1 MED LBR BAC 0 1 1 0 23 Pbo 759 189 401 291 896 942 256 0 1 57 604 622 271 259 794 1 0 0 1 1 0 1 LWR Man PHD 1 1 0 0 24 Pbo 756 401 984 450 119 331 888 0 0 684 792 484 905 484 998 0 1 1 0 1 1 0 MED LBR BAC 1 1 0 0 25 Pbo 863 188 895 882 636 93 712 1 0 741 160 779 892 824 336 1 0 0 0 1 1 1 UPR TEC MAS 0 1 0 0 26 Pbo 109 538 336 102 599 168 566 0 1 581 509 400 951 232 283 0 0 1 0 0 1 1 LWR Man PHD 0 1 0 0 27 Pbo 380 570 933 241 542 396 948 1 0 924 818 366 616 841 462 1 0 0 0 1 1 1 LWR Man PHD 1 1 0 1 28 Pbo 885 566 779 50 194 944 579 1 1 268 594 153 555 262 799 1 1 1 1 1 0 0 UPR TEC MAS 1 0 0 1 29 Pbo 196 158 473 698 35 554 43 0 1 804 359 601 509 214 78 0 0 0 1 1 0 0 MED LBR BAC 0 0 0 1 30 Pbo 377 643 66 97 180 485 232 1 1 317 738 326 746 495 307 0 0 1 0 0 0 0 MED LBR BAC 1 0 0 1 31 Pbo 355 794 643 673 524 661 634 0 0 643 293 899 819 184 695 0 0 1 0 0 0 1 UPR TEC MAS 0 1 0 0 32 Pbo 311 370 635 322 896 627 697 1 1 751 853 3 788 276 298 0 1 1 0 0 0 0 UPR TEC MAS 1 1 1 0 33 Pbo 665 127 754 57 369 337 222 0 0 28 166 33 801 779 853 1 1 1 1 0 0 1 UPR TEC MAS 1 1 1 1 34 Pbo 958 941 714 24 727 824 261 0 0 712 165 136 351 899 766 1 0 0 1 0 0 0 MED LBR BAC 1 1 1 1 35 Pbo 589 810 654 458 489 209 253 0 1 140 854 425 211 808 672 1 0 1 0 1 0 1 LWR Man PHD 0 1 1 1 36 Pbo 799 616 359 650 407 968 7 1 0 188 444 411 69 608 981 0 1 0 1 1 1 0 LWR Man PHD 1 0 0 1 37 Pbo 600 268 135 334 337 859 585 0 1 642 415 299 544 937 8 0 1 1 0 0 0 1 UPR TEC MAS 1 1 1 0 */ /*--------------------------*\ | Ordinal Data and Binary | \*--------------------------*/ Ods Exclude All; ods output Summary=DemUnv; Proc Means Data=DemRaw N Sum Mean Median Stddev Max Min StdErr Range Lclm Uclm P5 P95 Stderr; Class Trt; Var Bpd Bps Qol Wbc Rbc Age Bun Cre Ast Alt Glu Wgt Hgt; Run; Ods output close; /* Output from Above Only five Obs out -- One ob per treat with approx 550 columns sample of weight section below VName_ Label_ Wgt_ Wgt_ Obs Trt NObs Wgt Wgt Wgt_N Wgt_Sum NMiss Wgt_Mean Median Wgt_StdDev Wgt_Max Wgt_Min 1 1 161h Wgt Weight 161 81056 0 503.45341615 530 293.49167259 961 1 2 2 161h Wgt Weight 161 77668 0 482.40993789 458 299.75484717 999 0 3 3 161h Wgt Weight 161 71115 0 441.70807453 450 284.34773253 987 0 4 4 161h Wgt Weight 161 82280 0 511.05590062 526 278.86791785 998 6 5 5 161h Wgt Weight 161 79652 0 494.73291925 508 280.89154397 992 3 */ Proc transpose Data=DemUnv Out=DemXpo(Rename=_Label_=Label Where=(Substr(_Name_,1,3) Not In ('Pat','Trt'))); Var Trt _Numeric_; Id Trt; Run; /* Output from above 805 observations only weight section shown Obs _NAME_ _LABEL_ _1 _2 _3 _4 _5 _6 1 NObs N Obs 161.00 161.00 161.00 161.00 161.00 805 2 Wgt_N N 161.00 161.00 161.00 161.00 161.00 805 3 Wgt_Sum Sum 81056.00 77668.00 71115.00 82280.00 79652.00 338000 4 Wgt_NMiss N Miss 0.00 0.00 0.00 0.00 0.00 0.00 5 Wgt_Mean Mean 503.45 482.41 441.71 511.06 494.73 494.73 6 Wgt_Median Median 530.00 458.00 450.00 526.00 508.00 508.00 7 Wgt_StdDev Std Dev 293.49 299.75 284.35 278.87 280.89 280.89 8 Wgt_Max Maximum 961.00 999.00 987.00 998.00 992.00 992.00 9 Wgt_Min Minimum 1.00 0.00 0.00 6.00 3.00 3.00 10 Wgt_StdErr Std Error 23.13 23.62 22.41 21.98 22.14 22.14 11 Wgt_Range Range 960.00 999.00 987.00 992.00 989.00 989.00 12 Wgt_LCLM Lower 95% CL for Mean 457.77 435.75 397.45 467.65 451.01 451.01 13 Wgt_UCLM Upper 95% CL for Mean 549.13 529.06 485.97 554.46 538.45 538.45 14 Wgt_P5 5th Ptcl 43.00 35.00 26.00 48.00 40.00 40.00 15 Wgt_P95 95th Pctl 928.00 968.00 901.00 963.00 902.00 902.00 16 Wgt_QRange Quartile Range 533.00 520.00 475.00 435.00 503.00 503.00 */ /*--------------------------*\ | Nominal Data | \*--------------------------*/ Proc Transpose Data=DemRaw Out=DemXpoNom ; by Pat Trt; Var Inc Edu Pet Occ Hiv Flu Sex Usa Itt Enr Pox Ane Smo Dia Bla Mar Kid; run; /* Obs Pat Trt _NAME_ _LABEL_ COL1 1 1 1 Inc Income Level Lwr, Med , Upr 3 2 1 1 Edu Bac Mas Phd 3 3 1 1 Pet Type of Family Pet 3 4 1 1 Occ Occupation Man, Tec, Lbr 3 5 2 1 Inc Income Level Lwr, Med , Upr 2 6 2 1 Edu Bac Mas Phd 2 7 2 1 Pet Type of Family Pet 2 8 2 1 Occ Occupation Man, Tec, Lbr 2 9 3 1 Inc Income Level Lwr, Med , Upr 3 10 3 1 Edu Bac Mas Phd 3 11 3 1 Pet Type of Family Pet 3 12 3 1 Occ Occupation Man, Tec, Lbr 3 */ Proc sort data=DemXpoNom; By _name_; run; Ods Output Observed=DemNom(Where=(label ne 'Sum') rename=Sum=_6); Proc Corresp Data=DemXpoNom(Where=(Trt ne 6)) Observed dim=1; By _name_; Table Col1, Trt; Run; Ods Output Close; Ods Select All; Run; /* Obs _Name_ _Label_ _1 _2 _3 _4 _5 1 Edu 1 34 63 44 62 57 2 Edu 2 74 55 68 66 65 3 Edu 3 53 43 49 33 39 4 Inc 1 34 63 44 62 57 5 Inc 2 74 55 68 66 65 6 Inc 3 53 43 49 33 39 7 Occ 1 34 63 44 62 57 8 Occ 2 74 55 68 66 65 9 Occ 3 53 43 49 33 39 10 Pet 1 34 63 44 62 57 11 Pet 2 74 55 68 66 65 12 Pet 3 53 43 49 33 39 */ Proc sql; Select Count(Pat) into :GrnPatCnt From DemRaw; Select Resolve('%Let _'!!Put(Trt,1.)!!'=%Sysfunc(Putc(_'!!Put(Trt,1.)!!',$Num2Trt.))#(N='!!Put(Count(Trt),4.)!!');') as Dum from DemRaw Group by Trt; Create Table DemPre as Select Put(_name_,$Grp2Des.) as GrpDes, Putc(Label!!' ',compress('$'!!_Name_!!'2Lvl32.')) as VarDes, Put(_1,3.)!!'('!!put(100*_1/ &GrnPatCnt.,4.1)!!'%)' as _1, Put(_2,3.)!!'('!!put(100*_2/ &GrnPatCnt.,4.1)!!'%)' as _2, Put(_3,3.)!!'('!!put(100*_3/ &GrnPatCnt.,4.1)!!'%)' as _3, Put(_4,3.)!!'('!!put(100*_4/ &GrnPatCnt.,4.1)!!'%)' as _4, Put(_5,3.)!!'('!!put(100*_5/ &GrnPatCnt.,4.1)!!'%)' as _5, Put(_6,3.)!!'('!!put(100*_6/ &GrnPatCnt.,4.1)!!'%)' as _6 From DemNom Union All Select Put(substr(_name_,1,3),$Grp2Des.) as GrpDes, Putc(Label!!' ',compress('$'!!_Name_!!'2Lvl32.')) as VarDes, Put(_1,8.1) as _1, Put(_2,8.1) as _2, Put(_3,8.1) as _3, Put(_4,8.1) as _4, Put(_5,8.1) as _5, Put(_6,8.1) as _6 From DemXpo ; Quit; Run; Proc Report Data=DemPre Nowd Split='#' Box ; Cols GrpDes VarDes _1 _2 _3 _4 _5 _6 ; Define GrpDes / Group Noprint; Define VarDes / Display "Statistic" right width=22; Define _1 / Display "&_1" ; Define _2 / Display "&_2" ; Define _3 / Display "&_3" ; Define _4 / Display "&_4" ; Define _5 / Display "&_5" ; Define _6 / Display "&_6" ; Break Before GrpDes / ; Compute Before GrpDes; line @1 GrpDes $64.; EndComp; Run; Quit; Run;