Matt Downs and Heidi Christ-Schmidt Statistics Collaborative, Inc., Washington, D.C.

Similar documents
One Project, Two Teams: The Unblind Leading the Blind

PharmaSUG Paper PO12

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

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

SAS Macro Dynamics - From Simple Basics to Powerful Invocations Rick Andrews, Office of the Actuary, CMS, Baltimore, MD

PhUSE US Connect 2018 Paper CT06 A Macro Tool to Find and/or Split Variable Text String Greater Than 200 Characters for Regulatory Submission Datasets

LST in Comparison Sanket Kale, Parexel International Inc., Durham, NC Sajin Johnny, Parexel International Inc., Durham, NC

SAS Macro Dynamics: from Simple Basics to Powerful Invocations Rick Andrews, Office of Research, Development, and Information, Baltimore, MD

How to write ADaM specifications like a ninja.

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

Omitting Records with Invalid Default Values

Automated Checking Of Multiple Files Kathyayini Tappeta, Percept Pharma Services, Bridgewater, NJ

SAS 101. Based on Learning SAS by Example: A Programmer s Guide Chapter 21, 22, & 23. By Tasha Chapman, Oregon Health Authority

THE OUTPUT NONMEM DATASET - WITH ADDL RECORDS

A Macro to Create Program Inventory for Analysis Data Reviewer s Guide Xianhua (Allen) Zeng, PAREXEL International, Shanghai, China

Pharmaceuticals, Health Care, and Life Sciences

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

Use That SAP to Write Your Code Sandra Minjoe, Genentech, Inc., South San Francisco, CA

The Output Bundle: A Solution for a Fully Documented Program Run

Automate Clinical Trial Data Issue Checking and Tracking

David S. Septoff Fidia Pharmaceutical Corporation

Tracking Dataset Dependencies in Clinical Trials Reporting

Utilizing SAS for Cross- Report Verification in a Clinical Trials Setting

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

How to Incorporate Old SAS Data into a New DATA Step, or What is S-M-U?

ABSTRACT DATA CLARIFCIATION FORM TRACKING ORACLE TABLE INTRODUCTION REVIEW QUALITY CHECKS

Paper DB2 table. For a simple read of a table, SQL and DATA step operate with similar efficiency.

So Much Data, So Little Time: Splitting Datasets For More Efficient Run Times and Meeting FDA Submission Guidelines

Taming a Spreadsheet Importation Monster

Statistics, Data Analysis & Econometrics

ET01. LIBNAME libref <engine-name> <physical-file-name> <libname-options>; <SAS Code> LIBNAME libref CLEAR;

A Practical Introduction to SAS Data Integration Studio

Reading in Data Directly from Microsoft Word Questionnaire Forms

Standard Operating Procedure Clinical Data Management

TLFs: Replaying Rather than Appending William Coar, Axio Research, Seattle, WA

Storing and Reusing Macros

Paper CC16. William E Benjamin Jr, Owl Computer Consultancy LLC, Phoenix, AZ

Top Coding Tips. Neil Merchant Technical Specialist - SAS

A Useful Macro for Converting SAS Data sets into SAS Transport Files in Electronic Submissions

PharmaSUG Paper AD06

PharmaSUG Paper SP04

WHAT ARE SASHELP VIEWS?

USING HASH TABLES FOR AE SEARCH STRATEGIES Vinodita Bongarala, Liz Thomas Seattle Genetics, Inc., Bothell, WA

PharmaSUG Paper TT11

Let SAS Help You Easily Find and Access Your Folders and Files

Indenting with Style

Organizing Deliverables for Clinical Trials The Concept of Analyses and its Implementation in EXACT

A Few Quick and Efficient Ways to Compare Data

SAS Drug Development Program Portability

Useful Tips When Deploying SAS Code in a Production Environment

Using UNIX Shell Scripting to Enhance Your SAS Programming Experience

The FORMAT procedure - more than just a VALUE statement Lawrence Heaton-Wright, Quintiles, Bracknell, UK

Using an ICPSR set-up file to create a SAS dataset

Missing Pages Report. David Gray, PPD, Austin, TX Zhuo Chen, PPD, Austin, TX

