Customized Flowcharts Using SAS Annotation Abhinav Srivastva, PaxVax Inc., Redwood City, CA

Similar documents
Create Flowcharts Using Annotate Facility. Priya Saradha & Gurubaran Veeravel

PharmaSUG 2013 CC26 Automating the Labeling of X- Axis Sanjiv Ramalingam, Vertex Pharmaceuticals, Inc., Cambridge, MA

CONSORT Diagrams with SG Procedures

Using ANNOTATE MACROS as Shortcuts

Data Annotations in Clinical Trial Graphs Sudhir Singh, i3 Statprobe, Cary, NC

PharmaSUG Paper TT10 Creating a Customized Graph for Adverse Event Incidence and Duration Sanjiv Ramalingam, Octagon Research Solutions Inc.

INTRODUCTION TO THE SAS ANNOTATE FACILITY

Text Wrapping with Indentation for RTF Reports

Multiple Graphical and Tabular Reports on One Page, Multiple Ways to Do It Niraj J Pandya, CT, USA

INTRODUCTION TO SAS HOW SAS WORKS READING RAW DATA INTO SAS

Displaying Multiple Graphs to Quickly Assess Patient Data Trends

Streamline Table Lookup by Embedding HASH in FCMP Qing Liu, Eli Lilly & Company, Shanghai, China

Indenting with Style

Are you Still Afraid of Using Arrays? Let s Explore their Advantages

A SAS Macro to Generate Caterpillar Plots. Guochen Song, i3 Statprobe, Cary, NC

Creating Forest Plots Using SAS/GRAPH and the Annotate Facility

Using GSUBMIT command to customize the interface in SAS Xin Wang, Fountain Medical Technology Co., ltd, Nanjing, China

From Clicking to Coding: Using ODS Graphics Designer as a Tool to Learn Graph Template Language

Converting Annotate to ODS Graphics. Is It Possible?

Let Hash SUMINC Count For You Joseph Hinson, Accenture Life Sciences, Berwyn, PA, USA

CC13 An Automatic Process to Compare Files. Simon Lin, Merck & Co., Inc., Rahway, NJ Huei-Ling Chen, Merck & Co., Inc., Rahway, NJ

ABC Macro and Performance Chart with Benchmarks Annotation

SAS Online Training: Course contents: Agenda:

A SAS Macro Utility to Modify and Validate RTF Outputs for Regional Analyses Jagan Mohan Achi, PPD, Austin, TX Joshua N. Winters, PPD, Rochester, NY

Preparing the Office of Scientific Investigations (OSI) Requests for Submissions to FDA

SAS CLINICAL SYLLABUS. DURATION: - 60 Hours

An Efficient Tool for Clinical Data Check

Presentation Quality Graphics with SAS/GRAPH

There s No Such Thing as Normal Clinical Trials Data, or Is There? Daphne Ewing, Octagon Research Solutions, Inc., Wayne, PA

PharmaSUG Paper SP09

PharmaSUG Paper TT11

A Breeze through SAS options to Enter a Zero-filled row Kajal Tahiliani, ICON Clinical Research, Warrington, PA

Reading and Writing RTF Documents as Data: Automatic Completion of CONSORT Flow Diagrams

This paper describes a report layout for reporting adverse events by study consumption pattern and explains its programming aspects.

Real Time Clinical Trial Oversight with SAS

SAS/GRAPH : Using the Annotate Facility

KEYWORDS Metadata, macro language, CALL EXECUTE, %NRSTR, %TSLIT

Validation Summary using SYSINFO

PharmaSUG China. Systematically Reordering Axis Major Tick Values in SAS Graph Brian Shen, PPDI, ShangHai

Creating output datasets using SQL (Structured Query Language) only Andrii Stakhniv, Experis Clinical, Ukraine

... WHERE. AnnotaI8 Data.S... XSYS & YSYS. Harie Annotate: How Not to Lose Your Head When Enhancing BAS/GRAPH output

ICD_CLASS SAS Software User s Guide. Version FY Prepared for: U.S. Centers for Disease Control and Prevention

Submitting SAS Code On The Side

