Facilitate Statistical Analysis with Automatic Collapsing of Small Size Strata

Similar documents
Want to Do a Better Job? - Select Appropriate Statistical Analysis in Healthcare Research

Data Quality Review for Missing Values and Outliers

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

Using PROC SQL to Generate Shift Tables More Efficiently

PharmaSUG Paper TT11

Checking for Duplicates Wendi L. Wright

Keeping Track of Database Changes During Database Lock

Cleaning Duplicate Observations on a Chessboard of Missing Values Mayrita Vitvitska, ClinOps, LLC, San Francisco, CA

Automating Preliminary Data Cleaning in SAS

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

Automate Clinical Trial Data Issue Checking and Tracking

One Project, Two Teams: The Unblind Leading the Blind

Statistics, Data Analysis & Econometrics

Correcting for natural time lag bias in non-participants in pre-post intervention evaluation studies

An Efficient Tool for Clinical Data Check

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

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

Using SAS Macros to Extract P-values from PROC FREQ

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

PharmaSUG Paper AD06

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

Using SAS Macro to Include Statistics Output in Clinical Trial Summary Table

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

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

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

%MAKE_IT_COUNT: An Example Macro for Dynamic Table Programming Britney Gilbert, Juniper Tree Consulting, Porter, Oklahoma

Clinical Data Visualization using TIBCO Spotfire and SAS

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

Chapter 6: Modifying and Combining Data Sets

Chaining Logic in One Data Step Libing Shi, Ginny Rego Blue Cross Blue Shield of Massachusetts, Boston, MA

Getting it Done with PROC TABULATE

A Macro that can Search and Replace String in your SAS Programs

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

Pharmaceuticals, Health Care, and Life Sciences

%MISSING: A SAS Macro to Report Missing Value Percentages for a Multi-Year Multi-File Information System

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

ABSTRACT INTRODUCTION WORK FLOW AND PROGRAM SETUP

Poster Frequencies of a Multiple Mention Question

ABSTRACT INTRODUCTION TRICK 1: CHOOSE THE BEST METHOD TO CREATE MACRO VARIABLES

Validating Analysis Data Set without Double Programming - An Alternative Way to Validate the Analysis Data Set

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

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

Using PROC PLAN for Randomization Assignments

PROC FORMAT Tips. Rosalind Gusinow 2997 Yarmouth Greenway Drive u Madison, WI (608) u

Sankey Diagram with Incomplete Data From a Medical Research Perspective

Quick and Efficient Way to Check the Transferred Data Divyaja Padamati, Eliassen Group Inc., North Carolina.

Interactive Programming Using Task in SAS Studio

Paper An Automated Reporting Macro to Create Cell Index An Enhanced Revisit. Shi-Tao Yeh, GlaxoSmithKline, King of Prussia, PA

The Proc Transpose Cookbook

3N Validation to Validate PROC COMPARE Output

2 = Disagree 3 = Neutral 4 = Agree 5 = Strongly Agree. Disagree

SD10 A SAS MACRO FOR PERFORMING BACKWARD SELECTION IN PROC SURVEYREG

Developing Data-Driven SAS Programs Using Proc Contents

A SAS Macro for Generating Informative Cumulative/Point-wise Bar Charts

Quality Control of Clinical Data Listings with Proc Compare

An Introduction to Visit Window Challenges and Solutions

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

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

Advanced Visualization using TIBCO Spotfire and SAS

Useful Tips When Deploying SAS Code in a Production Environment

Paper S Data Presentation 101: An Analyst s Perspective

ABSTRACT INTRODUCTION PROBLEM: TOO MUCH INFORMATION? math nrt scr. ID School Grade Gender Ethnicity read nrt scr

Green Eggs And SAS. Presented To The Edmonton SAS User Group October 24, 2017 By John Fleming. SAS is a registered trademark of The SAS Institute

An Efficient Method to Create Titles for Multiple Clinical Reports Using Proc Format within A Do Loop Youying Yu, PharmaNet/i3, West Chester, Ohio

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

The Submission Data File System Automating the Creation of CDISC SDTM and ADaM Datasets

STEP 1 - /*******************************/ /* Manipulate the data files */ /*******************************/ <<SAS DATA statements>>

