<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Empirical reverse culmulative density function in SAS Health and Life Sciences</title>
    <link>https://communities.sas.com/t5/SAS-Health-and-Life-Sciences/Empirical-reverse-culmulative-density-function/m-p/5552#M481</link>
    <description>Hi,&lt;BR /&gt;
&lt;BR /&gt;
I would like to plot an reverse culmulative density function (i.e. decreasing curve with percentile of sample Y-axis vs value of data X-axis). Since I don't have a SAS/QC PROC CAPACITY, I wonder if there is a sample SAS program written somewhere before I re-invent the wheel. &lt;BR /&gt;
&lt;BR /&gt;
Thank you,&lt;BR /&gt;
Martin</description>
    <pubDate>Thu, 15 Nov 2007 22:13:47 GMT</pubDate>
    <dc:creator>deleted_user</dc:creator>
    <dc:date>2007-11-15T22:13:47Z</dc:date>
    <item>
      <title>Empirical reverse culmulative density function</title>
      <link>https://communities.sas.com/t5/SAS-Health-and-Life-Sciences/Empirical-reverse-culmulative-density-function/m-p/5552#M481</link>
      <description>Hi,&lt;BR /&gt;
&lt;BR /&gt;
I would like to plot an reverse culmulative density function (i.e. decreasing curve with percentile of sample Y-axis vs value of data X-axis). Since I don't have a SAS/QC PROC CAPACITY, I wonder if there is a sample SAS program written somewhere before I re-invent the wheel. &lt;BR /&gt;
&lt;BR /&gt;
Thank you,&lt;BR /&gt;
Martin</description>
      <pubDate>Thu, 15 Nov 2007 22:13:47 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Health-and-Life-Sciences/Empirical-reverse-culmulative-density-function/m-p/5552#M481</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2007-11-15T22:13:47Z</dc:date>
    </item>
    <item>
      <title>Re: Empirical reverse culmulative density function</title>
      <link>https://communities.sas.com/t5/SAS-Health-and-Life-Sciences/Empirical-reverse-culmulative-density-function/m-p/5553#M482</link>
      <description>Hi, &lt;BR /&gt;
&lt;BR /&gt;
I have a early (developed about year 2000, see codes below) macro to do that . But please adapt it to suit your needs. Try it also with the example code at the end.&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
%macro Cumucuv( Data=   /* data set name being processed                  */&lt;BR /&gt;
         ,     Where=   /* optional, to subset data per your preference   */ &lt;BR /&gt;
         ,    Resvar=   /* Var. name of interest to be processed          */&lt;BR /&gt;
         ,     Group=   /* Var. name of strata, ex: group_NB, activity    */&lt;BR /&gt;
         ,   V_label=   /* V-axis label, default is " % "                 */&lt;BR /&gt;
    	 ,   H_label=   /* Label of H-axis for result values              */&lt;BR /&gt;
	     ,   L_label=   /* Label of treatment group in legend area        */ &lt;BR /&gt;
         ,   L_local=   /* Legend pos.,TR, TC, TL; MR, MC, ML; BR, BC, BL&lt;BR /&gt;
                           as Top|Middle|Bottom|Left|Center|Right         */&lt;BR /&gt;
         ,   Sendout=   /* Exact Path where to save the graph             */&lt;BR /&gt;
         ,   Figname=   /* name of out graph, use "data_cumcuv" if blank  */&lt;BR /&gt;
         ,   Figtype=   /* GIF, CGM, HPGL etc. GIF as default             */&lt;BR /&gt;
         ,   Logscal=   /* Use log-scale, default 10, can be E, PI ...    */&lt;BR /&gt;
         ,   Symcolr=   /* blank for black-white, non-missing for colored */&lt;BR /&gt;
         ,   Tikmark=   /* min/max/step, for log-scale, separate by space */&lt;BR /&gt;
         ,   Cut_off=   /* give value to add vertical ref. line in graph  */&lt;BR /&gt;
         ,   INT_POL=   /* default "STEPJR", "STEPJL" for reverse, NONE   */&lt;BR /&gt;
         ,   Rev_cuv=   /* Y to produce Reverse Cumulative Curve          */&lt;BR /&gt;
         );&lt;BR /&gt;