A Macro for Generating the Adverse Events Summary for ClinicalTrials.gov

Pooling Clinical Data: Key points and Pitfalls. October 16, 2012 Phuse 2012 conference, Budapest Florence Buchheit

Using a Control Dataset to Manage Production Compiled Macro Library Curtis E. Reid, Bureau of Labor Statistics, Washington, DC

New Macro Features Added in SAS 9.3 and SAS 9.4

Clinical Data Visualization using TIBCO Spotfire and SAS

Electricity Forecasting Full Circle

CFB: A Programming Pattern for Creating Change from Baseline Datasets Lei Zhang, Celgene Corporation, Summit, NJ

Tales from the Help Desk 6: Solutions to Common SAS Tasks

PharmaSUG Paper AD15

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

Paper A Simplified and Efficient Way to Map Variable Attributes of a Clinical Data Warehouse

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

Your Own SAS Macros Are as Powerful as You Are Ingenious

MedDRA Dictionary: Reporting Version Updates Using SAS and Excel

Implementing external file processing with no record delimiter via a metadata-driven approach

How to Keep Multiple Formats in One Variable after Transpose Mindy Wang

PharmaSUG Paper CC11

Main challenges for a SAS programmer stepping in SAS developer s shoes

Best Practice for Creation and Maintenance of a SAS Infrastructure

Better Metadata Through SAS II: %SYSFUNC, PROC DATASETS, and Dictionary Tables

EXAMPLE 2: INTRODUCTION TO SAS AND SOME NOTES ON HOUSEKEEPING PART II - MATCHING DATA FROM RESPONDENTS AT 2 WAVES INTO WIDE FORMAT

EXAMPLE 3: MATCHING DATA FROM RESPONDENTS AT 2 OR MORE WAVES (LONG FORMAT)

A Tool to Compare Different Data Transfers Jun Wang, FMD K&L, Inc., Nanjing, China

Planning to Pool SDTM by Creating and Maintaining a Sponsor-Specific Controlled Terminology Database

PhUSE Giuseppe Di Monaco, UCB BioSciences GmbH, Monheim, Germany

An Efficient Tool for Clinical Data Check

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

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

Using SAS Files CHAPTER 3

An Introduction to Visit Window Challenges and Solutions

Text Generational Data Sets (Text GDS)

Using SAS Macros to Extract P-values from PROC FREQ

3N Validation to Validate PROC COMPARE Output

An Introduction to SAS/SHARE, By Example

SAS System Powers Web Measurement Solution at U S WEST

ABSTRACT INTRODUCTION WHERE TO START? 1. DATA CHECK FOR CONSISTENCIES

SAS/Warehouse Administrator Usage and Enhancements Terry Lewis, SAS Institute Inc., Cary, NC

Standardising The Standards The Benefits of Consistency

A SAS Macro for Producing Benchmarks for Interpreting School Effect Sizes

Developing Data-Driven SAS Programs Using Proc Contents

A Practical and Efficient Approach in Generating AE (Adverse Events) Tables within a Clinical Study Environment

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

Programming checks: Reviewing the overall quality of the deliverables without parallel programming

PharmaSUG 2014 PO16. Category CDASH SDTM ADaM. Submission in standardized tabular form. Structure Flexible Rigid Flexible * No Yes Yes

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

The Power of PROC SQL Techniques and SAS Dictionary Tables in Handling Data

Transcription:

Paper 82-25 Dynamic data set selection and project management using SAS 6.12 and the Windows NT 4.0 file system Matt Downs and Heidi Christ-Schmidt Statistics Collaborative, Inc., Washington, D.C. ABSTRACT A common task of statistical coordinating centers is the production of interim reports to a Data and Safety Monitoring Board (DSMB) in order to present the status of an ongoing clinical trial. Frequently, the data summarized in these reports arise from multiple sources and come at varying schedules. Managing the receipt of data for complex trials can require a large organizational effort on the part of the coordinating center to ensure that each report uses the most current data. In this paper we present a system of dynamic data set selection and project management that uses SAS 6.12 and Windows NT 4.0 file system. In this system, programs used in the production of DSMB reports include at their beginnings a central utility program. This program automatically assigns LIBNAMEs to the most recent source data and provides a macro that checks whether we have updated analysis files with the most recent source data, thereby alleviating us of the tedious task of manually updating every analysis program. Although the code is somewhat complicated, SAS users at any level can use this program. A SOLUTION TO ENSURE THAT DATA PROGRAMS USE THE LATEST SOURCE DATA Often the analysis programs for DSMB reports do not directly use the raw data received from the various sources. Instead data programs written in SAS create and recode variables and restructure the data into analysis files, which are more suitable for analysis in SAS (Figure 1). Like the raw data, however, the study may have many analysis files, particularly if the study designers have cast a wide net in the scope of data the study collects. Figure 1. Path for creating analysis datasets THE PROBLEM During the course of many randomized clinical trials, the independent statistical coordinating center frequently is called upon to review data quality and provide unblinded analyses of study data to a Data and Safety Monitoring Board (DSMB) chartered to review the safety and efficacy of the study agent. Often, the DSMB reviews frequent small reports that present updated accrual and abbreviated safety data supplemented at periodic intervals during the study by more extensive reports of safety that may also include analyses of efficacy, data integrity, or treatment compliance. Throughout the trial data often come from different sources; for example, the trial s data management center may periodically send updated case report form (CRF) data that it has entered into the clinical database. Because of regulatory requirements, the sponsor may maintain a serious adverse event (SAE) database that is more current at any point during the trial than the SAE data stored in the CRF database. Furthermore, if the trial uses an adaptive randomization method to allocate patients, a randomization center may send an updated data set containing patient identifiers of randomized patients and their treatment assignments. Other potential players who may transmit data directly to the statistical coordinating center during a study include central laboratories that analyze safety parameters or plasma levels of the study agent as well as central reading centers or endpoint review committees that interpret subjective efficacy data. Because so many different parties can be responsible for portions of the study data and because of the often short turn-around between data receipt and report production, the statistical coordinating center has to take great pains to tame the many-headed hydra of data management and ensure that its project team always uses the most current data in generating reports to the DSMB. If each data program used for DSMB reports were to include LIBNAME statements that direct the program to the latest source data, the LIBNAME statements would require manual updates with each receipt of new data, a cumbersome task certainly easy to overlook in the rush of new report production. To avoid this, we have created a system in the management of our projects where each data program invokes at its beginning a central utility program. Aside from housing general-use macros for the project s programs and defining global study-specific macro variables, the utility program searches our received data directories for the most recent transfer of each data type and then dynamically assigns LIBNAMEs for use in the creation of updated analysis files. To allow SAS this functionality in its hunt using the Windows NT 4.0 file system (NTFS), we must adhere to conventions in our organization of received data for projects. Figure 2 shows a prototype project directory on our file server. Notice that the E:\PROJECT\DATA\RECEIVED directory contains subdirectories for each data type we will receive during the course of the study. Within each data type subdirectory, we have created dated subdirectories named by the cut-off dates for the data transfers using a YYYY_MM_DD convention. For example, if we receive an updated randomization file from the randomization center, who informs us that the patient identifiers and treatment assignments it has provided are current as of January 21, 2000, we would copy the received data set to the directory E:\PROJECT\DATA\RECEIVED\RANDOMIZATION\2000_01_21.