T.I.P.S. (Techniques and Information for Programming in SAS )

186 Statistics, Data Analysis and Modeling. Proceedings of MWSUG '95

SAS Instructions Entering the data and plotting survival curves

Mapping Clinical Data to a Standard Structure: A Table Driven Approach

Using Templates Created by the SAS/STAT Procedures

A Format to Make the _TYPE_ Field of PROC MEANS Easier to Interpret Matt Pettis, Thomson West, Eagan, MN

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

Processing SAS Data Sets

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

PharmaSUG Paper SP04

Macros for Two-Sample Hypothesis Tests Jinson J. Erinjeri, D.K. Shifflet and Associates Ltd., McLean, VA

/********************************************/ /* Evaluating the PS distribution!!! */ /********************************************/

ABC Macro and Performance Chart with Benchmarks Annotation

Reproducibly Random Values William Garner, Gilead Sciences, Inc., Foster City, CA Ting Bai, Gilead Sciences, Inc., Foster City, CA

SAS Linear Model Demo. Overview

Working with Composite Endpoints: Constructing Analysis Data Pushpa Saranadasa, Merck & Co., Inc., Upper Gwynedd, PA

Maintenance of NTDB National Sample

A Side of Hash for You To Dig Into

Format-o-matic: Using Formats To Merge Data From Multiple Sources

PharmaSUG2014 Paper DS09

Give me EVERYTHING! A macro to combine the CONTENTS procedure output and formats. Lynn Mullins, PPD, Cincinnati, Ohio

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

Indenting with Style

Out of Control! A SAS Macro to Recalculate QC Statistics

Real Time Clinical Trial Oversight with SAS

ABSTRACT INTRODUCTION SIMPLE COMPOSITE VARIABLE REVIEW SESUG Paper IT-06

Not Just Merge - Complex Derivation Made Easy by Hash Object

Practical Uses of the DOW Loop Richard Read Allen, Peak Statistical Services, Evergreen, CO

Ranking Between the Lines

The Power of Combining Data with the PROC SQL

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

Cleaning up your SAS log: Note Messages

A SAS Macro for Balancing a Weighted Sample

Transcription:

PO23 Facilitate Statistical Analysis with Automatic Collapsing of Small Size Strata Sunil Gupta, Linfeng Xu, Quintiles, Inc., Thousand Oaks, CA ABSTRACT Often in clinical studies, even after great efforts are made to ensure protocol specified sample sizes in each stratum, there are still some strata with small sample sizes in final analysis stage. One major reason for smaller sample sizes in strata could be the difficulty to recruiting patients. When conducting statistical analyses by using the STRATA statement, such as LIFETEST test, there is a need to collapse strata with small sample sizes in order to meet the requirement of statistical procedure assumptions or statistical power considerations. Thus, there is often need for collapsing strata with small sample sizes (usually less than 2). Specially, the method proposed in this paper is applicable when the strata variable is used in SAS STRATA statement of selected statistical procedures or when the strata and treatment variables are used as model independent variables. The strata variable could be strata in a stratified sample design, such as disease stage. To collapse small size strata is to assign a new value to the strata variable of the observation when the cross frequency counts of this stratum by either placebo or treatment group is less than &pooln (or 2). The assigned new value could be the value as pooled or the different value of the strata variable. This paper provides three methods for automatically collapsing strata by using the author developed SAS macro. The macro generally uses the strata variable with character ordinal value. By applying the macro, one of these three following approaches can be used: collapsing to the next higher stratum, collapsing to the next lower stratum, or collapsing all small sample size strata into one newly defined stratum. Then statistical procedures, such as LIFETEST, can be performed to get valid statistical results. In addition, vital sensitivity analysis can be preformed. This paper will discuss the strategies of collapsing data, the conceptual design of the macro, and the detailed SAS code for collapsing data strata to be used in statistical procedures. BACKGROUD One of the most common reasons for small sample sizes in strata is the difficulty to recruit protocol eligible patients. Another reason is that patients may withdraw early from the study. Once the data is locked, you have to conduct valid statistical analysis even if there are strata with small sample sizes. Some software have options to handle small sample sizes by automatically collapsing them. Since SAS procedures, however, still do not have this option, you will need to manually collapse them first. STRATEGIES FOR COLLAPSING DATA There are several methods for collapsing strata with small sample sizes. First approach is to combine the small stratum to its similar group based upon clinical knowledge. Since the strata value definition usually has some meaning, collapsing the small stratum to its adjacent stratum is often a common approach. Some statistical software have this kind of options in some statistical procedures. In addition, collapsing all the small size strata into one group (new) is also an alternative, if the data suggest that those small strata have common characteristics. Sensitivity analyses usually are performed to explore the impacts of different collapsing approaches although you have to adhere to the collapsing method that you defined in statistical analysis plan (SAP). Otherwise, the method can be picked up from the sensitivity analysis. CONCEPTUAL DESIGN OF %COMBSTRATA MACRO The macro to combine strata ideally should have the following function features. 1) User assigns the input data set, the analysis variable of an input data set, the treatment group variable, and the stratum variable. 2) User assigns a collapsing number, which is the smallest number that user wants to collapse or poll data into next stratum. The default value is 2 (This is recommend default number in the paper by Barbara Lepidus Carlson). 1