&lt;BR /&gt;
 /*-- check &amp;amp;data &amp;amp; key macro vars exist in &amp;amp;data */&lt;BR /&gt;
 %let _dsin=&amp;amp;data;&lt;BR /&gt;
 %let Resvar=%upcase(&amp;amp;resvar); &lt;BR /&gt;
 %let group =%upcase(&amp;amp;group); &lt;BR /&gt;
 %let _KnamV=&amp;amp;resvar &amp;amp;group;&lt;BR /&gt;
 %let rc=%sysfunc(exist(&amp;amp;_dsin)); &lt;BR /&gt;
 %if &amp;amp;rc=0 %then %do;&lt;BR /&gt;
   %put !-------------------------------------------------------------!;&lt;BR /&gt;
   %put ! The data set "&amp;amp;_dsin" does not exist, Please specify again. !;&lt;BR /&gt;
   %put !_____________________________________________________________!;&lt;BR /&gt;
   %goto OUT;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %let _cnt=0;&lt;BR /&gt;
 %let word=%qscan(&amp;amp;_Knamv, 1);&lt;BR /&gt;
   %do %while (&amp;amp;word ne );&lt;BR /&gt;
     %let _cnt=%eval(&amp;amp;_cnt+1);&lt;BR /&gt;
     %let word=%qscan(&amp;amp;_Knamv, &amp;amp;_cnt);&lt;BR /&gt;
     %let _kvnam&amp;amp;_cnt=&amp;amp;word;&lt;BR /&gt;
   %end;&lt;BR /&gt;
 %Let _cnkv=%eval(&amp;amp;_cnt-1);&lt;BR /&gt;
 &lt;BR /&gt;
 ** count how many var in "&amp;amp;_dsin" to be processed by macro **;&lt;BR /&gt;
 %let  dsid=%sysfunc(open(&amp;amp;_dsin));&lt;BR /&gt;
 %let _count=%sysfunc(attrn(&amp;amp;dsid,nvars));&lt;BR /&gt;
&lt;BR /&gt;
 ** loop to check if the key macro vars are among the vars in &amp;amp;_dsin **; &lt;BR /&gt;
 %let _Kvcum=0;&lt;BR /&gt;
 %let _vn=1;&lt;BR /&gt;
 %do %while (&amp;amp;_vn &amp;lt;= &amp;amp;_cnkv);&lt;BR /&gt;
    %let _KeyV=0;&lt;BR /&gt;
    %let i=1;&lt;BR /&gt;
    %do %while (&amp;amp;i &amp;lt;= &amp;amp;_count); &lt;BR /&gt;
      %let _Var&amp;amp;i=%sysfunc(varname(&amp;amp;dsid,&amp;amp;i));&lt;BR /&gt;
      %*put &amp;amp;&amp;amp;_var&amp;amp;i;&lt;BR /&gt;
      %if &amp;amp;&amp;amp;_kvnam&amp;amp;_vn=%upcase(&amp;amp;&amp;amp;_var&amp;amp;i) %then %do;&lt;BR /&gt;
        %let _keyV=%eval(&amp;amp;_keyV+1);&lt;BR /&gt;
        %let _kvcum=%eval(&amp;amp;_kvcum+1);&lt;BR /&gt;
      %end; &lt;BR /&gt;
      %let i=%eval(&amp;amp;i+1);&lt;BR /&gt;
    %end;&lt;BR /&gt;
    %if &amp;amp;_keyV=0 %then %do;&lt;BR /&gt;
       %let _namerr=&amp;amp;&amp;amp;_kvnam&amp;amp;_vn;&lt;BR /&gt;
       %put !--------------------------------------------------------------------------!;&lt;BR /&gt;
       %put ! Var.: "&amp;amp;_namerr" does not exist in data: "%upcase(&amp;amp;_dsin)", please check !;&lt;BR /&gt;
       %put !__________________________________________________________________________!;&lt;BR /&gt;
    %end;&lt;BR /&gt;
    %let _vn=%eval(&amp;amp;_vn+1);&lt;BR /&gt;
 %end;&lt;BR /&gt;
 %let rc=%sysfunc(close(&amp;amp;dsid));&lt;BR /&gt;
 %if &amp;amp;_kvcum &amp;lt; &amp;amp;_cnkv %then %do;&lt;BR /&gt;
   %goto out;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- if "where = " process specified */&lt;BR /&gt;
 %let _wherein= ;&lt;BR /&gt;
 %if %bquote(&amp;amp;where) ne  %then %do;&lt;BR /&gt;
  %let _wherein=(where=(&amp;amp;where));&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- H_axis label for var to be processed  */&lt;BR /&gt;
 %if %bquote(&amp;amp;H_label)=  %then %do;&lt;BR /&gt;
  %let H_label =%upcase(&amp;amp;ResVar);&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- add cut-off(if specified) for Hlabel  */ &lt;BR /&gt;
 %if %bquote(&amp;amp;Cut_off) ^=  and  %bquote(&amp;amp;Rev_cuv) ^=  %then %do;&lt;BR /&gt;
  %let H_label =%str(&amp;amp;H_label, Cut-off=&amp;amp;Cut_off);&lt;BR /&gt;
 %end; &lt;BR /&gt;