Figure 2. Sample project folder on the network presumed that we will not receive data sets for the study after 2003.; CRFDATE = mdy(scan(filename, 2, "_"), scan(filename, 3, "_"), scan(filename, 1, "_")); * Convert the directory name to a SAS date; if CRFDATE <=.Z %beep(5, FRSTDUR = 80, SECDUR = 80); * Macro defined earlier in central utility program. Just gives audible warning to user that there is a problem.; put / "ERROR: CRF directory has incorrectly named subdirectory: " FILENAME +(-1) "." /; proc sort data = LISTCRF; by CRFDATE; * Sort data set so latest data set directory appears last; * Place directory name of latest CRF data set to the macro variable CRFDIR.; * Convert the directory name to the data cut-off date and place in the macro variable CRFCUT.; Provided that we strictly adhere to this convention in our placement on the network of received data sets for the project, the utility program is able to extract the contents of each data type subdirectory to a SAS data set, convert the nested subdirectory names to data cut-off SAS dates, and, after sorting the dates, choose the latest data cut-off date for assignment in a LIBNAME statement. As shown in Figure 3, the link between the Windows NT directory command and the SAS data set is accomplished by creating an unnamed pipe with a dir call to the operating system. Figure 3. Code to extract the subdirectory that contains the latest CRF data sets filename CRFDATA pipe "dir e:\project\data\received\crfdata"; data LISTCRF; * Output directory of CRF data transfers to a data set; infile CRFDATA missover; length DATE TIME SIZE FILENAME $20; input DATE TIME SIZE FILENAME; if SIZE = "<DIR>" and /* Must be a directory and not a file */ length(compress(filename)) = 10 and /* Directory name must be 10 characters */ (1999<=input(scan(FILENAME, 1, "_"),?? 4.0)<=2003); * Must be a directory that follows our naming convention. That is, the first four digits of the directory represent the last year for which the file contains data. We have set LISTCRF end = LASTREC; call symput ("CRFDIR", compress(filename)); call symput ("CRFCUT", put(crfdate, mmddyy10.)); put // "NOTE: The latest CRF data was received from the data management center on " CRFDATE :weekdate30. +(-1) "." //; libname CRFDATA "e:\project\data\received\crfdata\&crfdir"; * Directory for most recent CRF data sets received from the data management center; Assuming, for example, that the directory tree for our project looks as it does in Figure 2, after running the code in Figure 3, the CRFDATA libname will be assigned to E:\project\data\received\CRFDATA\2000_01_15. As we place new CRF data on our server, executing the code will automatically reassign the libname to the latest dated directory containing the new data. Note that the order of the input variables in the LISTCRF data step in Figure 3 is specific to the NTFS. When using this code on Windows 95/98 machines, we have found that the order of information output by the dir command differs from NT's, requiring us to reorder the input variables on these systems.