3) Provide three ways to collapse data - collapsing to the next higher stratum, collapsing to the next lower stratum, or collapsing all small sample size strata into one newly created stratum. The &TYPE parameter can be used to fulfill this task. 4) User has the ability to exclude the cases with missing value of treatment variable, and to exclude the cases with missing value of strata variable. 5) User has the ability to apply data set extraction condition by providing &COND macro parameter. This paper discussed %combstrat macro needs to have the following requirements based on team programming standards: 1) Assigned treatment group variable to &TXGROUP must be numeric variable with value of 0 for placebo and 1 for treatment. 2) Assigned strata variable to &STRTA must be character variable. 3) Excluded the cases with missing value for analysis variable. PROGRAM PROCESS FLOW The following is the program process flow. 1) User can define the name of input data set as macro parameter. The macro will eliminate the cases with missing value for analysis variable. Then, the macro will base upon the parameter value of &EXCLUDE_MISTRT and &EXCLUDE_MISSTRATA to decide whether or not to exclude the cases with missing value of treatment variable and missing value of strata variable. 2) Before conducting collapsing, a procedure of cross frequency is performed in order to check the frequency counts for each original value of strata variable by treatment group in order to compare with final pooled results to check if collapsing was done correctly. 3) The next step is to decide the type of collapsing that user wants to conduct. The macro parameter &TYPE has to be assigned. If &TYPE=ALL, then, macro will collapse all strata with less than parameter &POOLN (default is 2) into pooled group. If TYPE=NEXT_HIGH, then macro will combine the stratum with less than parameter &POOLN into next stratum with higher stratum value visa versa, when &TYPE=NEXT_LOW, the macro will collapse small sample size stratum to next stratum with lower stratum value. 4) Under &TYPE=ALL loop, the general idea is to identify those strata with either placebo or treatment group with a stratum by treatment counts less than &POOLN, then assign them to a new stratum value as pooled and leave other strata values as they were. The detailed steps in processes are as follows. First, sort the input data by strata variable in order to use it as merging variable later. Then, run a cross frequency procedure to get strata by treatment group counts and save the output as a data set. Next, sort this data set by strata variable in order to prepare the transposing. Then, transpose this data set to let each stratum has two variables with the total counts of treatment and placebo group in each record. Based upon transposed data, if a stratum has the counts in either treatment or placebo group less than &POOLN number, you will set collapsing flag=1 to this stratum. Then, you will assign the stratum variable under collapsing flag=1 with pooled value to a new strata variable and assign original strata values to new strata variable too if the stratum is not flagged (flag=0). In next step, you will merge back the new strata variable to the input data set and drop the original strata variable and rename new strata variable back to original strata variable. The collapsing process is completed. Finally, you run a cross frequency to check if collapsing was done correctly. The end data set is saved as user defined &OUTNAME and all the intermediate data sets were deleted. 5) Under either &TYPE=NEXT_HIGH or &TYPE=NEXT_LOW situation, the similar ideas were used. You have to identify strata with total counts less than &POOLN. Then, created flag=1 for those strata. Based upon flag=1 and you will pick up the previous stratum value of the same treatment group to assign it to a new strata variable and assign original strata value to new strata variable if flog=0. Based upon this new strata variable and original strata variable, you will build a format. The start and end value of the format is the value of original strata variable and the label value of the format is the value from new strata variable. Once you built the format, you will apply this format back to original strata variable in original input data set in order to create pooled new strata variable with updated strata value. You will use this new strata variable in final output data set. 2