&lt;BR /&gt;
 /*-- V_axis label for percent  */&lt;BR /&gt;
 %if %bquote(&amp;amp;V_label)=  %then %do;&lt;BR /&gt;
  %let _Vlabel=Percent;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if %bquote(&amp;amp;V_label) ^=  %then %do;&lt;BR /&gt;
  %let _Vlabel =%str(Percent of &amp;amp;V_label);&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- Default legenda label as &amp;amp;Group: */&lt;BR /&gt;
 %let _Leglab = %upcase(&amp;amp;group):;&lt;BR /&gt;
 %if %bquote(&amp;amp;L_label) ne  %then %do;&lt;BR /&gt;
  %let _Leglab = %upcase(&amp;amp;L_label):;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- if result variable has character values */&lt;BR /&gt;
 proc contents data=&amp;amp;data out=_outcum noprint; run;&lt;BR /&gt;
&lt;BR /&gt;
 data _null_; &lt;BR /&gt;
  set _outcum;&lt;BR /&gt;
  if upcase(name)="&amp;amp;ResVar" then call symput("_Rvtype", trim(left(type)));&lt;BR /&gt;
 run;&lt;BR /&gt;
 %*put *** &amp;amp;_Rvtype;&lt;BR /&gt;
&lt;BR /&gt;
 %if &amp;amp;_Rvtype=2 %then %do;&lt;BR /&gt;
  data _forcum &amp;amp;_wherein.; set &amp;amp;data;&lt;BR /&gt;
   _newres=input(&amp;amp;resVar, Best.);&lt;BR /&gt;
   if _newres = . then delete;&lt;BR /&gt;
  run;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %else %do;&lt;BR /&gt;
  data _forcum &amp;amp;_wherein.; set &amp;amp;data;&lt;BR /&gt;
   _newres=&amp;amp;resVar;&lt;BR /&gt;
   if _newres = . then delete;&lt;BR /&gt;
  run;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- check if where process successful */&lt;BR /&gt;
 %let dsid=%sysfunc(open(_forcum));&lt;BR /&gt;
 %let _obsin=%sysfunc(attrn(&amp;amp;dsid,nobs));&lt;BR /&gt;
 %let rc=%sysfunc(close(&amp;amp;dsid));&lt;BR /&gt;
 %if &amp;amp;_obsin=0 %then %do;&lt;BR /&gt;
     %put !------------------------------------------------------------------------!;&lt;BR /&gt;
     %put ! Subset data has 0 obs entered, please check your "WHERE" specification !;&lt;BR /&gt;
     %put !________________________________________________________________________!;&lt;BR /&gt;
   %goto out;  &lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if %upcase(&amp;amp;logscal)=E %then %do;&lt;BR /&gt;
   %let logscal=2.7182818284590;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if %upcase(&amp;amp;logscal)=PI %then %do;&lt;BR /&gt;
   %let logscal=3.14159265358979;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- if by &amp;amp;group process */&lt;BR /&gt;
 %if %bquote(&amp;amp;group)= %then %do;&lt;BR /&gt;
  %let _Byin= ;&lt;BR /&gt;
  %Let _eqgrp=;&lt;BR /&gt;
  %let _nmobs=1;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %else %do;&lt;BR /&gt;
  %let _Byin =By &amp;amp;group;&lt;BR /&gt;
  %Let _eqgrp=%str(=&amp;amp;group);&lt;BR /&gt;
&lt;BR /&gt;
  proc sort data=_forcum; &lt;BR /&gt;
   by &amp;amp;group;&lt;BR /&gt;
  run;&lt;BR /&gt;
&lt;BR /&gt;
  /*-- count how many groups and the values of the group */&lt;BR /&gt;
  data _grp(keep=&amp;amp;group);&lt;BR /&gt;
   set _forcum;&lt;BR /&gt;
   proc sort nodupkey;&lt;BR /&gt;
   by &amp;amp;group;&lt;BR /&gt;
  run;&lt;BR /&gt;
&lt;BR /&gt;
  /*-- if group variable has character values */&lt;BR /&gt;
  proc contents data=_grp out=_gtype noprint; run;&lt;BR /&gt;
  data _null_; &lt;BR /&gt;
   set _gtype;&lt;BR /&gt;
   call symput("_Gtype", trim(left(type)));&lt;BR /&gt;
  run;&lt;BR /&gt;
  %*put ***Group type: &amp;amp;_Gtype; &lt;BR /&gt;
&lt;BR /&gt;
  data _null_;&lt;BR /&gt;
   set _grp end=eof;&lt;BR /&gt;
   if eof then call symput("_nmobs",trim(left(_N_)));&lt;BR /&gt;
  run;&lt;BR /&gt;
  %*put ***Group NB: &amp;amp;_nmobs; &lt;BR /&gt;