ODS/RTF Pagination Revisit

Run your reports through that last loop to standardize the presentation attributes

It s Not All Relative: SAS/Graph Annotate Coordinate Systems

Not Just Merge - Complex Derivation Made Easy by Hash Object

Automate Clinical Trial Data Issue Checking and Tracking

TLF Management Tools: SAS programs to help in managing large number of TLFs. Eduard Joseph Siquioco, PPD, Manila, Philippines

Arthur L. Carpenter California Occidental Consultants, Oceanside, California

PharmaSUG China

Annotate Dictionary CHAPTER 11

Getting Up to Speed with PROC REPORT Kimberly LeBouton, K.J.L. Computing, Rossmoor, CA

Pete Lund Looking Glass Analytics, Olympia, WA

Getting it Done with PROC TABULATE

My Reporting Requires a Full Staff Help!

The GSLIDE Procedure. Overview. About Text Slides CHAPTER 27

RWI not REI a Robust report writing tool for your toughest mountaineering challenges.

JMP Clinical. Release Notes. Version 5.0

A Fully Automated Approach to Concatenate RTF outputs and Create TOC Zhiping Yan, Covance, Beijing, China Lugang Xie, Merck, Princeton, US

The GANNO Procedure. Overview CHAPTER 12

%ANYTL: A Versatile Table/Listing Macro

IT S THE LINES PER PAGE THAT COUNTS Jonathan Squire, C2RA, Cambridge, MA Johnny Tai, Comsys, Portage, MI

To conceptualize the process, the table below shows the highly correlated covariates in descending order of their R statistic.

%EventChart: A Macro to Visualize Data with Multiple Timed Events

PharmaSUG Paper CC11

Part 1. Getting Started. Chapter 1 Creating a Simple Report 3. Chapter 2 PROC REPORT: An Introduction 13. Chapter 3 Creating Breaks 57

Multiple Forest Plots and the SAS System

Get SAS sy with PROC SQL Amie Bissonett, Pharmanet/i3, Minneapolis, MN

A Three-piece Suite to Address the Worth and Girth of Expanding a Data Set. Phil d Almada, Duke Clinical Research Institute, Durham, North Carolina

Get Started Writing SAS Macros Luisa Hartman, Jane Liao, Merck Sharp & Dohme Corp.

Quick Data Definitions Using SQL, REPORT and PRINT Procedures Bradford J. Danner, PharmaNet/i3, Tennessee

Your Own SAS Macros Are as Powerful as You Are Ingenious

A Simple Time Series Macro Scott Hanson, SVP Risk Management, Bank of America, Calabasas, CA

SAS Visual Analytics Environment Stood Up? Check! Data Automatically Loaded and Refreshed? Not Quite

SAS 9 Programming Enhancements Marje Fecht, Prowerk Consulting Ltd Mississauga, Ontario, Canada

Fly over, drill down, and explore

SAS (Statistical Analysis Software/System)

Combining TLFs into a Single File Deliverable William Coar, Axio Research, Seattle, WA

PharmaSUG 2017 Paper BB02

Statistics and Data Analysis. Common Pitfalls in SAS Statistical Analysis Macros in a Mass Production Environment

Sorting big datasets. Do we really need it? Daniil Shliakhov, Experis Clinical, Kharkiv, Ukraine

PharmaSUG China 2018 Paper AD-62

ABSTRACT INTRODUCTION THE ODS TAGSET FACILITY

USING SAS HASH OBJECTS TO CUT DOWN PROCESSING TIME Girish Narayandas, Optum, Eden Prairie, MN

Data Edit-checks Integration using ODS Tagset Niraj J. Pandya, Element Technologies Inc., NJ Vinodh Paida, Impressive Systems Inc.

Using PROC REPORT to Cross-Tabulate Multiple Response Items Patrick Thornton, SRI International, Menlo Park, CA

Presentation Quality Bulleted Lists Using ODS in SAS 9.2. Karl M. Kilgore, PhD, Cetus Group, LLC, Timonium, MD

Taming the Box Plot. Sanjiv Ramalingam, Octagon Research Solutions, Inc., Wayne, PA

