Libname Trude 'm:\My SAS Files';
option nonotes;
data str_ett;
set Trude.asakoapro; *Tar ett dataset med propensity scores;
by sjukhus; *för acetylsalicylsyrabara eller;
if first. sjukhus then n=1; *antikoagulantia som utskrivnings-;
else n+1; *medicin och nummrerar observationerna; i=1; *inom sjukhus, i skapas enbart för proc;
run; *proc multtest;
data Trude.STR; *skapar ett tomt dataset som ska fyllas;
*på. Blir här bara en tom rad; /***********************************/
/******* drar stickprov ************/ /***********************************/
%macro str2(repl);
%do i=1 %to &repl; *när macrot anropas anges hur många;
*gånger do-satsen ska köras;
proc multtest data=str_ett noprint nocenter outsamp=str_tva
nsample=1 bootstrap; *med proc multtest och valet bootstrap;
by sjukhus; *dras ett st.pr med återläggning från;
class n; *varje sjukhus,n:en dras;
test mean(i); *proc multtest kräver att ett test;
run; *genomförs;
data str_tva; *n:en som dras får i det nya st.pr.;
set str_tva; *namnet _obs_,här får de namnet n igen;
rename _obs_=n; run;
proc sort data=str_tva; *det dragna st.pr. sorteras efter n inom;
by sjukhus n; *varje sjukhus;
run;
data str_tre; *och slås samman med ett dataset som;
merge str_tva Trude.a; *innehåller alla oberoende variabler;
by sjukhus n; *de matchas efter sjukhus och n; if _sample_=. then delete;
run;
proc sort data=str_tre; *sorterar det sammanslagna datasetet;
by sjukhus n; *efter n inom varje sjukhus;
run;
proc logistic descending data=str_tre noprint;
model asakoany=alder kon a0cirk dm hyperton smoker tinfarkt tptcabg2 aacei aantiary aantiko2 aasa2 abetabl2 acah adigital adiureti alipids anitro sviktar kom_stro kom_njur kom_kol kom_deme kom_canc kom_hsvi;
output out=pred_asa p=phat_asa;*med proc logistic beräknas;
*sannolikheten att få behandling;
run; *beroende av vilket värde de oberoende;
proc means data=pred_asa noprint;*variablerna har;
var phat_asa asakoany; *sannolikheter & även;
output out=str2_asa sum=sphat_asa sasak n=n;*behandlingsvariabeln;
run; *så att O & E erhållshär får de namnen;
*sphat_asa och sasak;
data str2_asa2;
set str2_asa(keep=sjukhus sasak sphat_asa n);
run; *behåller önskade variabler:sjukhus,O&E;
proc sort data=str2_asa2; *sorterar detta dataset efter sjukhus;
by sjukhus; run;
proc logistic descending data=str_tre noprint;
model uaceiny=alder kon a0cirk dm hyperton smoker tinfarkt tptcabg2 aacei
aantiary aantiko2 aasa2 abetabl2 acah adigital adiureti alipids anitro sviktar kom_stro kom_njur kom_kol kom_deme kom_canc kom_hsvi;
output out=pred_uac p=phat_uac; run;
*gör här samma sak för ACE-hämmare;
proc means data=pred_uac noprint; By sjukhus;
var phat_uac uaceiny;
output out=str2_uac sum=sphat_uac suacei n=n; run;
data str2_uac2;
set str2_uac(keep=sjukhus suacei sphat_uac n); run;
proc sort data=str2_uac2; by sjukhus;
run;
proc logistic descending data=str_tre noprint;
model ibetabl2ny=alder kon a0cirk dm hyperton smoker tinfarkt tptcabg2 aacei aantiary aantiko2 aasa2 abetabl2 acah adigital adiureti alipids anitro sviktar kom_stro kom_njur kom_kol kom_deme kom_canc kom_hsvi;
output out=pred_ibe p=phat_ibe; run;
*och för intravenös beta-blockerare;
proc means data=pred_ibe noprint; By sjukhus;
var phat_ibe ibetabl2ny;
output out=str2_ibe sum=sphat_ibe sibeta n=n; run;
data str2_ibe2;
set str2_ibe(keep=sjukhus sibeta sphat_ibe n); run;
proc sort data=str2_ibe2; by sjukhus;
run;
data str_ihop;
Z_uac=log(suacei/sphat_uac); *för varje beh.och sjukhus;
Z_ibe=log(sibeta/sphat_ibe); run;
data Trude.STR;
set Trude.STR str_ihop; *allt matas in i Trude.STR;
run;
%end; *slut på do-satsen;
%mend; *slut på macrot;
%str2(10000); *macrot anropas 10000 gånger;
proc sort data=STR(where=(sjukhus ne .));
by sjukhus; *tar bort tomma raden från Trude.STR;
run; *och sorterarefter sjukhus;
data konf_str2_asa; *spar sjukhus och Z för resp. beh.i;
se
run; t Trude.STR(keep= sjukhus Z_asa);*för att ta fram konf.interv.;*varsitt data set;
data konf_str2_uac;
set Trude.STR(keep= sjukhus Z_uac);
run;
data konf_str2_ibe;
set Trude.STR(keep= sjukhus Z_ibe);
run;
/**********************************************/ /********* tar fram std av STR ****************/ /**********************************************/
proc means data=Trude.STR noprint;*beräknar mha proc means std.avvikelsen;
by sjukhus; *för ln(STR)=Z för varje beh. och;
var Z_asa Z_uac Z_ibe; *inom sjukhus;
ou
run; tput out=Trude.std_STR std=std_asa std_uac std_ibe;
*vill nu ta fram den beräknade variansen på originalst.pr.;
data var_asa;
set Trude.asakoapro; *här acetyl.;
va
run; rians=phat*(1-phat);
proc means data=var_asa noprint;
by sjukhus; *summerar ovanstående varians för att få;
var varians phat; *Var[O] & alla prop.scores för att få E;
ou
run; tput out=var_asa2 sum=svar sphat;
data var_asa3;
set var_asa2;
std_asa_org=sqrt((1/(sphat**2))*svar);
run; *detta är formeln för Var[ln(STR)];
data var_ibe;
set Trude.ibetablpro; *gör samma sak för intrav. beta-bl.;
varians=phat*(1-phat);
proc means data=var_ibe noprint;
by sjukhus;
var varians phat;
output out=var_ibe2 sum=svar sphat;
run;
data var_ibe3;
set var_ibe2; st
run; d_ibe_org=sqrt((1/(sphat**2))*svar);
data var_uac;
set Trude.uaceipro; *och för ACE-hämmare;
varians=phat*(1-phat);
run;
proc means data=var_uac noprint;
by sjukhus;
var varians phat;
output out=var_uac2 sum=svar sphat;
run;
data var_uac3;
set var_uac2;
std_uac_org=sqrt((1/(sphat**2))*svar);
run;
data Trude.tempvarZ;
merge var_asa3(keep=sjukhus std_asa_org) var_ibe3(keep=sjukhus
std_ibe_org)
var_uac3(keep=sjukhus std_uac_org);
by sjukhus; *behåller det intressanta och slår ihop;
run; *alla beräknade std för de olika beh.;
data Trude.str2; *slår ihop datasetet med bootstrapstd;
merge Trude.std_STR(drop= _type_ _freq_) Trude.tempvarz;
by
run; sjukhus; *enligt formel.;*och datasetet med varianserna beräknade; /****************************************/
/***** tar fram bootstrapintervall ******/ /****************************************/
proc sort data=konf_str2_uac; *Tar datasetet med de 10000 Z-värdena;
by sjukhus Z_uac; *och sorterar efter Z inom varje sjukhus;
run; *här beh uacei=ACE-hämmare.;
data konf1;
set konf_str2_uac;
by sjukhus; *numrerar Z inom sjukhus;
if first. sjukhus then n=1;
else n+1; pa
run; ssa=1; *passa används senare;
data konf2;
set konf1 end=final; *Tar här fram en variabel som är;
if n=1 then count+1; *antal sjukhus och en som är;
if
set konf2(keep=antsj antboot);
passa=1; *får här en rad med antsj antboot och;
if
run; antsj ne . then output; *och passa;
data konf4(drop=passa); *slår ihop de numrerade Z:na med antsj;
merge konf1 konf3; *och antboot;
by passa;
run;
data konf5;
set ko f4n ;
ajust=1-(0.95)**(1/antsj); *det bonferroni korrigerade alfat;
a=0.05;
aaa=antboot*(ajust/2); *tar fram den nedre gränsen i intervallet;
if n=round(aaa,1.0) then output;*rundar av lite;
rename Z_uac=lowerz; *döper om det Z som utgör den nedre gränsen;
run;
data konf6;
set ko f4n ;
ajust=1-(0.95)**(1/antsj); a=0.05;
aa=antboot*(1-(ajust/2)); *Tar här fram den övre gränsen;
if n=round(aa,1.0)+1 then output;
rename Z_uac=upperz;
run;
data konf7; *slår ihop dataseten innehållandes;
merge konf5 konf6; *nedre och övre gräns;
by sjukhus;
run;
data konf8; *behåller det intressanta;
set konf7(keep=sjukhus lowerz upperz);
run;
proc means data=Trude.STR noprint;
by sjukhus; *tar fram medelvärdet av Z=ln(STR) från;
var Z_asa Z_uac Z_ibe; *bootstrap-stickproven inom varje sjukhus;
output out=y mean= mean_asa mean_uac mean_ibe;
run;
data konf9;
merge konf8 y(keep=sjukhus mean_uac);
by sjukhus; *slår ihop datasetet med övre & nedre gräns;
run; *med datasetet innehållandes medelvärdet;
data trude.konf_str2_uac;
set konf9;
rename lowerz=b_lowerz; *döper om så jag ska veta att det är boot
gränser;
rename mean_uac=b_mean;
re
run; name upperz=b_upperz;
/********************************************/ /** tar fram konf.intervall på org.st.pr. ***/ /********************************************/
set Trude.uacei(drop=_type_ _freq_); *För beh uacei=ACE-hämmare;
Z=
run; log(suacei/e_uacei); *Tar fram Z=STR;
data konfstr;
merge Trude.tempvarz(keep=sjukhus std_uac_org) plotz2;
by sjukhus;
var_uac=std_uac_org**2; *Lägger till variansen;
run;
data konfstr2;
set konfstr;
lowerz=z-(3.169*sqrt(var_uac)); *Tar fram nedre och;
upperz=z+(3.169*sqrt(var_uac)); *övre gräns;
run;
data Trude.konfstr; *har nu ett dataset med Z,nedre,;
se
run; *&övre gräns för Z från originalst.pr.;
t konfstr2(drop=var_uac e_uacei suacei std_uac_org);
/****************************************/ /********* tar fram std för Ojt *********/ /****************************************/
proc means data=Trude.STR noprint;
by sjukhus;
var sasak suacei sibeta; *tar fram std för Ojt* för varje;
output out=std_O std=std_O_asa std_O_uac std_O_ibe;
run; *beh. inom sjukhus;
data varo_uacei1; *i Trude.uaceipro finns prop score;
set Trude.uaceipro; *för alla obs. för ACE-hämmare;
var_uac=phat*(1-phat); *tar här fram variansen för varje obs.;
run;
proc means data=varo_uacei1 noprint;
by sjukhus;
var var_uac; *summerar varianserna för att få Var[Ojt];
ou
run; tput out=varo_uacei2 sum=varo_uac;
data varo_uacei3;
set varo_uacei2;
std_O_uac_org=sqrt(varo_uac); *tar fram std;
run;
data Trude.jmfvouac;
merge varo_uacei3(keep=sjukhus varo_uac) std_O(keep=sjukhus std_O_uac);
by
run; sjukhus; *slår ihop bootstd med beräknad;
/******************************************/ /******** tar fram std för Ejt ************/ /******************************************/
output out=std_E std=std_asa std_ibe std_uac;
run; *tar fram std för E=sphat inom varje sjukhus;
/******************************************/ /********* tar fram kovariansen ***********/ /******************************************/
data p;
set Trude.STR; *plockar ut 20 sjukhus;
if sjukhus=1 or sjukhus=3 or sjukhus=10 or sjukhus=14 or sjukhus=20 or sjukhus=25 or sjukhus=31 or sjukhus=35 or sjukhus=39 or sjukhus=40 or sjukhus=41 or sjukhus=46 or sjukhus=51 or sjukhus=53 or sjukhus=54 or sjukhus=59 or sjukhus=64 or sjukhus=70 or sjukhus=74 or sjukhus=77;
run;
proc corr cov data=p outp=E;
by sjukhus; *tar fram kovariansen mellan;
var suacei sphat_uac; *O & E inom sjukhus.Här för;
run; *beh. uacei=ACE-hämmare;
data W;
set E(drop=e); *fix och trix för att enbart;
if _type_='COV' and _name_='e'; *behålla kovariansen;
rename o=cov;
run;
data Trude.cov_uac;
set W(keep=sjukhus cov);