&lt;BR /&gt;
  proc transpose data=_grp out=_outg prefix=_G; var &amp;amp;group; run;&lt;BR /&gt;
&lt;BR /&gt;
  /*-- loop to set group values into macro var. */&lt;BR /&gt;
  %Let i=1;&lt;BR /&gt;
  %do %while(&amp;amp;i &amp;lt;= &amp;amp;_nmobs);&lt;BR /&gt;
    data _null_;&lt;BR /&gt;
      set _outg;&lt;BR /&gt;
      call symput("_Gv&amp;amp;i", trim(left(_G&amp;amp;i)));&lt;BR /&gt;
    run;&lt;BR /&gt;
    %let i=%eval(&amp;amp;i+1);&lt;BR /&gt;
  %end;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 proc freq noprint data=_forcum;&lt;BR /&gt;
  tables _newres/out=_resfrq;&lt;BR /&gt;
  &amp;amp;_byin.;&lt;BR /&gt;
 run;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- set ticks in plot parameters */&lt;BR /&gt;
 %let _Lgtik=;&lt;BR /&gt;
 %let _order=;&lt;BR /&gt;
 %let _Lgord=;&lt;BR /&gt;
&lt;BR /&gt;
 %if %bquote(&amp;amp;Logscal) ^= %then&lt;BR /&gt;
 %do; &lt;BR /&gt;
   %let _Lgtik=Y;&lt;BR /&gt;
   data null_; set _resfrq; where _newres &amp;lt;=0; run;&lt;BR /&gt;
&lt;BR /&gt;
   %let dsid=%sysfunc(open(null_));&lt;BR /&gt;
   %let _obsin=%sysfunc(attrn(&amp;amp;dsid,nobs));&lt;BR /&gt;
   %let rc=%sysfunc(close(&amp;amp;dsid));&lt;BR /&gt;
   %if &amp;amp;_obsin &amp;gt; 0 %then&lt;BR /&gt;
   %do;&lt;BR /&gt;
     %put !----------------------------------------------------------!;&lt;BR /&gt;
     %put !NOTE: &amp;amp;_obsin obs with values &amp;lt;=0 are not counted for log-scale !;&lt;BR /&gt;
     %put !__________________________________________________________!;&lt;BR /&gt;
   %end;&lt;BR /&gt;
&lt;BR /&gt;
   /* all positive values for logscale */  &lt;BR /&gt;
   data _resfrq;  set _resfrq; if _newres &amp;lt;= 0 then delete; run;&lt;BR /&gt;
&lt;BR /&gt;
   %if %bquote(&amp;amp;tikmark) =  %then&lt;BR /&gt;
   %do;&lt;BR /&gt;
     data _minres; set _resfrq; Proc sort; by _newres; run;&lt;BR /&gt;
     data _null_; set _minres;&lt;BR /&gt;
       if _N_=1 then call symput("_minr", trim(left(_newres)));&lt;BR /&gt;
     run;&lt;BR /&gt;
&lt;BR /&gt;
     %if %bquote(&amp;amp;_minr) &amp;gt;= 1 %then&lt;BR /&gt;
     %do;&lt;BR /&gt;
       %let int_r=%sysfunc(floor(&amp;amp;_minr)); &lt;BR /&gt;
       %let Len_R=%length(&amp;amp;int_r);&lt;BR /&gt;
       %let tik_L=%eval(&amp;amp;len_R-1);&lt;BR /&gt;
       %let tik_one=%sysevalf(&amp;amp;Logscal**&amp;amp;tik_L);&lt;BR /&gt;
     %end;&lt;BR /&gt;
&lt;BR /&gt;
     %if %bquote(&amp;amp;_minr) &amp;lt; 1 %then&lt;BR /&gt;
     %do;&lt;BR /&gt;
       %let _cnt=3;&lt;BR /&gt;
       %let _cnt0=1;&lt;BR /&gt;
       %let Td=%substr(&amp;amp;_minr, &amp;amp;_cnt,1);&lt;BR /&gt;
       %do %while (&amp;amp;td=0 );&lt;BR /&gt;
        %let _cnt=%eval(&amp;amp;_cnt+1);&lt;BR /&gt;
        %let td  = %substr(&amp;amp;_minr, &amp;amp;_cnt,1);&lt;BR /&gt;
        %put &amp;amp;_cnt;&lt;BR /&gt;
        %let _cnt0=%eval(&amp;amp;_cnt-2);&lt;BR /&gt;
       %end;&lt;BR /&gt;
       %put Cnt: -&amp;amp;_cnt0 ***;&lt;BR /&gt;
       %let tik_one=%sysevalf(1/(&amp;amp;Logscal**&amp;amp;_cnt0));&lt;BR /&gt;
       %put tik_ONE: &amp;amp;tik_one;&lt;BR /&gt;
     %end;&lt;BR /&gt;
   %end;&lt;BR /&gt;