DETAIL CODE A little bit complexity is added when there is the situation with two or more than two consecutive strata with total counts less than &POOLN. In this case, you may conduct the similar collapsing process more than once. You will build a %do %while loop and use the macro variable &MY_TOT which is gotten from the minimum stratum counts after concurrent collapsing. The same process needs to be done more than once when &MY_TOT is less than 2. In addition, if the total counts of the stratum with the edge value are less than &POOLN and you can not collapse it to next extreme value since there is no such value, then, you will pool it to next stratum value of opposite direction. For example, you select TYPE=NEXT_HIGH, you have the strata variable with values as 1, 2, 3, and 4. If you find that the counts in strata variable with value 4 is less than &POOLN (2), then you are supposed to collapse to value 5. However, there is no value 5. Therefore, by using the rule of similarity, you have to collapse this stratum to stratum with value 3. Another macro variable &LASTOT (to save the edge value) is created to handle this situation. When &MY_TOT is less then &POOLN and &MY_TOT=&LASTOT, then you will design the reverse collapsing process. Otherwise, you will go through another similar collapsing process until the minimum stratum counts are greater or equal to &POOLN. %macro combstrata( type=, /*required: all: to pull all strata with sizes smaller than pooln to one group. next_high: to pull the stratum with size smaller than pooln to next high stratum value group. next_low: to pull the stratum with size smaller than pooln to next low stratum value group*/ indata=, /*required: indata as input data set name*/ outname=, /*required: the final output data set name*/ cond=, /*optional: data extraction condition, such as %str(if evalitt="y")*/ caseid=, /*required: unique caseid*/ exclude_mistrt=y, /*required: excluding cases with missing values for treatment variable*/ exclude_misstrata=y,/*required: excluding cases with missing values for strata variable*/ anavar=, /*required: anavar as analysis variable name*/ txgroup=, /*required: txgroup as treatment group variable-must be with value 0 for placebo and 1 for treatment*/ pooln=2, /*required: pooln as the size of a pool that you want to pool to next strata*/ strata= /*required: strata as character strata variable*/ ); option mprint; * Delete missing value; data my&indata; set &indata; &cond ; if &anavar^=.; %if exclude_mistrt=y %then %do; if &txgroup^=.; %if exclude_misstrata=y %then %do; if &strata^=.; proc freq data=my&indata; table &txgroup*&strata/list missing; 3

title "Strata distribution by treatment group before collapsing"; * if type as all*; %if %upcase(&type)=all %then %do; proc sort data=my&indata out=all0_strata; proc freq data=my&indata noprint ; table &txgroup*&strata/list missing out=all1_strata; proc sort data=all1_strata out=all2_strata; proc transpose data=all2_strata out=all3_strata prefix=n; var count; id &txgroup; * if one of treatment group with less than &pooln subjects then set pool flag to 1; data all4_strata; set all3_strata; if n0>=%eval(&pooln) and n1>=%eval(&pooln) then flag=0; else flag=1; data all5_strata; length n_strata $10; set all4_strata; if flag=1 then n_strata='pooled'; else n_strata=&strata; proc sort data=all5_strata; data &outname(rename=(n_strata=&strata)); merge all0_strata all5_strata; drop _name_ n0 n1 &strata flag; proc datasets lib=work; delete my&indata all0_strata all1_strata all2_strata all3_strata all4_strata all5_strata; proc sort data=&outname; by &caseid; proc freq data=&outname; table &txgroup*&strata/list missing; title "Strata distribution by treatment group after collapsing"; /*end of type=all*/ 4