Easing into Data Exploration, Reporting, and Analytics Using SAS Enterprise Guide

Square Peg, Square Hole Getting Tables to Fit on Slides in the ODS Destination for PowerPoint

ABSTRACT INTRODUCTION MACRO. Paper RF

ODS LAYOUT is Like an Onion

Create a Format from a SAS Data Set Ruth Marisol Rivera, i3 Statprobe, Mexico City, Mexico

Macro Quoting: Which Function Should We Use? Pengfei Guo, MSD R&D (China) Co., Ltd., Shanghai, China

A Picture is worth 3000 words!! 3D Visualization using SAS Suhas R. Sanjee, Novartis Institutes for Biomedical Research, INC.

separate representations of data.

PharmaSUG China Paper 059

Using MACRO and SAS/GRAPH to Efficiently Assess Distributions. Paul Walker, Capital One

Techdata Solution. SAS Analytics (Clinical/Finance/Banking)

Transcription:

ABSTRACT Customized Flowcharts Using SAS Annotation Abhinav Srivastva, PaxVax Inc., Redwood City, CA Data visualization is becoming a trend in all sectors where critical business decisions or assessments are made. In pharmaceuticals, flowcharts are used to provide a high-level overview of the clinical trials data such as summarizing patients disposition, enrollments and summary of adverse events, medical history or dosing data. As opposed to most common layouts that SAS can generate using newer SG procedures or GTL, these flowcharts have non-typical layouts and refer back to the concept of SAS/GRAPH Annotate Facility. The paper will have a brief discussion on some SAS annotation functions/macros paving the way for a SAS macro that allows users to make the flowcharts customizable to meet their requirements and enabling the production of several forms with minimal programming effort. This flexibility is achieved through a naming system that has been developed and is discussed in great detail in following sections. INTRODUCTION The flowcharts can take many forms and below is one example of Clinical Study status from Enrollment to Completion. It indicates the number of subjects who signed the Informed Consent form, followed by subjects who were randomized if not a screen failure. Based on Intent to Treat principle a Full Analysis Set (FAS) is defined further, leading to a summary of completions and discontinuations. This information can be represented in the form of a flowchart as in Figure 1 below - IC Signed (N=100) Rand. Set (N=90) FAS Set (N=90) Completed (N=80) Terminated (N=10) Figure 1: Clinical Study-level flowchart The macro discussed below allows user to make the flowchart customizable with the number of tiers or floors needed and establishing relevant linking between the individual elements. Some other sample layouts are displayed in Figure 2 below Figure 2: Sample flowchart templates 1

SAS ANNOTATION FUNCTIONS The Annotate facility enables customization of the layout by drawing objects of interest through a set of annotation tools available in SAS. The annotation macros used for this flowchart are listed below in Table 1. Macros Usage %ARROW %ARROW (x1, y1, x2, y2, color, line, size, angle, style) %BAR %BAR (x1, y1, x2, y2, color, line, style) %LABEL %LABEL (x, y, text-string, color, angle, rotate, size, style, position) Table 1: Annotation Macros Before invoking the macros the following needs to be submitted to compile the annotation macros %annomac The complete list along with the syntax can be found by submitting a statement as- %helpano %helpano(label) /* for Label macro and so on.. */ The key elements of annotation include: FUNCTIONS STYLING POSITIONING label, bar, arrow Color, Size, Style, Position x, y, xsys, ysys For more information on annotation please see reference [1] in the REFERENCE section. FLOWCHART MACRO NAMING SYSTEM The macro creates the flowchart taking into account the number of tiers or floors and the linking that is desired in the flowchart. These objects are marked below- Tiers 11 11>21 Floor 1 Link 21 Floor 2 Element 21>31 21>32 31 32 Floor 3 Elements Figure 3: Naming System Each element in the flowchart is designated by an ID which is a combination of floor # and element #. Floors are counted from top to bottom and elements are counted from left to right. For the above example, the first element (top box) is 2