&lt;BR /&gt;
   %if %bquote(&amp;amp;tikmark)  ne  %then &lt;BR /&gt;
   %do;   &lt;BR /&gt;
      %let _Utik=%index(&amp;amp;tikmark,/);&lt;BR /&gt;
      %if &amp;amp;_Utik ^=0 %then &lt;BR /&gt;
      %do;&lt;BR /&gt;
        %put !----------------------------------------------------------!;&lt;BR /&gt;
        %put ! Please enter tick marks separated by blank for log scale !;&lt;BR /&gt;
        %put !__________________________________________________________!;&lt;BR /&gt;
        %goto out;&lt;BR /&gt;
      %end; &lt;BR /&gt;
&lt;BR /&gt;
      %if &amp;amp;_Utik=0 %then&lt;BR /&gt;
      %do;&lt;BR /&gt;
        %let tik_one=%scan(&amp;amp;tikmark, 1, " ");&lt;BR /&gt;
        %let _Lgord=%str(order=(&amp;amp;tikmark));&lt;BR /&gt;
      %end;&lt;BR /&gt;
   %end;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if &amp;amp;Logscal=   %then &lt;BR /&gt;
 %do; &lt;BR /&gt;
   %let _Lgtik=N;&lt;BR /&gt;
   %if %bquote(&amp;amp;tikmark)=  %then %do; &lt;BR /&gt;
      %let _order= ;&lt;BR /&gt;
      data _minres; set _resfrq; Proc sort; by _newres; run;&lt;BR /&gt;
      data _null_; set _minres;&lt;BR /&gt;
       if _N_=1 then call symput("_minr", trim(left(floor(_newres))));&lt;BR /&gt;
      run;&lt;BR /&gt;
      %put Min res: &amp;amp;_minr;&lt;BR /&gt;
      %let tik_one=%sysevalf(&amp;amp;_minr-1);&lt;BR /&gt;
      %put 1st tick: &amp;amp;tik_one;&lt;BR /&gt;
   %end;&lt;BR /&gt;
   %if %bquote(&amp;amp;tikmark) ne  %then %do; &lt;BR /&gt;
      %let _Utik=%index(&amp;amp;tikmark,/);&lt;BR /&gt;
      %*put ***_UTIK: &amp;amp;_UTIK;&lt;BR /&gt;
      %if  &amp;amp;_Utik=0 %then %do;&lt;BR /&gt;
         %put !---------------------------------------------------------!;&lt;BR /&gt;
         %put ! Please enter tik mark as: Min/Max/Step for normal scale !;&lt;BR /&gt;
         %put !_________________________________________________________!;&lt;BR /&gt;
         %goto out;&lt;BR /&gt;
      %end;&lt;BR /&gt;
      %if  &amp;amp;_Utik ^= 0  %then %do;&lt;BR /&gt;
         %let mintik =%scan(&amp;amp;tikmark, 1, /);&lt;BR /&gt;
         %let maxtik =%scan(&amp;amp;tikmark, 2, /);&lt;BR /&gt;
         %let steptik=%scan(&amp;amp;tikmark, 3, /);&lt;BR /&gt;
         %let tik_one=&amp;amp;mintik;&lt;BR /&gt;
         %let _ord=%str(&amp;amp;mintik to &amp;amp;maxtik by &amp;amp;steptik);&lt;BR /&gt;
         %let _order=%str(order=(&amp;amp;_ord));&lt;BR /&gt;
      %end;&lt;BR /&gt;
   %end;&lt;BR /&gt;
 %end;&lt;BR /&gt;
 %*put ***    tik: &amp;amp;_order;&lt;BR /&gt;
 %*put *** Logtik: &amp;amp;_Lgord;&lt;BR /&gt;
