/* This program was supplied by a SAS customer as an example of something */
/* that is DIFFICULT to read. Do you agree with that assessment? */
/* See the reformatted version to compare. */
RSUBMIT; libname project '/project'; libname mysas '/project/smith';
data totsubset;
set project.total_consolidated(keep=vaers_id onstdays symc1-symc20 vax1-vax7 age_yrs state recvdate);
data shutoff; length vaers_id $8; vaers_id='999999-9';
data vax_totals (keep=vax) symptom_totals (keep=c1) two_symptom_combos (keep=c1 c2)
three_symptom_combos (keep=c1-c3) four_symptom_combos (keep=c1-c4)
vax_symptom_combos (keep=vax c1) vax_two_symptom_combos (keep=vax c1 c2)
vax_three_symptom_combos (keep=vax c1-c3) vax_four_symptom_combos (keep=vax c1-c4);
merge totsubset shutoff (in=thats_all_folks); by vaers_id;
array syms $21 symc1-symc20; length c1-c4 symhold onset_symp $21 stage $7 vax $6;
array vaxs $6 vax1-vax7; length pair $30; retain totrep 0;
if thats_all_folks=1 then do; call symput('total', totrep); stop; end; totrep=totrep+1;
onset=onstdays; if onset ne . then do; if onset<2 then onset_symp='EARLY ONSET'; count=1;
do while (count<21); if syms(count)=' ' then do; syms(count)=onset_symp; count=20; end; count=count+1; end; end;combo=0;
do j=1 to 20; if syms(j)=' ' then syms(j)='ZZZZZZ'; else do;combo=combo+1; syms(j)=trim(left(syms(j))); end; end;
do j=1 to 19; do k=j+1 to 20; if syms(k)<syms(j) then do;symhold=syms(k); syms(k)=syms(j); syms(j)=symhold; end; end;end;first=1;
do m=1 to 7; if vaxs(m) ne ' ' then do; vax=vaxs(m); output vax_totals;
do i=1 to combo; c1=syms(i); if first=1 then output symptom_totals; output vax_symptom_combos;
do j=i+1 to combo; c2=syms(j); if first=1 then output two_symptom_combos; output vax_two_symptom_combos;
do k=j+1 to combo; c3=syms(k); if first=1 then output three_symptom_combos; output vax_three_symptom_combos;
do l=k+1 to combo; c4=syms(l); if first=1 then output four_symptom_combos; output vax_four_symptom_combos;
end; end; end; end; first=2; end; end; proc sort data=vax_four_symptom_combos; by c1 c2 c3 c4 vax;
data mysas.vax_four_symptom_combos; set vax_four_symptom_combos; by c1 c2 c3 c4 vax; retain sum;
if first.c1=1 or first.c2=1 or first.c3=1 or first.c4=1 or first.vax=1 then sum=0; sum=sum+1;
if last.c1=1 or last.c2=1 or last.c3=1 or last.c4=1 or last.vax=1 then do; if sum>4 then output; end;
proc sort data=vax_three_symptom_combos; by c1 c2 c3 vax;
data mysas.vax_three_symptom_combos; set vax_three_symptom_combos; by c1 c2 c3 vax; retain sum;
if first.c1=1 or first.c2=1 or first.c3=1 or first.vax=1 then sum=0; sum=sum+1;
if last.c1=1 or last.c2=1 or last.c3=1 or last.vax=1 then do; if sum>4 then output; end;
proc sort data=vax_two_symptom_combos; by c1 c2 vax;
data mysas.vax_two_symptom_combos; set vax_two_symptom_combos; by c1 c2 vax; retain sum;
if first.c1=1 or first.c2=1 or first.vax=1 then sum=0; sum=sum+1;
if last.c1=1 or last.c2=1 or last.vax=1 then do; if sum>4 then output; end;
proc sort data=vax_symptom_combos; by c1 vax;
data mysas.vax_symptom_combos; set vax_symptom_combos; by c1 vax; retain sum;if first.c1=1 or first.vax=1 then sum=0; sum=sum+1;
if last.c1=1 or last.vax=1 then do; if sum>4 then output; end;proc sort data=vax_totals; by vax;
data mysas.vax_totals; set vax_totals; by vax; retain vsum;
if first.vax=1 then vsum=0; vsum=vsum+1; if last.vax=1 then do; if vsum>4 then output; end;
proc sort data=four_symptom_combos; by c1 c2 c3 c4;
data mysas.four_symptom_combos; set four_symptom_combos; by c1 c2 c3 c4; retain csum;
if first.c1=1 or first.c2=1 or first.c3=1 or first.c4=1 then csum=0; csum=csum+1;
if last.c1=1 or last.c2=1 or last.c3=1 or last.c4=1 then do; if csum>4 then output; end;
proc sort data=three_symptom_combos; by c1 c2 c3;
data mysas.three_symptom_combos; set three_symptom_combos; by c1 c2 c3; retain csum;
if first.c1=1 or first.c2=1 or first.c3=1 then csum=0; csum=csum+1;
if last.c1=1 or last.c2=1 or last.c3=1 then do; if csum>4 then output; end;
proc sort data=two_symptom_combos; by c1 c2;
data mysas.two_symptom_combos; set two_symptom_combos; by c1 c2; retain csum;if first.c1=1 or first.c2=1 then csum=0; csum=csum+1;
if last.c1=1 or last.c2=1 then do; if csum>4 then output; end;proc sort data=symptom_totals; by c1;
data mysas.symptom_totals; set symptom_totals; by c1; retain csum;
if first.c1=1 then csum=0; csum=csum+1; if last.c1=1 then do; if csum>4 then output; end;
proc sort data=mysas.vax_four_symptom_combos out=combosort; by vax;
data v_margin; merge mysas.vax_totals combosort; by vax; lift=log(sum/vsum);proc sort data=v_margin; by c1 c2 c3 c4;
*** 4;
data mysas.four_lift_list; merge v_margin mysas.four_symptom_combos; by c1 c2 c3 c4;
keep vax symptom1-symptom4 loglift logPRR logOR sum a b c d apct cpct acpct;
symptom1=c1; symptom2=c2; symptom3=c3; symptom4=c4; loglift=lift+log(&total/csum);
logPRR=log((&total-vsum)*sum/(vsum*(csum-sum)));logOR=log(sum*(&total-vsum-csum+sum)/((csum-sum)*(vsum-sum)));
a=sum; b=vsum-a; c=csum-a; ab=vsum; ac=a+c; cd=&total-vsum; d=cd-c; apct=a*100/ab; cpct=c*100/cd; acpct=ac*100/&total; apct=round(apct,0.01); cpct=round(cpct,0.01); acpct=round(acpct,0.01);
if loglift NE . then output;proc sort data=mysas.four_lift_list; by descending loglift;
proc sort data=mysas.vax_three_symptom_combos out=combosort; by vax;
data v_margin; merge mysas.vax_totals combosort; by vax; lift=log(sum/vsum);proc sort data=v_margin; by c1 c2 c3;
*** 3;
data mysas.three_lift_list; merge v_margin mysas.three_symptom_combos; by c1 c2 c3;
keep vax symptom1-symptom4 loglift logPRR logOR sum a b c d apct cpct acpct;
symptom1=c1; symptom2=c2; symptom3=c3; symptom4=''; loglift=lift+log(&total/csum);
logPRR=log((&total-vsum)*sum/(vsum*(csum-sum)));logOR=log(sum*(&total-vsum-csum+sum)/((csum-sum)*(vsum-sum)));
a=sum; b=vsum-a; c=csum-a; ab=vsum; ac=a+c; cd=&total-vsum; d=cd-c; apct=a*100/ab; cpct=c*100/cd; acpct=ac*100/&total; apct=round(apct,0.01); cpct=round(cpct,0.01); acpct=round(acpct,0.01);
if loglift NE . then output;proc sort data=mysas.three_lift_list; by descending loglift;
proc sort data=mysas.vax_two_symptom_combos out=combosort; by vax;
data v_margin; merge mysas.vax_totals combosort; by vax; lift=log(sum/vsum);proc sort data=v_margin; by c1 c2;
*** 2;
data mysas.two_lift_list; merge v_margin mysas.two_symptom_combos; by c1 c2;
keep vax symptom1-symptom4 loglift logPRR logOR sum a b c d apct cpct acpct;
symptom1=c1; symptom2=c2; symptom3=''; symptom4=''; loglift=lift+log(&total/csum);
logPRR=log((&total-vsum)*sum/(vsum*(csum-sum)));logOR=log(sum*(&total-vsum-csum+sum)/((csum-sum)*(vsum-sum)));
a=sum; b=vsum-a; c=csum-a; ab=vsum; ac=a+c; cd=&total-vsum; d=cd-c; apct=a*100/ab; cpct=c*100/cd; acpct=ac*100/&total; apct=round(apct,0.01); cpct=round(cpct,0.01); acpct=round(acpct,0.01);
if loglift NE . then output; proc sort data=mysas.two_lift_list; by descending loglift;
proc sort data=mysas.vax_symptom_combos out=combosort; by vax;
data v_margin; merge mysas.vax_totals combosort; by vax; lift=log(sum/vsum); proc sort data=v_margin; by c1;
*** 1;
data mysas.single_lift_list; merge v_margin mysas.symptom_totals; by c1;
keep vax symptom1-symptom4 loglift logPRR logOR sum a b c d apct cpct acpct;
symptom1=c1; symptom2=''; symptom3=''; symptom4=''; loglift=lift+log(&total/csum);
logPRR=log((&total-vsum)*sum/(vsum*(csum-sum)));logOR=log(sum*(&total-vsum-csum+sum)/((csum-sum)*(vsum-sum)));
a=sum; b=vsum-a; c=csum-a; ab=vsum; ac=a+c; cd=&total-vsum; d=cd-c; apct=a*100/ab; cpct=c*100/cd; acpct=ac*100/&total; apct=round(apct,0.01); cpct=round(cpct,0.01); acpct=round(acpct,0.01);
if loglift NE . then output; proc sort data=mysas.single_lift_list; by descending loglift;
data mysas.tmp; merge mysas.four_lift_list mysas.three_lift_list mysas.two_lift_list mysas.single_lift_list; by descending loglift; drop sum; support=sum;
Proc datasets library=mysas; delete four_lift_list three_lift_list two_lift_list single_lift_list four_symptom_combos
three_symptom_combos two_symptom_combos symptom_totals vax_four_symptom_combos vax_three_symptom_combos vax_two_symptom_combos vax_symptom_combos vax_totals;run;
RSUBMIT; * a acpct apct b c cpct d logOR logPRR loglift support symptom1-symptom4 vax;
proc contents data=mysas.tmp; run;
data t(drop=symptom1-symptom4); set mysas.tmp(keep=a b c d logPRR vax symptom1-symptom4 vax);
PRR=exp(logPRR); PRR=round(PRR,0.1);
sympc=trim(symptom1)||' '||trim(symptom2)||' '||trim(symptom3)||' '||trim(symptom4);
vsymps=trim(vax)||'=>'||sympc;
*%let sy="CONJUNCTIVITIS"; *%let sy="EDEMA FACE";
proc print data=t; where vax="FLU" and (prr gt 5 or prr = .) and a ge 20;
*where vax="FLU" and (prr1>=2 or prr2>=2 or prr3>=2 or prr4>=2 or prr5>=2)
and (symptom1=&sy or symptom2=&sy or symptom3=&sy or symptom4=&sy);
*where vax="PPV" and (prr>=2) and a ge 15;
var PRR a vsymps;
run;