A SOLUTION TO ENSURE THAT DATA PROGRAMS HAVE, IN FACT, BEEN RUN Although helpful, the code presented in Figure 3 is insufficient to guarantee that reports to the DSMB use the latest data. While ensuring that the data programs use the latest data when they are run, the code does nothing to safeguard that the project team has, in fact, run the data programs to create new analysis files. To achieve this, we include in the utility program for a project the declaration for DPNDCHEK, a macro that our programmers invoke whenever a data or analysis program first uses an analysis file we have created. DPNDCHEK checks the creation date of an analysis file and confirms that it is not before the date we placed the source data sets used as inputs for the analysis file onto our server. The macro relies on a project data set, called DPNDCHEK.sd2, that lists the dependencies between the analysis files that we create and the source data. DPNDCHEK.sd2 is structured with one record per source data set for each analysis file and contains the three variables: SRCELIB, which specifies the library for the source data set (For example, if the source data is from a CRF data set, then we set SRCELIB to CRFDATA. Likewise, if the source data is from a previously created analysis file, we set SRCELIB to ANALYSIS ), SRCEDATA, which specifies the name of the source data set, and DPNDDATA, which names the analysis file that is dependent upon the source data set specified by SRCELIB and SRCEDATA. As an example, if the data program that creates the analysis file MORTALTY relies upon the CRF data set DEATH and the previously created analysis files named TXEXPOSE and SAE, DPNDCHEK.sd2 will contain the first three records as shown in Figure 4. The figure shows that the analysis file SAE also uses the analysis file TXEXPOSE as an input dataset, which, in turn, uses the DRUGADM CRF dataset. Figure 4. PROC PRINT of DPNDCHEK.sd2 that shows the source data sets for the analysis files MORTALTY.sd2, SAE.sd2, and TXEXPOSE.sd2 dependent Library (i.e. analysis) for source Source data set data set data set OBS (DPNDDATA) (SRCELIB) (SRCEDATA) 1 MORTALTY CRFDATA DEATH 2 MORTALTY ANALYSIS TXEXPOSE 3 MORTALTY ANALYSIS SAE 4 SAE ANALYSIS TXEXPOSE 5 TXEXPOSE CRFDATA DRUGADM When invoking the macro in their programs, programmers must specify the name of the analysis file for which they wish to check the dependencies. For each source data set where the variable DPNDDATA matches the name of the analysis file specified in the macro call, the macro then either: 1) performs a call to the operating system, if we receive the source data externally, to confirm that the NTFS creation date of the source data set's directory is no later than the creation date of the dependent analysis file, or, 2) if the source data set is another analysis file created internally, checks through PROC DATASETS that the creation date of the source analysis file is on or before the creation date of the dependent analysis file. We check the creation date of our server directories that contain external source datasets, rather than checking the creation dates of the files themselves, because we want to extract the date and time the files were placed on our server and not when the outside source created the data set. Furthermore, if sources of an analysis file are themselves analysis files, the macro also checks that the source analysis files are up-to-date by calling itself, thereby ensuring that the project team has created analysis files in the proper order accounting for any dependencies between the data sets. If any source data set is newer than the analysis file, the macro returns an error message to the log, informing programmers that they must rerun the data program that creates the analysis file. Figure 5 shows the general structure of the DPNDCHEK macro. Note that sections denoted by CODE REMOVED were omitted from the presentation to conserve space. Also be aware that the formats of dates and times in directory calls are user-dependent, configured through NT s Regional Settings control panel. This code assumes that times are in 24-hour format and that dates are in mm/dd/yy format. Figure 5. The DPNDCHEK macro *****> The DPNDCHEK macro should be invoked whenever data and analysis programs use an analysis file that we have created. Using the SAS data set DPNDCHEK.sd2, which contains for each created data set a list of the dependent data sets, the macro checks the creation date and time of the analysis file and confirms that it is after the date and time of each dependent source data set. If the source files are themselves analysis files that we create, the macro then calls itself for each source analysis file to ensure that they need not be rerun.; %macro DPNDCHEK(ANALDATA, /* Analysis file to be checked */ FRSTCALL = 1 /* Switch that tell macro whether it has been invoked from another DPNDCHEK call */ %* Get a data set that lists the data dependencies for each analysis data set. Count the number of dependencies and output the count to macro variable NUMCHEKS.; data SOURCES; retain DEPENDNT 0; %* Count the number of dependencies for analysis file; length SRCEPATH $200; set DPNDCHEK end = LASTREC; SRCEPATH = pathname(srcelib); %* Convert librefs to pathnames; if SRCEPATH = "" %* Libname was undefined; %beep(5); put "WARNING: " SRCELIB "libname is undeclared." / "Check LIBNAMES and DPNDCHEK.sd2 for errors." //;

