BookmarkSubscribeRSS Feed
deleted_user
Not applicable
Hi,

Somebody knows if there is some macro or statement to compute confidence intervals for positive and negative percent agreement indices to measure agreement between 2 diagnostic tests when no golden standard exists?

Thanks
1 REPLY 1
JuanVte
Calcite | Level 5
Dear JSA,


I did my own macro but I have used it only once, so maybe you should assure that everything works properly.

I you find any error or you have any comment please let me know.

Juan Vicente Torres
torres.j(at)recercaclinica.com
-------------------------------------------------------------------------------------------------------------

/*****************************************************************************
PROGRAM NAME : ./diagnostic_values.sas
PROJECT NAME :
AUTHOR : Juan Vicente Torres
CREATION DATE : 23/04/2008
DESCRIPTION : Calculate Sensibility, Specificity, Positive predictive
values and Negative predictive values
DETAILED REQUIREMENTS:
REQUIREMENTS LOCATION:
INPUT :
OUTPUT :
INFRASTRUCTURE : Windows XP SAS 9.1

PARAMETERS : in : Dateset name
gold_s : indicate gold standard test
test : indicate new test
decimals: set the number of decimals to be used
print : print results (yes or no)
EXAMPLE :

data ex;
input gs test @@;
cards;
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1
0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0
;
run;

proc freq data=ex;
table test*gs;
run;

%diagnostic_values(in=ex, gold_s=gs, test=test, decimals=4);

It is very important assign the subjects with a disorder
with 1 and the healthy subjects with 0.

------------------------------------------------------------------------------
PROGRAM HISTORY
Ver# Date Author Description
---- -------- --------------- -------------------------------------------
001 23/04/2008 J.V Torres Production version

******************************************************************************/


%macro diagnostic_values(in=, gold_s=, test=, decimals=2, print=yes);

proc sort data=&in out=&in.x;
by descending &test descending &gold_s;
run;

%let dec = %eval(&decimals+2).&decimals;

%put ****************** &dec.;

ods select none;

**********************************************************************
Sensitivity;

ods output BinomialProp = BinomialProp;
proc freq data=&in.x order=data;
where &gold_s=1;
tables &test;
exact binomial;
run;

data _null_;
set binomialprop;
if name1 = "_BIN_" then call symput('p' ,put(nValue1,&dec.));
else if name1 = "L_BIN" then call symput('la',put(nValue1,&dec.));
else if name1 = "U_BIN" then call symput('ua',put(nValue1,&dec.));
else if name1 = "XL_BIN" then call symput('le',put(nValue1,&dec.));
else if name1 = "XU_BIN" then call symput('ue',put(nValue1,&dec.));
run;

data _dp;
length param $35.;
param = 'Sensitivity';
p = put(&p,&dec.);
ainterval = "(&la-&ua)";
einterval = "(&le-&ue)";
label param = 'Parameter'
p = 'Estimation'
ainterval = 'Assimptotic 95% C.I'
einterval = 'Exact 95% C.I';
run;

**********************************************************************
Specificity;

ods output BinomialProp = BinomialProp;
proc freq data=&in.x;
where &gold_s=0;
tables &test;
exact binomial;
run;

data _null_;
set binomialprop;
if name1 = "_BIN_" then call symput('p',put(nValue1,&dec.));
else if name1 = "L_BIN" then call symput('la',put(nValue1,&dec.));
else if name1 = "U_BIN" then call symput('ua',put(nValue1,&dec.));
else if name1 = "XL_BIN" then call symput('le',put(nValue1,&dec.));
else if name1 = "XU_BIN" then call symput('ue',put(nValue1,&dec.));
run;

data _dp_aux;
length param $35.;
param = 'Specificity';
p = put(&p,&dec.);
ainterval = "(&la-&ua)";
einterval = "(&le-&ue)";
label param = 'Parameter'
p = 'Estimation'
ainterval = 'Assimptotic 95% C.I'
einterval = 'Exact 95% C.I';
run;

data _dp;
set _dp _dp_aux;
run;

**********************************************************************
Positive predictive value;

ods output BinomialProp = BinomialProp;
proc freq data=&in.x order=data;
where &test=1;
tables &gold_s;
exact binomial;
run;

data _null_;
set binomialprop;
if name1 = "_BIN_" then call symput('p',put(nValue1,&dec.));
else if name1 = "L_BIN" then call symput('la',put(nValue1,&dec.));
else if name1 = "U_BIN" then call symput('ua',put(nValue1,&dec.));
else if name1 = "XL_BIN" then call symput('le',put(nValue1,&dec.));
else if name1 = "XU_BIN" then call symput('ue',put(nValue1,&dec.));
run;

data _dp_aux;
length param $35.;
param = 'Positive predictive value';
p = put(&p,&dec.);
ainterval = "(&la-&ua)";
einterval = "(&le-&ue)";
label param = 'Parameter'
p = 'Estimation'
ainterval = 'Assimptotic 95% C.I'
einterval = 'Exact 95% C.I';
run;

data _dp;
set _dp _dp_aux;
run;

**********************************************************************
Negative predictive value;

ods output BinomialProp = BinomialProp;
proc freq data=&in.x;
where &test=0;
tables &gold_s;
exact binomial;
run;

data _null_;
set binomialprop;
if name1 = "_BIN_" then call symput('p',put(nValue1,&dec.));
else if name1 = "L_BIN" then call symput('la',put(nValue1,&dec.));
else if name1 = "U_BIN" then call symput('ua',put(nValue1,&dec.));
else if name1 = "XL_BIN" then call symput('le',put(nValue1,&dec.));
else if name1 = "XU_BIN" then call symput('ue',put(nValue1,&dec.));
run;

data _dp_aux;
length param $35.;
param = 'Negative predictive value';
p = put(&p,&dec.);
ainterval = "(&la-&ua)";
einterval = "(&le-&ue)";
label param = 'Parameter'
p = 'Estimation'
ainterval = 'Assimptotic 95% C.I'
einterval = 'Exact 95% C.I';
run;

data _dp;
set _dp _dp_aux;
run;

ods select all;

%if %upcase(&print) = YES %then %do;
*title 'Diagnostic parameters';
proc report missing headline headskip nowd split="@" data=_dp ;
columns param p ainterval einterval ;
define param / display %w(36) order order=data;
define p / display %w(10);
define ainterval / display %w(21);
define einterval / display %w(15);
run;
%end;

%mend;

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

New Learning Events in April

 

Join us for two new fee-based courses: Administrative Healthcare Data and SAS via Live Web Monday-Thursday, April 24-27 from 1:00 to 4:30 PM ET each day. And Administrative Healthcare Data and SAS: Hands-On Programming Workshop via Live Web on Friday, April 28 from 9:00 AM to 5:00 PM ET.

LEARN MORE

Discussion stats
  • 1 reply
  • 1006 views
  • 0 likes
  • 2 in conversation