identified by 11 (floor = 1, element = 1), the second element by 21 (floor = 2, element = 1) and finally the bottom two elements will be assigned as 31 & 32 respectively. Assigning IDs this way allows for linking between them, for example 11 >21 implies Box 1 on first tier (ID= 11) is linked with Box 1 on second tier (ID=21) and so on. These instructions can be summarized in a table as below: ID Instructions SAS Annotation Macros 11 Draw a box on Tier 1 as the first element %BAR 21 Draw a box on Tier 2 as the first element %BAR 31 Draw a box on Tier 3 as the first element %BAR 32 Draw a box on Tier 3 as the second element %BAR 11>21 Draw a link connecting ID=11 and ID=21 %ARROW 21>31 Draw a link connecting ID=21 and ID=31 %ARROW 21>32 Draw a link connecting ID=21 and ID=32 %ARROW Table 2: Tabular representation of Naming System FLOWCHART MACRO After having a grasp of the naming system in the previous section, lets proceed with designing the flowchart. The flowchart macro is composed of 2 steps: 1. Create a comprehensive universal set of elements and links 2. Superimpose the desired flowchart onto the universal set in Step 1 to identify the layout of interest and hide extra objects from the universal set In order to demonstrate the execution of the macro let s consider the test case of Figure 1: Clinical Study-level Flowchart from the INTRODUCTION section. STEP 1: CREATE A UNIVERSAL SET Using the annotation functions listed earlier a universal set is created where several combinations of elements and links are drawn. The below figure is a 4x4 set (4 tiers and 4 elements/tier) combination but this can be expanded to as many tiers as needed depending on the page settings. Every object in the universal set has a unique ID as marked below per the naming system. 11>22 3 1 11>12 4 12>13 13>14 11 12 13 14 2 11>21 14>23 21>22 22>23 23>24 21 22 23 24 31>32 32>33 33>34 31 32 33 34 24>23 41 41>42 42>43 43>44 42 43 44 Figure 4: Universal set 3

An annotated dataset is created using the annotation macros. A snippet of the annotation for ID=11 (leftmost box on tier 1) is shown in the below display. 1 2 3 4 Display 1: Annotation for ID=11 Two new variables are created in the annotated dataset ID and LINK. LINK refers to the linkage for the given ID. 1 A bar is drawn with ID=11 using %BAR function. LINK variable is set to 00 [2] 2 An arrow is drawn using %ARROW function originating from ID=11 as 11>21 which is defined in LINK variable [3] 3 An arrow is drawn using %ARROW function originating from ID=11 as 11>22 which is defined in LINK variable [4] 4 An arrow is drawn using %ARROW function originating from ID=11 as 11>12 which is defined in LINK variable A careful observation of the universal set will reveal several embedded layouts that can be obtained from this set, adding to the flexibility of the flowchart. STEP 2: SUPERIMPOSE DESIRED LAYOUT ON UNIVERSAL SET In this step, the desired layout is superimposed on the universal set and extraneous elements and links are hidden. Graphically when the test case (Figure 1) is superimposed on the universal set, the outcome is displayed in Figure 5. 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 11 13 14 12>22 21 22 23 24 22>32 31 32 33 34 32>41 32>43 41 42 43 44 Figure 5: Superimposition 4