&lt;BR /&gt;
 /*------ data preparing for plot ----*/&lt;BR /&gt;
 %let _per_rv=%str(per_rv=pct_cum;);&lt;BR /&gt;
 %if %bquote(&amp;amp;Rev_cuv) ^=  %then %do;&lt;BR /&gt;
    %let _per_rv=%str(per_rv=100 - pct_cum;);&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if %bquote(&amp;amp;group)= %then %do;&lt;BR /&gt;
   proc sql;&lt;BR /&gt;
     create table _resadd(_newres numeric,  count numeric, percent numeric);&lt;BR /&gt;
     insert into _resadd&lt;BR /&gt;
     values(&amp;amp;tik_one, 0, 0);&lt;BR /&gt;
     quit;  &lt;BR /&gt;
   data _cumup; set _resadd _resfrq;&lt;BR /&gt;
     retain pct_cum 0  cnt_cum 0;&lt;BR /&gt;
     pct_cum + percent;&lt;BR /&gt;
     cnt_cum + count;&lt;BR /&gt;
     &amp;amp;_per_rv;&lt;BR /&gt;
   run ;&lt;BR /&gt;
 %end;&lt;BR /&gt;
 &lt;BR /&gt;
 %if %bquote(&amp;amp;group) ne %then %do;&lt;BR /&gt;
  %if &amp;amp;_gtype=1 %then %do;&lt;BR /&gt;
     %Let i=1;&lt;BR /&gt;
     %do %while(&amp;amp;i &amp;lt;= &amp;amp;_nmobs);&lt;BR /&gt;
       proc sql;&lt;BR /&gt;
         create table _resadd(_newres numeric,  count numeric, percent numeric, &amp;amp;group numeric);&lt;BR /&gt;
         insert into _resadd&lt;BR /&gt;
         values(&amp;amp;tik_one, 0, 0,&amp;amp;&amp;amp;_Gv&amp;amp;i);&lt;BR /&gt;
         quit;  &lt;BR /&gt;
       data _cumu&amp;amp;i; &lt;BR /&gt;
        set _resadd _resfrq(where=(&amp;amp;group=&amp;amp;&amp;amp;_Gv&amp;amp;i));&lt;BR /&gt;
        retain pct_cum 0 cnt_cum 0; &lt;BR /&gt;
        pct_cum + percent;&lt;BR /&gt;
        cnt_cum + count;&lt;BR /&gt;
        &amp;amp;_per_rv;&lt;BR /&gt;
       run ; &lt;BR /&gt;
      %let i=%eval(&amp;amp;i+1);&lt;BR /&gt;
     %end;&lt;BR /&gt;
  %end;&lt;BR /&gt;
  %if &amp;amp;_gtype=2 %then %do;&lt;BR /&gt;
     %Let i=1;&lt;BR /&gt;
     %do %while(&amp;amp;i &amp;lt;= &amp;amp;_nmobs);&lt;BR /&gt;
       proc sql;&lt;BR /&gt;
         create table _resadd(_newres numeric,  count numeric, percent numeric, &amp;amp;group char);&lt;BR /&gt;
         insert into _resadd&lt;BR /&gt;
         values(&amp;amp;tik_one, 0, 0,"&amp;amp;&amp;amp;_Gv&amp;amp;i");&lt;BR /&gt;
         quit;  &lt;BR /&gt;
      data _cumu&amp;amp;i; &lt;BR /&gt;
       set _resadd _resfrq(where=(&amp;amp;group="&amp;amp;&amp;amp;_Gv&amp;amp;i"));&lt;BR /&gt;
       retain pct_cum 0 cnt_cum 0; &lt;BR /&gt;
       pct_cum + percent;&lt;BR /&gt;
       cnt_cum + count;&lt;BR /&gt;
       &amp;amp;_per_rv;&lt;BR /&gt;
      run ; &lt;BR /&gt;
      %let i=%eval(&amp;amp;i+1);&lt;BR /&gt;
     %end;&lt;BR /&gt;
  %end;&lt;BR /&gt;
&lt;BR /&gt;
  data _cumup;&lt;BR /&gt;
   set %do n=1 %to &amp;amp;_nmobs;&lt;BR /&gt;
        _cumu&amp;amp;n &lt;BR /&gt;
       %end;;&lt;BR /&gt;
  run;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- if send graph out */&lt;BR /&gt;
&lt;BR /&gt;
 GOPTIONS RESET=all;&lt;BR /&gt;
&lt;BR /&gt;
 %if %bquote(&amp;amp;sendout) ^=  %then %do; &lt;BR /&gt;
&lt;BR /&gt;
   %let _rotate=%str(rotate=landscape);&lt;BR /&gt;
&lt;BR /&gt;
   %if %bquote(&amp;amp;figname) =  %then %do;&lt;BR /&gt;
     %let figname=&amp;amp;data._&amp;amp;Resvar._cumcuv;&lt;BR /&gt;
   %end;&lt;BR /&gt;
&lt;BR /&gt;
   %if %bquote(&amp;amp;figtype) ^=  %then %do;&lt;BR /&gt;
     %let _gtype=&amp;amp;figtype;&lt;BR /&gt;
     %LET _dev  =&amp;amp;figtype;&lt;BR /&gt;
   %end;&lt;BR /&gt;
&lt;BR /&gt;
   %if %upcase(&amp;amp;figtype)=GIF  or %bquote(&amp;amp;figtype)=   %then %do;&lt;BR /&gt;
     %put *** The Default Type of Graph for Sending Out Is "GIF" ***;&lt;BR /&gt;
     %let _gtype=GIF;&lt;BR /&gt;
     %LET _dev  =GIF;&lt;BR /&gt;
   %end;&lt;BR /&gt;
