You are on page 1of 12

SGASIM9

Program SGASIM9;
{simulation of SGA detection error}
{uses cms for uss parameters}
{using Chitty's formulae and several efw formula}
{uses trized.txt for source of correlated zeds for bpd, ac and fl}
{validation of weights, sens, spec etc}
uses crt;
const
bwt40 = 3520;
sd_bpd_error=0.025;
sd_hc_error=0.025;
sd_fl_error=0.027;
sd_ac_error=0.03;
var
wks,PPV,LR,FP_rate:real;
bpd_med,ac_med,fl_med,bpd_sd,ac_sd,fl_sd:real;
zed_bpd,zed_ac,zed_fl,zed_bpd_err,zed_ac_err,zed_fl_err:real;
true_AC1,true_BPD1,true_FL1,true_hc1,obs_AC1,obs_HC1,obs_BPD1,obs_FL1,obs_FW1:re
al;
efw,efw10,
efw05,fw0,fwn,fw1,fw2,fw3,fw4,fw5,fw6,fw7,fw8,fw9,fw10,fw11,fw12,fw13:real;
fw14,fw15,fw16,fw17,fw18,fw19,fw20,fw21,fw22,fw23,fw24,fw25,fw26,fw27,fw28,fw29,
fw30,fw31,fw32:real;

truepos,falsepos,trueneg, falseneg:longint;
week,multiples,start_gest,month:integer;
N_gests,yb,nb,iyb,ib,negb,count_zb,count_pb: integer;
z_BPD_err,z_AC_err,z_FL_err,spec,sens,pospred,negpred:real;
tot_num,case_num:longint;
scan_interval,run_age:integer;
a,b,c,rn,dan,ff,gg,hh,jj:text;
FUNCTION power(x,p:real):real;
begin
power:=exp(p*(ln(x)));
end;
FUNCTION odeh(u:real):real;

{may produce one value of z}

var
uu,zny:real;
for_zn:longint;
const
p0=-0.322232431088;
p1=-1;
p2=-0.342242088547;
p3=-0.0204231210245;
p4=-0.0000453642210148;

q0=0.099348462606;
q1=0.588581570495;
q2=0.531103462366;
q3=0.10353775285;
q4=0.0038560700634;

begin
if u>0.5 then
Page 1

SGASIM9
begin
zny:=sqrt(-ln((1-u)*(1-u)));
odeh:=zny +(p0 +p1*zny +p2*zny*zny +p3*zny*zny*zny +p4*zny*zny*zny*zny)
/(q0 +q1*zny +q2*zny*zny +q3*zny*zny*zny +q4*zny*zny*zny*zny);
end
else if u<0.5 then
begin
uu:=1-u;
zny:=sqrt(-ln((1-uu)*(1-uu)));
odeh:=-zny -(p0 +p1*zny +p2*zny*zny +p3*zny*zny*zny +p4*zny*zny*zny*zny)
/(q0 +q1*zny +q2*zny*zny +q3*zny*zny*zny +q4*zny*zny*zny*zny);
end;
end;
function do_maj(b,hc:real):real;
{ returns the major axis after the circumference and minor axis is entered }
begin
do_maj:=hc*(0.250712 -0.119809*(b/hc) -3.247660*(b/hc)*(b/hc)
+2.486284*(b/hc)*(b/hc)*(b/hc));
end;

function prop(week:integer):real;
begin
prop:=(208.53 -23.09*week +0.82253*week*week -0.0078279*week*week*week)/100;
end;

function do_bpd_from_zed(start_gest:integer;zed_bpd:real):real;
{calculate actual BPD value from correlated zeds}
begin
{ writeln('bpd_from_zed entered');}
wks:=start_gest/7;
bpd_med:= 0.1*(-38.63169999 +5.3598748610*wks -0.0489786632*wks*wks);
{ writeln('BPD med = ',bpd_med:7:2);}
bpd_sd:=bpd_med*(0.254936 -0.018779588*wks +0.00055848566*wks*wks
-0.000005620551715*wks*wks*wks);
do_bpd_from_zed:= bpd_med +zed_bpd*bpd_sd;
end;

function do_hc_from_zed(start_gest:integer;zed_hc:real):real;
{calculate actual hc value from correlated zeds}
var
hc_med,hc_sd:real;
begin
{ writeln('bpd_from_zed entered');}
wks:=start_gest/7;
Page 2

SGASIM9
hc_med:= 0.1*(-254.873 + 27.045*wks -0.303*wks*wks);
hc_sd:=hc_med*0.039;
do_hc_from_zed:= hc_med +zed_hc*hc_sd;
end;
function do_ac_from_zed(start_gest:integer;zed_ac:real):real;
begin
{ writeln('do_ac_from zed entered');}
wks:=start_gest/7;
ac_med:=0.1*( -56.46159 +10.331975*wks);
{ writeln('AC med = ',ac_med:7:2);
}
ac_sd:=0.1*(-0.281854838 +0.4943548387*wks);
do_ac_from_zed:= ac_med +zed_ac*ac_sd;
end;
function do_fl_from_zed(start_gest:integer;zed_fl:real):real;
begin
wks:=start_gest/7;
fl_med:=0.1*(-36.4968489 +3.945733555*wks -0.02229162825*wks*wks
-0.000188687569*wks*wks*wks);
fl_sd:=fl_med*(0.4102824741 -0.02999636106*wks +0.0008254425816*wks*wks
-0.000007602090965*wks*wks*wks);
do_fl_from_zed:= fl_med + zed_fl*fl_sd;
end;

function persson(bpd,ac,fl:real):real;
begin
bpd:=10*bpd;
ac:=10*ac;
fl:=10*fl;
persson:=power(10,(0.972*ln(bpd)/ln(10) +1.743*ln(ac/pi)/ln(10)
+0.367*ln(fl)/ln(10) -2.646));
end;
function shepard(bpd,ac:real):real;
begin
shepard:=1000*exp((ln(10))*(-1.7492 +0.166*bpd +0.046*ac - 0.002546*ac*bpd));
end;
function warsof(bpd,ac:real):real;
begin
warsof:=1000*exp(2.302585*(-1.599 +0.144*bpd +0.032*ac -0.000111*bpd*bpd*ac));
end;
Page 3

SGASIM9
function warsof4(fl,ac:real):real;
begin
warsof4:= EXP(2.792+0.108*fl*10+0.000036*100*ac*ac - 0.00027*100*fl*ac);
end;

function hadaf(ac,fl:real):real;
begin
hadaf:=exp((1.3598 +0.051*ac +0.1844*fl -0.0037*ac*fl)*ln(10));
end;

function hadbaf(bpd,ac,fl:real):real;
begin
hadbaf:=exp((1.4787 -0.003343*ac*fl +0.001837*bpd*bpd +0.0458*ac
+0.158*fl)*ln(10));
end;

function hadhaf(hc,bpd,ac,fl:real):real;
begin
hadhaf:= exp((1.3596 -0.00386*ac*fl +0.0064*hc +0.00061*bpd*ac +0.0424*ac
+0.174*fl)*ln(10));
end;

function combs(hc,ac,fl:real):real;
{original}
begin
combs:=0.23718*ac*ac*fl +0.03312*hc*hc*hc;
end;
function dudley(hc,bpd,ac,fl:real):real;
var
ofd,faa,ha:real;
begin
faa:=ac*ac/(4*pi);
ofd:=2*do_maj(bpd/2,hc);
ha:=pi*(bpd/2)*(ofd/2);
dudley:=4.1*fl*faa +0.86*fl*ha;
end;
function shino(bpd,ac,fl:real):real;
begin
shino:=0.23966*ac*ac*fl +1.623*bpd*bpd*bpd;
Page 4

SGASIM9
end;
function birn(bpd,ac:real):real;
begin
birn:=1.0*(3.42928*bpd*(ac/pi)*(ac/pi) +41.218);

end;
function aoki(bpd,ac,fl:real):real;
begin
aoki:= 1.25647*bpd*bpd*bpd +3.50665*(ac*ac/(4*3.14)*fl+6.3)
end;

function hsie1(bpd,ac:real):real;
begin
hsie1:= power(10,(2.1315+0.0056541*ac*bpd 0.00015515*bpd*ac*ac+0.000019782*ac*ac*ac+0.052594*bpd) );
end;

function hsie2(bpd,ac,fl:real):real;
begin
hsie2:= power(10,(2.7193+0.0094962*ac*bpd - 0.1432*fl - 0.00076742*ac*bpd*bpd +
0.001745*fl*bpd*bpd));
end;
function ott(hc,ac,fl:real):real;
begin
ott:= 1000*power(10,(0.04355*hc +0.05394*ac- 0.0008582*hc*ac+1.2594*fl/ac 2.0661));
end;
function roberts(bpd,hc,ac,fl:real):real;
begin
roberts:= power(10, (1.6758+0.01707*ac+0.042478*bpd+0.05216*fl+0.01604*hc));
end;
{Log10 EFW= 1.6758+0.01707*AC+0.042478*BPD+0.05216*FL+0.01604*HC}
Page 5

SGASIM9
function rose(bpd,ac,fl:real):real;
begin
rose:= exp(0.143*(bpd +(ac/3.14) +fl)+4.198);
end;
function woo1(bpd,ac:real):real;
begin
woo1:= power(10,(1.13+0.181864*bpd+0.0517505*ac-3.34825*bpd*ac/1000));
end;

function woo2(bpd,ac,fl:real):real;
begin
woo2:= power(10,(1.13705+0.15549*bpd+0.04864*ac 2.79682*bpd*ac/1000+0.037769*fl - 4.94529*fl*ac/10000));
end;

function woo3(ac,fl:real):real;
begin
woo3:= power(10,(0.59+0.08*ac + 0.28*fl - 0.00716*ac*fl));
end;

function woo4(bpd,ac:real):real;
begin
woo4:= power(10,(1.63+0.16*bpd+0.00111*ac*ac - 0.0000859*bpd*ac*ac));
end;

function woo5(bpd,ac,fl:real):real;
Page 6

SGASIM9
begin
woo5:= power(10,(1.54+0.15*bpd+0.00111*ac*ac - 0.0000764*bpd*ac*ac+0.05*fl 0.000992*fl*ac));
end;

function woo6(bpd,ac,fl:real):real;
begin
woo6:= 1.4*bpd*ac*fl -200;
end;
function jordaan2(bpd,ac:real):real;
begin
jordaan2:= 1000*power(10,(-1.1683 + 0.0377*ac + 0.095*bpd - 0.0015*bpd*ac));
end;

function jordaan3(bpd,hc,ac:real):real;
begin
jordaan3:= power(10,(2.3231+0.02904*ac +0.0079*hc - 0.0058*bpd));
end;

function merz(bpd,ac:real):real;
begin
merz:=-3200.4 + 157.07186*ac + 15.90391*bpd*bpd ;
end;

function vintzi(bpd,ac:real):real;
begin
vintzi:= power(10,(1.879+0.084*bpd+0.026*ac));
end;

function ferrero(fl,ac:real):real;
begin
ferrero:= power(10,(0.77125+0.13244*ac - 0.12996*fl Page 7

SGASIM9
1.73588*ac*ac/1000+3.09212*fl*ac/1000 +2.18984*fl/ac));
end;

function thurnau(bpd,ac:real):real;
begin
thurnau:=bpd*ac*9.337 - 229;
end;

function weiner1(hc,ac:real):real;
begin
weiner1:= power(10,(1.6961 +0.04035*hc + 0.01285*ac));
end;
function weiner2(hc,ac,fl:real):real;
begin
weiner2:= power(10,( 1.6961 + 0.02253*hc + 0.01645*ac + 0.06439*fl));
end;
function weinberger(bpd,ac:real):real;
begin
weinberger:= 10.1*ac*bpd - 481;
end;

procedure gen_z_errors;
{generates z vals for errors in estimating parametrs}
var
for_z_obs_AC, for_z_obs_BPD,for_z_obs_FL:longint;
z_obs_AC,z_obs_FL,z_obs_BPD:real;
begin
writeln('

Now generating z variates');

for case_num:=1 to (3*tot_num) do


begin
readln(rn,for_z_obs_BPD);
readln(rn,for_z_obs_AC);
readln(rn,for_z_obs_FL);
z_obs_BPD:=for_z_obs_BPD/100000;
z_obs_AC:=for_z_obs_AC/100000;
z_obs_FL:=for_z_obs_FL/100000;
{

if ((odeh(z_true_AC)<5.6) and (odeh(z_true_AC)>-4.587)) then}


writeln(a,odeh(z_obs_BPD):10:5,odeh(z_obs_AC):10:5,odeh(z_obs_FL):10:5);
Page 8

SGASIM9
end;
end;

{*********************************************************}
procedure doentry;
begin
writeln;
writeln('
---------- GROWTH SCREENING SIMULATION --------- ');
WRITELN;
writeln;
write('
Enter number of cases for this run > ');
readln(tot_num);
end;
procedure gen_rn;
var
rn_num,seed1,seed2,seed3:longint;
seed,counter:integer;
feed1,feed2,feed3:longint;
rn,rs:text;
begin
assign(rn,'rtable.txt');
rewrite(rn);
assign(rs,'source.txt');
reset(rs);
multiples:=10;
writeln('enter number from 1 to 20');
readln(seed);
for counter:=1 to seed do
begin
readln(rs,seed1,seed2,seed3);
end;
writeln('seeds',seed1:8,seed2:8,seed3:8);
writeln('

Now generating table of random numbers');

for rn_num:=1 to (multiples*tot_num) do


begin
seed1:=(171*seed1) mod 30269;
feed1:=round(3.3037101*seed1);
seed2:=(172*seed2) mod 30307;
feed2:=round(3.2995678*seed2);
seed3:=(170*seed3) mod 30323;
feed3:=round(3.2978267*seed3);
writeln(rn,feed1:6);
writeln(rn,feed2:6);
writeln(rn,feed3:6);
end;
close(rn);
close(rs);
end;
{***************************************************}
Page 9

SGASIM9
procedure do_all_wgt;
begin
writeln('

Now calculating EFWs');

start_gest:=week*7;

for case_num:=1 to tot_num do


begin
{writeln('case no.:=',case_num:5);}
readln(b,zed_bpd,zed_ac,zed_fl);{zeds for true values }
readln(a,z_bpd_err,z_ac_err,z_fl_err);{zeds for uss errors }
true_bpd1:=do_bpd_from_zed(start_gest,zed_bpd);
true_hc1:=do_hc_from_zed(start_gest,zed_bpd);
true_ac1:=do_ac_from_zed(start_gest,zed_ac);
true_fl1:=do_fl_from_zed(start_gest,zed_fl);
obs_bpd1:= true_bpd1*(1 +z_bpd_err*sd_bpd_error);
obs_hc1:= true_hc1*(1 +z_bpd_err*sd_hc_error);
obs_fl1:= true_fl1*(1 +z_fl_err*sd_fl_error);
obs_ac1:= true_ac1*(1 +z_ac_err*sd_ac_error);

efw:= bwt40*prop(week)+zed_ac*0.13*bwt40*prop(week);
efw10:= bwt40*prop(week) - 1.2816*0.13*bwt40*prop(week);
efw05:= bwt40*prop(week) - 1.6449*0.13*bwt40*prop(week);
fw3:= hadbaf(obs_bpd1,obs_ac1,obs_fl1);
fw2:= hadaf(obs_ac1,obs_fl1);
fw1:= hadhaf(obs_hc1,obs_bpd1,obs_ac1,obs_fl1);
fw4:= warsof(obs_bpd1,obs_ac1);
fw5:= shepard(obs_bpd1,obs_ac1);
fw6:= persson(obs_bpd1,obs_ac1,obs_fl1);
fw7:= combs(obs_hc1,obs_ac1,obs_fl1);
fw8:= dudley(obs_hc1,obs_bpd1,obs_ac1,obs_fl1);
fw9:= birn(obs_bpd1,obs_ac1);
fw10:=shino(obs_bpd1,obs_ac1,obs_fl1);
fw11:=aoki(obs_bpd1,obs_ac1,obs_fl1);
fw12:=hsie1(obs_bpd1,obs_ac1);
fw13:=hsie2(obs_bpd1,obs_ac1,obs_fl1);
fw14:=ott(obs_hc1,obs_ac1,obs_fl1);
fw15:=roberts(obs_bpd1,obs_hc1,obs_ac1,obs_fl1);
fw16:=rose(obs_bpd1,obs_ac1,obs_fl1);
fw17:=woo1(obs_bpd1,obs_ac1);
fw18:=woo2(obs_bpd1,obs_ac1,obs_fl1);
fw19:=woo3(obs_ac1,obs_fl1);
fw20:=woo4(obs_bpd1,obs_ac1);
fw21:=woo5(obs_bpd1,obs_ac1,obs_fl1);
fw22:=woo6(obs_bpd1,obs_ac1,obs_fl1);
fw23:=jordaan2(obs_bpd1,obs_ac1);
fw24:=jordaan3(obs_bpd1,obs_hc1,obs_ac1);
fw25:=merz(obs_bpd1,obs_ac1);
fw26:=vintzi(obs_bpd1,obs_ac1);
fw27:=ferrero(obs_fl1,obs_ac1);
fw28:=warsof4(obs_fl1,obs_ac1);
fw29:=thurnau(obs_bpd1,obs_ac1);
fw30:= weiner1(obs_hc1,obs_ac1);
fw31:= weiner2(obs_hc1,obs_ac1,obs_fl1);
Page 10

SGASIM9
fwn:=fw32;
if ((zed_ac < -1.2816) and (fwn<efw10)) then
truepos:= truepos+1;
if ((zed_ac > -1.2816) and (fwn<efw10)) then
falsepos:= falsepos+1;
if ((zed_ac > -1.2816) and (fwn>efw10)) then
trueneg:= trueneg+1;
if ((zed_ac <-1.2816) and (fwn>efw10)) then
falseneg:= falseneg+1;
{writeln(gg,week:4,true_bpd1:8:1, true_ac1:8:1, true_fl1:8:1);
(*

writeln(gg,week:3,zed_ac:7:2,efw:8:1,fw1:8:1,fw2:8:1,fw3:8:1,
fw4:8:1,fw5:8:1,fw6:8:1,fw7:8:1,fw8:8:1,fw9:8:1,fw10:8:1,
fw11:8:1,fw12:8:1,fw13:8:1,fw14:8:1,fw15:8:1,fw16:8:1,fw17:8:1,
fw18:8:1,fw19:8:1,fw20:8:1,fw21:8:1,fw22:8:1,fw23:8:1,fw24:8:1,
fw25:8:1,fw26:8:1,fw27:8:1);
writeln(gg,week:3,zed_ac:7:2,efw:8:1,fw1:8:1,fw2:8:1,fw3:8:1,
fw4:8:1,fw5:8:1,fw6:8:1,fw7:8:1,fw8:8:1,fw9:8:1,fw10:8:1,
fw11:8:1,fw12:8:1,fw13:8:1,fw14:8:1,fw15:8:1,fw16:8:1,fw17:8:1,
fw18:8:1,fw19:8:1,fw20:8:1,fw21:8:1,fw22:8:1,fw23:8:1,fw24:8:1,
fw25:12:1,fw26:12:1,fw27:12:1);
*)
writeln(gg,week:3,zed_ac:7:2,efw:8:1,fw29:12:1,fw30:12:1,fw32:12:1);

{ writeln(gg,week:4,fw8:8:1);}
writeln(week:4,case_num:8);
end;
end;

{%%%%%%%%%%%%%%%%%%%%% M A I N %%%%%%%%%%%%%%%%%%%%%%%%%%%}
{ real main program }
begin
textbackground(blue);
clrscr;
doentry;
assign(rn,'rtable.txt');
gen_rn;
reset(rn);
assign(a,'ranza.txt');
rewrite(a);
gen_z_errors;
Page 11

SGASIM9
assign(b,'trized.txt');
assign(gg,'wk2840.txt');
rewrite(gg);
truepos:=0;
falsepos:=0;
trueneg:=0;
falseneg:=0;
for week:=24 to 34 do
begin
reset(b);reset(a);
start_gest:=7*week;
do_all_wgt;
close(b);close(a);
end;
close(gg);
close(rn);
sens:=truepos/(truepos + falseneg);
spec:=trueneg/(trueneg + falsepos);
FP_rate:= falsepos/(falsepos +trueneg);
LR:=sens/(1-spec);
PPV:=truepos/(truepos+falsepos);
(*
writeln('false pos =', falsepos:5);
writeln('false neg =', falseneg:5);
writeln('true pos =',truepos:5);
writeln('true neg =', trueneg:5);
*)
writeln ('sensitivity =', sens:8:5);
writeln ('specificity =', spec:8:5);
writeln(' PPV is =', PPV:8:5);
writeln(' FP rate = ', FP_rate:8:5);
writeln( 'LR =', LR:8:5);
writeln('results in wk2840.txt');

end.

Page 12

You might also like