Advertisement
Guest User

Untitled

a guest
Jan 16th, 2017
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.62 KB | None | 0 0
  1. /*=============================================================================
  2. Project Information
  3. -------------------------------------------------------------------------------
  4. Customer Name : Novartis
  5. Protocol Number : QVA149A2349/QVA149A2350
  6. Project Code : OXA69155/OXA69156
  7. Study Drug : QVA149\Indacaterol maleate\Glycopyrronium bromide
  8. Project Root Path : \Novartis\QVA149\OXA69155
  9. ------------------------------------------------------------------------------
  10. Program Information
  11. -------------------------------------------------------------------------------
  12. Program : ..\OXA69155\Biostatistics\Production\Macro\m_descr.sas
  13.  
  14. Brief Description : Macro for derivation of descriptive statistics
  15. Copied From : \Client\Compound\Study\Biostatistics\...
  16. Raw Data Sets Used : \Data\CDM_Data\ [...]
  17. \Data\SDTM\ [...]
  18. \Data\External\ [...]
  19. \Data\PK_Data\ [...]
  20. \Data\Coding_Dictionaries\ [...]
  21. Derived Data Sets Used : \Data\Derived\ []
  22. Data Set Created : \Data\Derived\ [...]
  23. \Data\QC_Derived\ [...]
  24. Output Files : \Output\Production_Out\ []
  25. \Output\QC_Out\ [...]
  26.  
  27. Notes / Assumptions : dsin - input dataset; must have vertical structure
  28. : dsout - output dataset
  29. : param - parameter name (stats are calculated by parameter)
  30. : valuen - variable containing numeric result of corresponding parameter
  31. : by - name of by-variable (e.g. by=TRTSEQP if stats needed by treatment group)
  32. : keep_stat - which descriptive stats to keep in &dsout.
  33. Default are n,mean,sd,min,max,median,missing,q1 and q3
  34. : dp_var - variable containing number of decimal points expected per parameter.
  35. If &dp_var left blank, macro will calculate it as maximum DP in the
  36. current data, perparameter, and will use it for rounding and formatting.
  37. Set to dp_var=base for baseline tables with fixed DP
  38. (1dp for min/max, mean and med, 2dp for SE and std).
  39. : missing - set to missing=y to force display "missing" row for each parameter (&param).
  40. -------------------------------------------------------------------------------
  41. Programmer Information
  42. -------------------------------------------------------------------------------
  43. Author : Tetiana Batrak [Q819473]
  44. Creation Date : 16MAY2016
  45. -------------------------------------------------------------------------------
  46. Environment Information
  47. -------------------------------------------------------------------------------
  48. SAS Version : SAS V9.4 (TS Level 2M3)
  49. Operating System : Windows Server 2008 R2
  50. -------------------------------------------------------------------------------
  51. Change Control Information
  52. -------------------------------------------------------------------------------
  53. Modifications :
  54. Programmer/Date :
  55. Reason :
  56. ==============================================================================*/
  57.  
  58.  
  59. options mprint mlogic;
  60.  
  61.  
  62. %macro m_descr( dsin=,
  63. dsout=,
  64. valuen=,
  65. param=,
  66. by=,
  67. dp_var=,
  68. missing=,
  69. keep_stat=%quote('N' 'MEAN' 'SD' 'MIN' 'MEDIAN' 'MAX' 'MISSING' 'UPPERCL' 'LOWERCL' 'Q25' 'Q75')
  70. );
  71.  
  72.  
  73. proc sort data=&dsin; by &by &param;
  74. run;
  75.  
  76.  
  77.  
  78. options linesize=max;
  79. ods output BasicIntervals=ci;
  80. ods listing close;
  81.  
  82. proc univariate data=&dsin cibasic;
  83. var &valuen;
  84. by &by &param;
  85. output out=stat1_ n=n1 mean=mean1 std=sd1 STDMEAN=se1 min=min1 max=max1
  86. pctlpts=25 50 75 pctlpre=pct pctlname=_25 _50 _75 nmiss=nmiss1;
  87. run;
  88. ods listing;
  89.  
  90.  
  91.  
  92. options linesize=138;
  93.  
  94. proc sort data=stat1_ out=stat1a_;
  95. by &by &param;
  96. run;
  97.  
  98.  
  99. proc sort data=ci;
  100. by &by &param;
  101. run;
  102.  
  103.  
  104. data stat1;
  105. merge ci(where=(parameter="Mean")keep=parameter &param &by lowercl uppercl) stat1a_;
  106. by &by &param;
  107. run;
  108.  
  109.  
  110.  
  111. /***----------------------------------------***/
  112. /*** check number of decimals per parameter ***/
  113. /*** (select max DP collected in the data) ***/
  114. /*** and create dynamic format ***/
  115. /***----------------------------------------***/
  116.  
  117. %if &dp_var= %then %do;
  118.  
  119. data dp1;
  120. set &dsin;
  121. if not missing(&valuen) then valuec=put(&valuen,best.);
  122. run;
  123.  
  124.  
  125. data dp2;
  126. set dp1;
  127.  
  128. if index(valuec,'.')>0 then dp=length(compress(scan(valuec,2,'.')));
  129. else dp=0;
  130. run;
  131.  
  132.  
  133. proc sql;
  134. create table dp_fmt as
  135. select distinct &param as start, start as end, max(dp) as dp,
  136. case when max(dp)=0 then put(6+(max(dp)/10),best.)
  137. when max(dp)>0 then put(7+max(dp)+(max(dp)/10),best.)
  138. else " "
  139. end as label,
  140. 'C' as type, 'DP' as fmtname length=20
  141. from dp2
  142. group by &param
  143. ;
  144. quit;
  145.  
  146. proc format cntlin=dp_fmt;
  147. run;
  148. %end;
  149.  
  150. %else %if &dp_var ne base %then %do;
  151. proc sql;
  152. create table dp_fmt as
  153. select distinct &param as start, start as end, max(&dp_var) as dp,
  154. case when max(&dp_var)=0 then put(6+(max(&dp_var)/10),best.)
  155. when max(&dp_var)>0 then put(7+max(&dp_var)+(max(&dp_var)/10),best.)
  156. else " "
  157. end as label,
  158. 'C' as type, 'DP' as fmtname length=20
  159. from &dsin
  160. group by &param
  161. ;
  162. quit;
  163.  
  164. proc format cntlin=dp_fmt;
  165. run;
  166. %end;
  167.  
  168.  
  169. /***----------------------------------------***/
  170. /*** apply formats and create final dataset ***/
  171. /***----------------------------------------***/
  172.  
  173.  
  174. data stat2;
  175. set stat1;
  176. length _mean _sd _se _min _pct_25 _pct_50 _pct_75 _max _upper _lower $200;
  177. %if &dp_var=base %then %do;
  178. if n(mean1)=1 then _mean=put(round(mean1,.1),8.1);
  179. if n(sd1)=1 then _sd=put(round(sd1,.01),9.2);
  180. if n(se1)=1 then _se=put(round(se1,.01),9.2);
  181. if n(min1)=1 then _min=put(round(min1,.1),8.1);
  182. if n(pct_25)=1 then _pct_25=put(round(pct_25,.1),8.1);
  183. if n(pct_50)=1 then _pct_50=put(round(pct_50,.1),8.1);
  184. if n(pct_75)=1 then _pct_75=put(round(pct_75,.1),8.1);
  185. if n(max1)=1 then _max=put(round(max1,.1),8.1);
  186. if n(uppercl)=1 then _upper=put(round(uppercl,.1),8.1);
  187. if n(lowercl)=1 then _lower=put(round(lowercl,.1),8.1);
  188. %end;
  189.  
  190. %else %do;
  191. fmt=put(&param,dp.);
  192.  
  193. if index(fmt,'.')>0 then dp=input(scan(fmt,2,'.'),best.);
  194. else dp=0;
  195.  
  196. if dp>0 then do;
  197. fmt_mean=put(input(fmt,best.)+1.1,best.);
  198. fmt_sd=put(input(fmt,best.)+2.2,best.);
  199. end;
  200. else if dp=0 then do;
  201. fmt_mean=put(input(fmt,best.)+2.1,best.);
  202. fmt_sd=put(input(fmt,best.)+3.2,best.);
  203.  
  204. end;
  205.  
  206. if not missing(mean1) then _mean =putn(round(mean1,10**-(dp+1)),fmt_mean);
  207. if not missing(sd1) then _sd =putn(round(sd1,10**-(dp+2)),fmt_sd);
  208. if not missing(se1) then _se =putn(round(se1,10**-dp),fmt_sd);
  209. if not missing(min1) then _min =putn(round(min1,10**-dp),fmt);
  210.  
  211. if not missing(pct_50) then _pct_50=putn(round(pct_50,10**-(dp+1)),fmt_mean);
  212.  
  213. if not missing(max1) then _max =putn(round(max1,10**-dp),fmt);
  214. if not missing(uppercl) then _upper =putn(round(uppercl,10**-dp),fmt_mean);
  215. if not missing(lowercl) then _lower =putn(round(lowercl,10**-dp),fmt_mean);
  216.  
  217. if not missing(pct_25) then _pct_25=putn(round(pct_25,10**-(dp+1)),fmt_mean);
  218. if not missing(pct_75) then _pct_75=putn(round(pct_75,10**-(dp+1)),fmt_mean);
  219.  
  220.  
  221. %end;
  222.  
  223. _n=put(n1,6.);
  224. _nmiss=put(nmiss1,6.);
  225.  
  226. keep &param &by _: ;
  227. run;
  228.  
  229.  
  230. proc sort data=stat2; by &by &param;
  231. run;
  232.  
  233.  
  234. proc transpose data=stat2/*(%if &by ne %then %do; where=(not missing(&by)) %end;)*/ out=stat3;
  235. by &by &param;
  236. var _: ;
  237. run;
  238.  
  239.  
  240. data &dsout;
  241. length stat $100;
  242. set stat3;
  243. if _name_='_N' then do; stat='n'; ord_stat=1; end;
  244. if _name_='_MEAN' then do; stat='Mean'; ord_stat=2; end;
  245. if _name_='_SD' then do; stat='SD'; ord_stat=3; end;
  246. if _name_='_SE' then do; stat='SE'; ord_stat=4; end;
  247. if _name_='_MIN' then do; stat='Min'; ord_stat=5; end;
  248. if _name_='_PCT_25' then do; stat='Q25'; ord_stat=6; end;
  249. if _name_='_PCT_50' then do; stat='Median'; ord_stat=7; end;
  250. if _name_='_PCT_75' then do; stat='Q75'; ord_stat=8; end;
  251. if _name_='_MAX' then do; stat='Max'; ord_stat=9; end;
  252. if _name_='_MIN_MAX' then do; stat='Min - Max'; ord_stat=10; end;
  253. if _name_='_NMISS' then do; stat='Missing'; ord_stat=11; end;
  254. if _name_='_UPPER' then do; stat='UpperCL'; ord_stat=12; end;
  255. if _name_='_LOWER' then do; stat='LowerCL'; ord_stat=13; end;
  256.  
  257. %if &missing= %then %do;
  258. if _name_='_NMISS' and compress(col1)='0' then delete;
  259. %end;
  260.  
  261. drop _name_;
  262. if upcase(stat) not in (&keep_stat) then delete;
  263. run;
  264.  
  265.  
  266. %mend m_descr;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement