BookmarkSubscribeRSS Feed
smunigala
Obsidian | Level 7

Hi all,

I have 7 years data from 2004 to 2010 with Census Population and number of people diagnosed with a disease. I calculated Incidence per million. I need to calculate 95% CIs for the incidence and overall Annual Percentage Change (APC) with 95%CI.

 

I know to calculate 95%CI for incidence using EpiInfo software and APC by hand calculation, but how do I get 95%CI for APC?

 

 

I used the hand calculation of APC: (((3.96-6.88)/6.88)/7)*100 = -6.1%

Number of years = 7;

But I need the 95%CI for APC

 

I would appreciate any help regarding this.

 

Thank you!

Sat

3 REPLIES 3
rogerjdeangelis
Barite | Level 11
Annual Percentage Change with 95%CIs

inspired by
https://goo.gl/VPn5mo
https://communities.sas.com/t5/SAS-Procedures/Annual-Percentage-Change-with-95-CIs/m-p/329864


* Three techniques

1. proc freq exact (hypergeomethic?)            6.462%      6.478%
2. Normal approximation                         6.461       6.479
3. Exact using an interative datastep solution  0.064622    0.064784


HAVE ( I restructure your data )

Up to 40 obs WORK.HAVE total obs=14

Obs   YER EVENT       TOT

  1  2004     0   2313308   Have HIV
  2  2004     1  33439457   Do not have AIDS
  3  2005     0   2468735
  4  2005     1  33516847
  5  2006     0   2043291
  6  2006     1  34203531
  7  2007     0   1848984
  8  2007     1  34703545
  9  2008     0   1684509
 10  2008     1  35171713
 11  2009     0   1704744
 12  2009     1  35372460
 13  2010     0   1424794
 14  2010     1  35893687


WANT
                 lower       upper
Obs     YER      XL_BIN      XU_BIN
                                     Normal Approx see below   Exact hand calculated
 1     2004     6.462%      6.478%   ( 6.461, 6.479 )          0.064622    0.064784
 2     2005     6.852%      6.869%
 3     2006     5.630%      5.645%
 4     2007     5.051%      5.066%
 5     2008     4.564%      4.577%
 6     2009     4.591%      4.605%
 7     2010     3.812%      3.824%

SOLUTION
========


* I had to do some reformating;
data have;
input Yer pop pct lwr upr;
inc=int(pop*(lwr+upr)/200);
lwrupr=(lwr+upr)/2;
put lwrupr;
event=0;tot=inc;output;
event=1;tot=pop-inc;output;
keep yer event tot;
cards4;
2004 35752765 246 6.8805867 6.06 7.78
2005 35985582 262 7.2806937 6.44 8.2
2006 36246822 218 6.0143204 5.26 6.85
2007 36552529 198 5.4168619 4.7 6.21
2008 36856222 181 4.9109754 4.23 5.67
2009 37077204 183 4.9356473 4.26 5.69
2010 37318481 148 3.9658635 3.67 4.64
;;;;
run;quit;

proc freq data=have;
     by yer;
     tables event / list bin exact alpha=.05 out=cnt;
     weight tot;
     output out=rsk bin ;
run;quit;

proc print data=rsk;
format xl_bin xu_bin percent8.5;
var  yer  xl_bin xu_bin;
run;quit;




%macro utl_exbnci(n=,x=,p1=,p2=,alpha=);
  %global &p1 &p2;

  data _null_;
    p1low=0.0;
    p1mid=0.5;
    p1high=1.0;

    p2low=0.0;
    p2mid=0.5;
    p2high=1.0;

    n=&n;
    x=&x;
    pval=&alpha/2;

    if x=0 then p1mid=0;
    else do until(p1high-p1low < 0.0001);
      if 1-probbnml(p1mid,n,x-1) < pval then p1low=p1mid;
      else p1high=p1mid;
      p1mid=(p1low+p1high)/2;
    end;

    do until(p2high-p2low < 0.0001);
      if probbnml(p2mid,n,x) < pval then p2high=p2mid;
      else p2low=p2mid;
      p2mid=(p2low+p2high)/2;
    end;

    call symput("&p1",put(100*p1mid,5.3));
    call symput("&p2",put(100*p2mid,5.3));
  run;
%mend utl_exbnci;

*----------*
| examples |
*----------*;