&lt;BR /&gt;
   %if %upcase(&amp;amp;figtype)=CGM %then %do;&lt;BR /&gt;
     %let _gtype=CGM;&lt;BR /&gt;
     %LET _dev  =cgmof97l;&lt;BR /&gt;
     %let _rotate= ;&lt;BR /&gt;
   %end;&lt;BR /&gt;
 &lt;BR /&gt;
   FILENAME grafout "&amp;amp;sendout\&amp;amp;figname..&amp;amp;_gtype";&lt;BR /&gt;
   GOPTIONS border &amp;amp;_rotate.  Ftext=SWISS CBACK=white COLORS=(black)&lt;BR /&gt;
            DEVICE=&amp;amp;_dev.  GSFNAME=grafout  GSFMODE= REPLACE;      &lt;BR /&gt;
 %end; &lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
 /*-- loop on plot symbol for diff. groups */&lt;BR /&gt;
 %if %bquote(&amp;amp;INT_POL) =  %then %do;&lt;BR /&gt;
   %let int_pol=STEPJL;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %let _plotsymb=DOT TRIANGLE SQUARE CIRCLE STAR DIAMOND PLUS HASH # @ X Y Z A B C U V;&lt;BR /&gt;
 %let _pltcolor=BL R B G Y P GR LIB VIOLET GOLD CYAN TAN ROSE CREAM PINK MAROON OLIVE STEEL;&lt;BR /&gt;
&lt;BR /&gt;
 %let _cnt=1;&lt;BR /&gt;
 %do %while ( &amp;amp;_cnt &amp;lt;= &amp;amp;_nmobs);&lt;BR /&gt;
    %let _symb&amp;amp;_cnt=%qscan(&amp;amp;_plotsymb, &amp;amp;_cnt);&lt;BR /&gt;
    %let _colr&amp;amp;_cnt=%qscan(&amp;amp;_pltcolor, &amp;amp;_cnt);&lt;BR /&gt;
&lt;BR /&gt;
    %if &amp;amp;symcolr = %then %do;&lt;BR /&gt;
      SYMBOL&amp;amp;_cnt COLOR=BLACK INTERPOL=&amp;amp;INT_POL VALUE=&amp;amp;&amp;amp;_symb&amp;amp;_cnt HEIGHT=1.0;&lt;BR /&gt;
    %end;&lt;BR /&gt;
&lt;BR /&gt;
    %if &amp;amp;symcolr ^=  %then %do;&lt;BR /&gt;
      SYMBOL&amp;amp;_cnt COLOR=&amp;amp;&amp;amp;_colr&amp;amp;_cnt INTERPOL=&amp;amp;INT_POL VALUE=&amp;amp;&amp;amp;_symb&amp;amp;_cnt HEIGHT=1.0;&lt;BR /&gt;
    %end;&lt;BR /&gt;
    %let _cnt=%eval(&amp;amp;_cnt+1);&lt;BR /&gt;
 %end;&lt;BR /&gt;
 &lt;BR /&gt;
 AXIS1 LABEL=(HEIGHT=1.3 ANGLE = 90 "&amp;amp;_Vlabel") ORDER=(0 TO 100 BY 20) WIDTH=1;&lt;BR /&gt;