if compress(dpnddata) = compress(upcase ("&ANALDATA")) and SRCEPATH ^="" then DEPENDNT + 1; call symput ("NUMCHEKS", put(dependnt, 2.0)); %* Output number of dependencies to macro variable NUMCHEKS; if DEPENDNT = 0 %BEEP(20); put "ERROR: Data set does not exist in the list of data dependencies (DPNDCHEK.sd2)" / "Check spelling of data set in macro call or update DPNDCHEK.sd2."; SLEEP = sleep(5); %* Pause for 5 seconds to allow programmer time to note error.; if compress(dpnddata) = compress(upcase("&analdata")) and SRCEPATH ^="" DEPENDNT + (not(lastrec)); output; drop SLEEP; %if &NUMCHEKS > 0 %then %do; /* Only continue with the macro if at least one source dataset is defined in DPNDCHEK dataset */ /* for the dataset being checked.*/ %* Get the creation date of the dependent dataset and assign it to the macro variable DPNDDATE; proc datasets library = ANALYSIS nodetails nolist; contents data = &ANALDATA out = WORK.MODATE noprint; %* MODATE contains the modified date extracted from the PROC CONTENTS as a variable also called MODATE. It is a DATETIME value.; quit; set MODATE (keep = MODATE) end = LASTOBS; if LASTOBS %* Cycle through the source data sets for the analysis file and compare their creation dates with the modification dates for the analysis file; %do INDEX = 1 %to &NUMCHEKS; set SOURCES (where = (DEPENDNT = &INDEX)); call symput ("SRCELIB", compress(srcelib)); call symput ("SRCEDATA", compress(srcedata)); %* CODE REMOVED. We removed code here because we have presented similar code elsewhere in the paper. If the data source is externally created, the macro performs a NTFS call using an unnamed pipe, similar to that in Figure 3, to extract the creation date and time of the directory that contains the source data. The macro then used the DHMS function to create the datetime value MODATE in the dataset SRCEDATA with one record for the source dataset. Likewise, if the source dataset is created internally (i.e., it also is an analysis file created in-house), the macro performs a PROC DATASETS to extract MODATE to the dataset SRCEDATA.; set SRCEDATA end = LASTREC; if.z < MODATE < &DPNDDATE then put "NOTE: &SRCELIB..&SRCEDATA created before ANALYSIS.&ANALDATA on " MODATE :DATETIME40.; else if MODATE >= &DPNDDATE %beep(15); put "ERROR: ANALYSIS.&ANALDATA needs to be rerun." / "&SRCELIB..&SRCEDATA created on " MODATE :DATETIME40.; SLEEP = sleep(5); %* Pause for 5 seconds to allow programmer adequate time to see error.; %* CODE REMOVED. Proc datasets to delete temporary datasets.; % put / "NOTE: ANALYSIS.&ANALDATA was last modified on " MODATE :datetime40. //; call symput("dpnddate", compress(modate)); %* Finally, the macro needs to call itself for source data sets that are not primary, that is, for source data sets that are themselves analysis files. Only execute this code for the first invocation of DPNDCHEK (FRSTCALL = 1);

%if &FRSTCALL = 1 %then %do; %let ANALDATA = "&ANALDATA"; %do %until (&MORE = 0); % data TEMP; length NEWANAL $200; retain MORE 0 NEWANAL; set DPNDCHEK end = LASTREC; if compress(dpnddata) in (&ANALDATA) and SRCELIB = "ANALYSIS" if MORE = 0 then NEWANAL = '"' compress(srcedata) '"'; else NEWANAL = trim(newanal) ', "' compress(srcedata) '"'; output; MORE + 1; call symput ("MORE", compress(put(more, 3.0))); call symput ("ANALDATA", trim(newanal)); keep SRCEDATA; rename SRCEDATA = ANALDATA; proc append out = AUTOCALL data = TEMP force; proc sort data = AUTOCALL nodupkey; by ANALDATA; set AUTOCALL end = LASTREC; % % %mend DPNDCHEK; then call symput ("NEWANAL", compress(analdata)); %DPNDCHEK(&NEWANAL, FRSTCALL = 0); % %* CODE REMOVED: PROC DATASETS to delete AUTOCALL; As an example, consider that DPNDCHEK.sd2 has the structure shown in Figure 4. If we invoke the DPNDCHEK macro on the MORTALTY analysis dataset, the macro will check that before running the MORTALTY data program that we had 1) placed the CRF dataset DEATH on the server and 2) run the data programs that create the SAE and TXEXPOSE analysis files. In addition, to ensure that we had run TXEXPOSE and, by extension, SAE using the latest CRF data and, further, that we had run the SAE and TXEXPOSE data programs in the correct order, the DPNDCHEK macro would call itself for both analysis files. TRADEMARKS SAS 6.12 is a registered trademark of the SAS institute, Inc., in the USA. indicates USA registration. Other brand and product names are registered trademarks or trademarks of their respective companies. CONTACT INFORMATION Your comments and questions are valued and encouraged. Contact the authors at: Matt Downs and Heidi Christ-Schmidt Statistics Collaborative, Inc. 1710 Rhode Island Ave., NW Suite 200 Washington, DC 20036 Work Phone: (202) 429-9267 Fax: (202) 429-9267 E-mail: matt@statcollab.com E-mail: heidi@statcollab.com Web: www.statcollab.com then call symput("autocall", compress(_n_)); %do INDEX2 = 1 %to &AUTOCALL; set AUTOCALL; if _N_ = &INDEX2