* if type as next_high or next_low; %let my_tot=0; %if %upcase(&type)=next_high or %upcase(&type)=next_low %then %do; %do %while (%eval(&my_tot)<%eval(&pooln)); * get strata by txgroup cross frequency count; proc freq data=my&indata noprint ; table &txgroup*&strata/list missing out=all1_strata; proc sort data=all1_strata out=all2_strata; proc transpose data=all2_strata out=all3_strata prefix=n; var count; id &txgroup; * if one of treatment group with lt 2 counts then flag equal 1; data all4_strata; set all3_strata; if n0>=%eval(&pooln) and n1>=%eval(&pooln) then flag=0; else flag=1; proc sort data=all4_strata nodupkey out=all5_strata; * merge flag back; data checkpooln; merge all2_strata all5_strata; drop _name_ n0 n1 ; proc sort data=checkpooln; %if %upcase(&type)=next_high %then %do; by &txgroup descending &strata ; %if %upcase(&type)=next_low %then %do; by &txgroup &strata ; data checkpooln; set checkpooln; %if %upcase(&type)=next_high %then %do; by &txgroup descending &strata; %if %upcase(&type)=next_low %then %do; by &txgroup &strata; pre_&strata=lag(&strata); pre_&txgroup=lag(&txgroup); 5

if first.&txgroup then do; pre_&strata=&strata; pre_&txgroup=&txgroup; end; * if this stratum needs to be pooled then assign the next stratum value to it depending on collapsing type; if flag=1 and pre_&txgroup=&txgroup then fmt_&strata=pre_&strata; else fmt_&strata=&strata; * create two formats to replace original strata value with new strata value; * placebo group format; data placebofmt; set checkpooln; if &txgroup=0; start=&strata; end=&strata; label=fmt_&strata; fmtname='pchg'; type='c'; proc format library=work cntlin=placebofmt fmtlib maxselen=200 maxlable=200; * treatment group format; data trtfmt; set checkpooln; if &txgroup=1; start=&strata; end=&strata; label=fmt_&strata; fmtname='tchg'; type='c'; proc format library=work cntlin=trtfmt fmtlib maxselen=200 maxlablen=200; * Apply format to replace strata values with pooled strata value; data my&indata ; set my&indata (rename=(&strata=org_&strata)); if &txgroup=0 then &strata=put(org_&strata,$pchg.); if &txgroup=1 then &strata=put(org_&strata,$tchg.); drop org_&strata; proc freq data=my&indata noprint; table &txgroup*&strata/list missing out=smallcount; title "After collapsing in final &indata"; proc sql; select min(count) into :mytot from smallcount; ; quit; * get the smallest counts of last stratum and use this to compare with macro variable mytot to see if smallest exist in the very end; 6

%if %upcase(&type)=next_high %then %do; proc sort data=smallcount; by descending &strata &txgroup; data lasttot; set smallcount; if _n_=1; call symput("lastot",put(count,10.)); %if %upcase(&type)=next_low %then %do; proc sort data=smallcount; by &strata &txgroup; data lasttot; set smallcount; if _n_=1; call symput("lastot",put(count,10.)); %put "all_small_count=" &mytot; %put "last_stata_small_count=" &lastot; %if &mytot>=2 %then %goto myend; %if &mytot<2 and &mytot^=&lastot %then %do; * clean intermediate data sets; proc datasets lib=work; delete all1_strata all2_strata all3_strata all4_strata all5_strata checkpooln trtfmt placebofmt ; %let my_tot=&mytot; %if &mytot<2 and &mytot=&lastot %then %do; * clean intermediate data sets; proc datasets lib=work; delete all1_strata all2_strata all3_strata all4_strata all5_strata checkpooln trtfmt placebofmt ; * if the last stratum with smallest counts- you have to; * combine it to next stratum in opposite direction; proc freq data=my&indata noprint ; table &txgroup*&strata/list missing out=all1_strata; proc sort data=all1_strata out=all2_strata; proc transpose data=all2_strata out=all3_strata prefix=n; var count; id &txgroup; data all4_strata; set all3_strata; 7