%utl_exbnci(n=35752765,x=2313308,p1=plow,p2=phigh,alpha=0.05)

data _null_;
  put @5 "ci - ( &plow, &phigh )";
run;


/* T000101 DATASTEP INTERACTIVE METHOD FOR BINOMIOAL CONFIDENCE INTERVAL WORKS WITH 0 RESPONDERS */
    %macro utl_bnmlcia(indata=,        /* input data set name     */
                  outdata=bnmlci  /* output data set name    */
                  );
    data &outdata;
    format n m best12. alpha p 8.6 l_limit u_limit 8.6 err_msg $55.;
    set &indata;
    if n=int(n) and m=int(m) and n>0 and m>=0 and m<=n and 0<alpha<1 then do;
       p=m/n;
       alpha2=alpha/2;
       if m=0 then do;
          l_limit=0;
          link FIND_UL;
       end;
       else if m=n then do;
          u_limit=1;
          link FIND_LL;
       end;
       else do;
          link FIND_LL;
          link FIND_UL;
       end;
    end;
    else do;
         put n= m= alpha=;
         if n ne int(n) or n<=0 then do;
              err_msg='Variable n needs to be a positiv integer.';
              put 'ERROR: ' err_msg;
         end;
         if m ne int(m) or m<0  then do;
              err_msg='Variable m needs to be a nonnegative integer.';
              put 'ERROR: ' err_msg;
         end;
         if m>n then do;
              err_msg='Variable n needs to be equal or larger than variable m.';
              put 'ERROR: ' err_msg;
         end;
         if not (0<alpha<1) then do;
              err_msg='Variable alpha needs to be between 0 and 1.';
              put 'ERROR: ' err_msg;
         end;
         put;
    end;
    RETURN;

    FIND_LL:                          /* Bisection search for lower limit */
    xu=p;
    xl=0;
    do until (crit < 0.000000001);
       xm=(xu+xl)/2;
       ptemp=probbnml(xm, n, m-1);
       crit=abs(alpha2-(1-ptemp));
       if ptemp<(1-alpha2) then do;
          xl=xl;
          xu=xm;
       end;
       else do;
          xl=xm;
          xu=xu;
       end;
    end;
    l_limit=xm;
    RETURN;

    FIND_UL:                        /* Bisection search for upper limit */
    xu=1;
    xl=p;
    do until (crit < 0.000000001);
       xm=(xu+xl)/2;
       ptemp=probbnml(xm, n, m);
       crit=abs(alpha2-ptemp);
       if ptemp<alpha2 then xu=xm;
       else xl=xm;
    end;
    u_limit=xm;
    RETURN;

    label n        = 'n'
          m        = 'm'
          p        = 'm/n'
          alpha    = 'Alpha Value'
          l_limit  = 'CI Lower Limit'
          u_limit  = 'CI Upper Limit';
    drop alpha2 xu xl crit xm ptemp err_msg;
    run;
    %mend utl_bnmlcia;

    ****************** An Example **********************;


data t;
input n m alpha;
cards;
35752765 2313308 0.05
;
run;

%utl_bnmlcia(indata=t, outdata=t1);

proc print data=t1;
title1 "Binomial Distribution Confidence Intervals";
run;


Binomial Distribution Confidence Intervals

Obs               N               M       ALPHA           P     L_LIMIT     U_LIMIT

 1         35752765         2313308    0.050000    0.064703    0.064622    0.064784


smunigala
Obsidian | Level 7

Thanks for the reply. DO you know how to calculate annual percentage change and 95%CI for this?

tygateer
Calcite | Level 5

data temp2;

input t count 8.;

cards;

2004 33439457

2005 33516847

2006 34203531

2007 34703545

2008 35171713

2009 35372460

2010 35893687

;;;;

run;

proc genmod data = temp2;

model count = t / dist=poisson link=log;

ods output parameterestimates = temp3(where=(parameter='t'));

run;

data eapc (keep = eapc lower95 upper95 pvalue);

set temp3;

eapc = (exp(estimate)-1)*100;

lower95 = (exp(lowerwaldcl)-1)*100;

upper95 = (exp(upperwaldcl)-1)*100;

pvalue = probchisq;

run;

proc print data = eapc;

var eapc lower95 upper95 pvalue;

run;

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 6671 views
  • 0 likes
  • 3 in conversation