&lt;BR /&gt;
 %if &amp;amp;_lgtik=Y %then %do;&lt;BR /&gt;
    AXIS2 LOGBASE=&amp;amp;logscal LOGSTYLE=EXPAND label=(HEIGHT=1.4 "&amp;amp;H_label.") &amp;amp;_Lgord WIDTH=1;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if &amp;amp;_lgtik=N %then %do;&lt;BR /&gt;
    AXIS2 label=(HEIGHT=1.4 "&amp;amp;H_label.") &amp;amp;_order WIDTH=1;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- legend box positioning */&lt;BR /&gt;
 %if &amp;amp;L_local=  %then %do; %let L_local=TR; %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=TL %then %do; %let _L_local=TOP LEFT inside;   %let _offset=%str(OFFSET=( 5,-2)); %end;&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=TC %then %do; %let _L_local=TOP CENTER inside; %let _offset=%str(OFFSET=( 0,-2)); %end;&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=TR %then %do; %let _L_local=TOP RIGHT inside;  %let _offset=%str(OFFSET=(-6,-2)); %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=ML %then %do; %let _L_local=MIddle LEFT inside;  %let _offset=%str(OFFSET=( 5,2)); %end;&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=MC %then %do; %let _L_local=MIddle CENTER inside;%let _offset=%str(OFFSET=( 0,2)); %end;&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=MR %then %do; %let _L_local=MIddle RIGHT inside; %let _offset=%str(OFFSET=(-6,2)); %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=BL %then %do; %let _L_local=BOTTOM LEFT inside;  %let _offset=%str(OFFSET=( 5,4)); %end;&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=BC %then %do; %let _L_local=BOTTOM CENTER inside;%let _offset=%str(OFFSET=( 0,4)); %end;&lt;BR /&gt;
 %if %upcase(&amp;amp;L_local)=BR %then %do; %let _L_local=BOTTOM RIGHT inside; %let _offset=%str(OFFSET=(-6,4)); %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- vertical cut-off reference line */&lt;BR /&gt;
 %if %bquote(&amp;amp;cut_off) =  %then %do;&lt;BR /&gt;
   %let _cutoff= ;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 %if %bquote(&amp;amp;cut_off) ^=  %then %do;&lt;BR /&gt;
   %let _cutoff=%str(HREF=&amp;amp;cut_off LHREF=4);&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 LEGEND  ACROSS=1&lt;BR /&gt;
         MODE=SHARE &lt;BR /&gt;
         SHAPE=SYMBOL(5,0.8)&lt;BR /&gt;
         LABEL=(POSITION=TOP J=L "&amp;amp;_Leglab")&lt;BR /&gt;
         VALUE=(J=L)&lt;BR /&gt;
         POSITION=(&amp;amp;_L_local)&lt;BR /&gt;
         &amp;amp;_offset;&lt;BR /&gt;
 &lt;BR /&gt;
  PROC GPLOT DATA=_cumup;&lt;BR /&gt;
    PLOT per_rv*_newres&amp;amp;_eqgrp./Frame &amp;amp;_cutoff VAXIS=axis1 HAXIS=axis2 &lt;BR /&gt;
                                LEGEND=legend;&lt;BR /&gt;
  RUN;&lt;BR /&gt;
  QUIT; &lt;BR /&gt;
&lt;BR /&gt;
 %if %bquote(&amp;amp;sendout) ne  %then %do;&lt;BR /&gt;
   FILENAME Grafout CLEAR;&lt;BR /&gt;
 %end;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- reset all goptions */&lt;BR /&gt;
 GOPTIONS RESET=All;&lt;BR /&gt;
&lt;BR /&gt;
 /*-- drop all intermediate tables */&lt;BR /&gt;
 proc sql;&lt;BR /&gt;
   drop table  _forcum, _outcum, _minres,   &lt;BR /&gt;
              %if &amp;amp;group ne %then %do n=1 %to &amp;amp;_nmobs;&lt;BR /&gt;
                _cumu&amp;amp;n, &lt;BR /&gt;
              %end;&lt;BR /&gt;
              %if &amp;amp;group ne %then _grp, _gtype, _outg,;&lt;BR /&gt;
              %if &amp;amp;Logscal ne %then null_,;&lt;BR /&gt;
              _resadd, _resfrq;&lt;BR /&gt;
 quit; &lt;BR /&gt;
 %out:&lt;BR /&gt;
%mend cumucuv;&lt;BR /&gt;
&lt;BR /&gt;
/**----   Example To Run -----------------------------------**&lt;BR /&gt;
** for reverse cumulative curve ***;                                                                                                                                  &lt;BR /&gt;
%cumucuv(    data = sashelp.class                                                                                                     &lt;BR /&gt;
          ,Resvar = age                                                                                                             &lt;BR /&gt;
          , Group = sex                                                                                                            &lt;BR /&gt;
          ,Rev_cuv= y  &lt;BR /&gt;
         );       &lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
%cumucuv(    data = sashelp.class                                                                                                     &lt;BR /&gt;
          ,Resvar = age                                                                                                             &lt;BR /&gt;
          , Group = sex                                                                                                            &lt;BR /&gt;
          ,Rev_cuv=   &lt;BR /&gt;
         );       &lt;BR /&gt;
**----------------------------------------------------------**/</description>
      <pubDate>Mon, 03 Dec 2007 07:39:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Health-and-Life-Sciences/Empirical-reverse-culmulative-density-function/m-p/5553#M482</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2007-12-03T07:39:45Z</dc:date>
    </item>
    <item>
      <title>Re: Empirical reverse culmulative density function</title>
      <link>https://communities.sas.com/t5/SAS-Health-and-Life-Sciences/Empirical-reverse-culmulative-density-function/m-p/5554#M483</link>
      <description>It might be a limit to paste all codes, if you want it, let me know your e-mail address and I can send the whole macro codes to you.</description>
      <pubDate>Mon, 03 Dec 2007 09:30:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Health-and-Life-Sciences/Empirical-reverse-culmulative-density-function/m-p/5554#M483</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2007-12-03T09:30:28Z</dc:date>
    </item>
  </channel>
</rss>