if n0>=%eval(&pooln) and n1>=%eval(&pooln) then flag=0; else flag=1; proc sort data=all4_strata nodupkey out=all5_strata; data checkpooln; merge all2_strata all5_strata; drop _name_ n0 n1 ; proc sort data=checkpooln; * notice the change of sorting order corresponding to type and it also; * use the opposite ascending or descending sorting comparing to similar; * procedures in first part; %if %upcase(&type)=next_high %then %do; by &txgroup &strata ; %if %upcase(&type)=next_low %then %do; by &txgroup descending &strata ; data checkpooln; set checkpooln; %if %upcase(&type)=next_high %then %do; by &txgroup &strata; %if %upcase(&type)=next_low %then %do; by &txgroup descending &strata; pre_&strata=lag(&strata); pre_&txgroup=lag(&txgroup); if first.&txgroup then do; pre_&strata=&strata; pre_&txgroup=&txgroup; end; if flag=1 and pre_&txgroup=&txgroup then fmt_&strata=pre_&strata; else fmt_&strata=&strata; data placebofmt; set checkpooln; if &txgroup=0; start=&strata; end=&strata; label=fmt_&strata; fmtname='pchg'; type='c'; proc format library=work cntlin=placebofmt fmtlib MAXSELEN=200 MAXLABLEN=200; data trtfmt; set checkpooln; if &txgroup=1; start=&strata; 8

end=&strata; label=fmt_&strata; fmtname='tchg'; type='c'; proc format library=work cntlin=trtfmt fmtlib maxselen=200 maxlablen=200; data my&indata ; set my&indata (rename=(&strata=org_&strata)); if &txgroup=0 then &strata=put(org_&strata,$pchg.); if &txgroup=1 then &strata=put(org_&strata,$tchg.); drop org_&strata; *check smallest counts to see if further looping is needed; proc freq data=my&indata noprint; table &txgroup*&strata/list missing out=smallcount; title "after reverse replacement in final &indata"; proc sql; select min(count) into :mytot from smallcount; ; quit; %put "smallcount=" &mytot; %let my_tot=&mytot; /*end of &mytot<2 and &mytot=&lastot*/ /*end of do while*/ %myend: * save out the final data set; data &outname; set my&indata; *clean the intermediate files; proc datasets lib=work; delete my&indata all1_strata all2_strata all3_strata all4_strata all5_strata checkpooln trtfmt placebofmt ; proc freq data=&outname; table &txgroup*&strata/list missing; title "strata distribution by treatment group after collapsing"; /*end of type=next_high or next_low*/ %mend combstrata; The following test data set is used to illustrate macro calls as examples. The data set has patient ID variable (pt), numeric treatment group variable (trtcd-0 for placebo and 1 for treatment), character stratum variable (stratacd- with a,b,c,d values), and event variable (event-1 for with event and 0 for without event). There is one observation in trtcd=1 and stratacd= b group. In addition, there is also one observation in trtcd=0 and stratacd= d. Those groups with observations less than two are the target groups that will be collapsed by calling the macro. You can make three different macro calls. 9

data one; input pt trtcd stratacd $ event; cards; 1 1 a 1 2 1 a 1 3 1 a 0 4 0 a 1 5 0 a 1 6 0 a 1 7 1 b 1 10 0 b 1 11 0 b 1 12 0 b 1 10 0 b 1 11 0 b 1 12 0 b 1 13 1 c 1 14 1 c 1 15 1 c 1 16 1 c 1 17 1 c 1 19 1 c 1 20 0 c 1 21 0 c 1 22 0 c 1 23 0 c 1 24 0 c 1 25 1 d 1 26 1 d 1 27 0 d 1 ; Before collapsing, you can see that trtcd=0 and stratacd=d and trtcd=1 and stratacd=b have total counts less than 2. The Original Strata Groups Cumulative Cumulative trtcd stratacd Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 a 3 11.11 3 11.11 0 b 6 22.22 9 33.33 0 c 5 18.52 14 51.85 0 d 1 3.70 15 55.56 1 a 3 11.11 18 66.67 1 b 1 3.70 19 70.37 1 c 6 22.22 25 92.59 1 d 2 7.41 27 100.00 You can collapse these to pooled stratum if given &TYPE=ALL by using the following macro call. %combstrata(type=all,indata=one,outname=test1,caseid=pt,exclude_mistrt=y,exclude_misstr ata=y, anavar=event,txgroup=trtcd,pooln=2,strata=stratacd ); After the macro call, you will see all the stratacd= b and stratacd= d were pooled into stratacd= pooled under both trtcd=0 and trtcd=1. Thus, 6+1=7 and 1+2=3. 10