The universal set serves as a framework with multiple embedded schemes or layouts that can facilitate any type of layout as long as it s defined in the set. The universal set can further be customized to accommodate complex structures. In the process when Figure 1 is superimposed on the universal set we obtained our desired layout and extraneous objects (elements/links) were hidden from display as seen in Figure 5: Superimposition. It is important to note the ID s of the elements and links after the superimposition. It can be summarized in Table 3 as below: Tier ID Links ID 1 12 12>22 2 22 22>32 3 32 32>41 & 32>43 4 41 & 43 Table 3: Elements and Links ID After Superimposition The Elements and Links ID from Table 3 are then passed as input to the flowchart macro call. When there is a match between the IDs from the above table with the IDs from the universal set (Display 1) those objects are kept and the rest are hidden by changing the style attribute color to white. This style attribute trick is the most convenient way to hide extraneous objects. The macro call for this scenario can be developed as below. With every layout the macro call will need to be modified to fit its unique requirements. %flowchart(dsn = example, 1 floor= 12>var1 12>22 # 22>var2 22>32 # 32>var3 32>41 32>43 # 41>var4 # 43>var5); 2 3 4 5 6 Here, [1] 1 dsn = Input dataset (example) containing variables with text to display in the flowchart. * is the split character used to span text into multiple lines 2 Tier 1: Element ID 12 is combined with var1 to show the text IC Signed (N=100) so it s represented as 12>var1. A blank space is used as a delimiter between 12>var1 and an outward link 12>22 connecting 12 to 22. [3] 3 Tier 2: Element ID 22 is combined with var2 to show the corresponding text so it s represented as 22>var2. A blank space is used as a delimiter between 22>var2 and an outward link 22>32 connecting 22 to 32. [4] 4 Tier 3: Element ID 32 is combined with var3 to show the corresponding text so it s represented as 32>var3. A blank space is used as a delimiter between 32>var3 and outward links 32>41 and 32>43 connecting to ID 41 and 43 respectively. ] 5 Tier 4: Element ID 41 is combined with var4 to show the corresponding text so it s represented as 41>var4. It does not have any outward link associated with it. [6] 6 Tier 4: Element ID 43 is combined with var5 to show the corresponding text so it s represented as 43>var5. It does not have any outward link associated with it. # is the delimiter between each of the definitions in [2] through [6]. Please refer to the APPENDIX for complete flowchart macro used to program Figure 1. 5

CONCLUSION The methodology described here can avoid programming every potential scenario of the flowchart thus saving time and effort. The two step process described above of creating a universal set and superimposing desired layout onto this universal set is very straightforward and allows a good measure of flexibility to the users. Further enhancement can be made to tackle even complex layouts and varying the size of the annotated objects (bars/arrows etc) as needed. REFERENCES [1] Carpenter, Arthur (2006) Data Driven Annotations: An Introduction to SAS/GRAPH s Annotate Facility SUGI 31 [2] Saradha, Priya & Veeravel, Gurubaran (2008) Creating Flowcharts Using the Annotate Facility SAS Global Forum 2008 ACKNOWLEDGMENTS I would like to thank Michelle Pallas (PaxVax, Inc.) and Trudi White (PaxVax, Inc.) for the review and feedback of the paper. CONTACT INFORMATION Your comments and questions are valued and encouraged. Contact the author at: Name: Abhinav Srivastva Enterprise: PaxVax, Inc. E-mail: asrivastva@paxvax.com SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. indicates USA registration. Other brand and product names are trademarks of their respective companies. 6

APPENDIX /*==========================================================================* * MACRO USAGE: * DSN = Input dataset * FLOOR = List each element and its links separated by '#' delimiter *==========================================================================*/ /* Input Dataset */ data example; length txt $100; var='var1'; txt='ic Signed*(N=100)' ; output; var='var2'; txt='rand. Set*(N=90)' ; output; var='var3'; txt='fas Set*(N=90)' ; output; var='var4'; txt='completed*(n=80)' ; output; var='var5'; txt='terminated*(n=10)' ; output; /* Invoke annotation macros */ %annomac; %macro flowchart(dsn=, floor= ); /* Process the parameters passed in 'floor= ' argument */ %let counter=1; %do %while (%scan(&floor,&counter.,%str(#)) ne %str( )); %let zz = %scan(&floor.,&counter.,%str(#)); %let element = 1; * identify elements ; %let n = 1; * identify links ; %do %while (%scan(&zz.,&n.,%str( )) ne %str( )); %let ELMT = %scan(&zz.,&element.,%str( )); * element ; %let LINK = %scan(&zz.,%eval(&n.+1),%str( )); * link ; data _null_; call execute('data test;'); call execute('length ELEMENT LINK $10 ;'); call execute('element=' "'" "&ELMT." "'" ';'); call execute('link=' "'" "&LINK." "'" ';'); call execute(''); call execute('proc append base=all data=test; '); % %let n = %eval(&n.+1); % %let counter = %eval(&counter.+1); data all2 (drop = element); set all; ID=scan(ELEMENT,1,'>'); if ELEMENT ne ' ' and LINK eq ' ' then do; VAR=scan(ELEMENT,2,'>'); LINK='00'; /* Merge with input dataset */ proc sql noprint; create table all_dsn as select a.*, b.txt 7

; quit; from all2 a left join &dsn. b on a.var=b.var order by ID, LINK /*------------------------------------------------------------------------------*/ /*----------------- STEP 1: Create Universal Flowchart Template ----------------*/ /*------------------------------------------------------------------------------*/ * Standard Bar dimensions ; %let b_x1= 0; %let b_x2= 20; %let b_y1= 95; %let b_y2= 80; /* Annotation dataset */ data anno; length style id link $10; %do j=1 %to 4; * 4 tiers or floors ; %do i=1 %to 3; * 3 elements per tier ; ID="&j.&i."; LINK='00'; when='a'; * Bars will be drawn at the end of annotation ; %system(3,3); * absolute scale will be used for drawing bars ; %bar(&b_x1.,&b_y1.,&b_x2.,&b_y2.,black,0,e); when='b'; * other annotation pieces will be drawn before bars; LINK="&j.&i.>%eval(&j.+1)&i."; %system(9,9); * relative scale will be used for drawing arrows ; %arrow(-10,0,0,-10,black,1,1,90,filled); if &i. ^= 1 then do; else do; LINK="&j.&i.>%eval(&j.+1)%eval(&i.-1)"; %system(9,9); %arrow(0,+10,-27,-10,black,1,1,90,filled); LINK="&j.&i.>&j.%eval(&i.-1)"; %system(9,9); %arrow(+17,+18,-10,0,black,1,1,90,filled); LINK="&j.&i.>%eval(&j.+1)%eval(&i.+1)"; %system(9,9); %arrow(+20,-8,+27,-10,black,1,1,90,filled); LINK="&j.&i.>%eval(&j.+1)%eval(&i.+1)"; %system(9,9); %arrow(0,+10,+27,-10,black,1,1,90,filled); LINK="&j.&i.>&j.%eval(&i.+1)"; %system(9,9); 8

%arrow(-17,+17,+10,0,black,1,1,90,filled); /* Text annotation */ LINK='00'; TROW='1'; %cntl2txt; %LABEL(-20,+2,' ', black, 0, 0, 1, 'Arial', 5); * Will be used to display text line #1 ; TROW='2'; %system(3,9); %LABEL(%eval(&b_x1.+10),-2,' ', black, 0, 0, 1, 'Arial', 5); * Will be used to display text line #2 ; %txt2cntl; TROW = ' '; %let b_x1 = %eval(&b_x1. + 30); %let b_x2 = %eval(&b_x2. + 30); % %let b_x1= 0; %let b_x2= 20; %let b_y1 = %eval(&b_y1-25); %let b_y2 = %eval(&b_y2-25); % /* Hide unnecessary links (if any) obtained from above do-loop processing */ data anno; set anno; if findc(link,'5')>0 then color='white'; * Hide 5th tier as its not needed here ; if substr(link,lengthn(link))='4' then color='white'; * Hide 4th element in each tier ; /*------------------------------------------------------------------------------*/ /*-- STEP 2: Perform Match with Universal Flowchart Template Created in Step 1 -*/ /*------------------------------------------------------------------------------*/ data final_anno (drop=txt); length ID LINK var $10 txt text $100; if _n_=1 then do; declare hash h(dataset:"all_dsn"); h.definekey("id", "LINK"); h.definedata("txt","var"); call missing(txt,var); h.definedone(); set anno (drop=text); if h.find()>0 then do; * Hide extra element/links in the Universal template ; color='white'; if txt ne ' ' then do; if TROW='1' then TEXT=scan(txt,1,'*'); * '*' is the delimiter between lines of text ; if TROW='2' then TEXT=scan(txt,2,'*'); 9

/* Output to ODS RTF destination */ ods rtf file=".\flowchart.rtf"; proc ganno anno=final_anno ; run ; quit ; ods rtf close; %m /* Macro call */ %flowchart(dsn = example, floor= 12>var1 12>22 # 22>var2 22>32 # 32>var3 32>41 32>43 # 41>var4 # 43>var5); 10