All Strata Grouping Option Cumulative Cumulative trtcd stratacd Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 a 3 11.11 3 11.11 0 c 5 18.52 8 29.63 0 pooled 7 25.93 15 55.56 1 a 3 11.11 18 66.67 1 c 6 22.22 24 88.89 1 pooled 3 11.11 27 100.00 Next, you can call the macro by using &type=next_high. %combstrata(type=next_high,indata=one,outname=test2,caseid=pt, exclude_mistrt=y,exclude_misstrata=y,anavar=event,txgroup=trtcd,pooln=2, strata=stratacd); The above macro call will pool the stratacd= b and d to stratacd= c. Collapsing d to c is because there is no stratum with value higher than d and collapsing value in opposite direction is conducted for stratacd= d group. Thus, 6+5+1=12 and 1+6+2=9. Next Higher Grouping Option Cumulative Cumulative trtcd stratacd Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 a 3 11.11 3 11.11 0 c 12 44.44 15 55.56 1 a 3 11.11 18 66.67 1 c 9 33.33 27 100.00 Finally, you can call the macro by using &type=next_low. %combstrata(type=next_low,indata=one,outname=test3,caseid=pt, exclude_mistrt=y,exclude_misstrata=y,anavar=event,txgroup=trtcd,pooln=2, strata=stratacd ); The above macro call will pool the stratacd= b and d to stratacd= a and c respectively. Thus, 6+3=9, 3+1=4, 5+1=6, and 6+2=8. Next Lower Grouping Option Cumulative Cumulative trtcd stratacd Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 a 9 33.33 9 33.33 0 c 6 22.22 15 55.56 1 a 4 14.81 19 70.37 1 c 8 29.63 27 100.00 Once you have collapsed the data set, you can run further statistical procedures by using newly generated data set. You can also test the impact of different collapsing methods easily by selecting the different collapsing methods followed by the same statistical procedure several times. The results of sensitivity analysis can provide more information for final decision 11

on selecting the final collapsing strategy if collapsing method has not been already defined in SAP since you may not have anticipated this event in the design stage. ALTERNATIVE METHOD If you do not use the proposed macro, you will need to use proc freq to check the cross frequency distribution of treatment by strata to make sure which strata groups with counts less than &POOLN. Then, you will need to hard code the strata groups by using the if and else if for one kind of collapsing method. If you want to conduct sensitivity analysis for another collapsing method, you will need to hard code them also. This manual process is not only time consuming but also is prone to errors. CONCLUSION This macro is very easy to use and can save time for statisticians or programmers. The sensitivity analysis can be easily done by calling the macro with different &TYPE selections. It also will save programming time to generate final production version of data collapsing when many variables need to be analyzed under the same approach. ACKNOWLEDGMENTS Many thanks to Minying Royston for providing an opportunity to use similar macro in Amgen production programs. Many thanks for Dr. Xuena Wang and Dr. Nan Zhang for giving some inputs about collapsing data strategies on this paper. Many thanks for Dr. Mandyam Srirama and Mr. Rajesh Venkkataram for reviewing the paper. 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 REFERENCE http://sda.berkeley.edu/helpdocs/semethod.htm, Methods Used by SDA 3.1 for Computing Standard Errors of Percentages and Means for Complex Samples. Barbara Lepidus Carlson,"Software for Statistical Analysis of Sample Survey Data", reprinted with permission from Encyclopedia of Biostatistics, Wiley, 1998. A brief discussion of variance estimation in surveys and references for a number of packages. Cochran, William G., description of method of collapsed strata in Sampling Techniques, 1977, pp 139-140. CONTACT INFORMATION Sunil Gupta, Associate Director, Statistical Programming Quintiles, Inc. 325 E. Hillcrest Drive Suite 200 Thousand Oaks, CA 91360 Work Phone: 805-557-7774 E-mail: Sunil.Gupta@quintiles.com Linfeng Xu, MSPH, Senior SP Quintiles, Inc. 325 E. Hillcrest Drive Suite 200 Thousand Oaks, CA 91360 Work Phone: 805-557-7727 E-mail: Linfeng.xu@quintiles.com 12