Creating Metadata

download Creating Metadata

of 4

Transcript of Creating Metadata

  • Paper 45-28

    Building Metadata Repository for Data Sets Haining Luo, Medical Star Hospital, Beijing, China

    Haiping Luo, Dept of Veterans Affairs, Washington, DC

    ABSTRACT Metadata describe SAS dataset features, such as dataset name, physical location, creation date, last modified date, number of observations, variable names, and so on. A metadata repository gives users quick access to many datasets features without opening those datasets. This paper demonstrates macros to automate the process of building and reporting metadata repositories. Macro %getmeta allows a programmer to document metadata for a dataset and append these metadata to a metadata repository of other datasets. Macro %viewmeta generates a metadata report from a metadata repository as a comma-separated file. Users may view the report through MS Excel. The metadata repository includes over 50 variables, 42 of them come from Proc Contents output, and the rest come from a macro %getfreq and programmers input. The output from Proc Contents describes the features of datasets. The output from %getfreq lists the most frequent values or value ranges of all variables of the dataset. The programmer can add project name, code name, and the physical file name of the dataset to the repository. This repository experiment has been tested in Windows environment using PC SAS 8.2. The macros run with Base SAS. Any programmer with minimal SAS skills can run these macros.

    DATASET DOCUMENTATION PRINCIPLES Documentation is a tedious but extremely important part of any programming and application development process. Besides good commenting practice during programming, a developer should document all datasets s/he creates. Documenting datasets should follow these basic principles: 1. A dataset should be documented at the time when the

    dataset is generated. 2. The dataset documentation should have a reference to the

    code which generated this dataset. 3. The documentation for all datasets of a project should be

    kept together within the project file directory. 4. The dataset documentation should be accessible without

    invoking SAS. 5. The metadata being captured should describe variable

    values in addition to dataset features. To implement these principles, a developer often needs to use several SAS procedures and to write many lines of code. This paper demonstrates macros to automate the process of documenting datasets. With the help of these macros, a developer can build and report metadata repositories on the fly. The resulting metadata repositories satisfy these documentation principles.

    USING MACROS TO BUILD METADATA REPOSITORY Before we introduce the contents of the macros, lets see how we can use the macros to build a metadata repository. Three macros will be used: 1. %getmeta 2. %getfreq 3. %viewmeta All of these macros can be downloaded from: http://chinafoundation1.org/hp/sugipapers.htm. Among these three macros, only two, %getmeta and %viewmeta, will be called directly. %getmeta is used to generate

    metadata from a dataset then append these metadata to a metadata repository for a specific project. %getmeta calls another macro, %getfreq, to obtain the frequent values, the frequency count, and the mean & maximum & minimum of all variables. The output of %getmeta include: 1) a repository dataset which contains all metadata about all datasets of a project and 2) a comma-separated (csv) metadata file which contains brief dataset information and variables value range information. The csv file can be viewed through MS Excel to get a quick look of the datasets documented in the repository. %viewmeta is used to generate a complete report of all metadata of all datasets in the repository. This report is a csv file in a viewer-friendly format for being viewed through MS Excel. Now assume this scenario. We have a project called SUGI 28 Paper. This project contains two SAS programs shoes.sas and retail.sas. These programs created two permanent datasets, shoes and retail, respectively. We first call %getmeta at the end of the program code shoes.sas to generate metadata for dataset shoes:

    * point to the macro library which contains%getmeta and %getfreq;options sasautos="d:\home\sasmacrolib";* call %getmeta, which will call %getfreqinternally;%getmeta(datapath=d:\home\paper\sas\sugi28\,datalib=SUGI28,dataname=SHOES,codename=d:\home\paper\sas\sugi28\shoes.sas,macrpath=d:\home\sasmacrolib);

    This macro call will generate a repository dataset meta_SUGI28.sas7bdat and a brief csv file meta_SUGI28.csv in the data path d:\home\paper\sas\sugi28\. At this moment, the repository dataset has the entire set of metadata for the dataset shoes, while the csv file is a brief version of the repository. We then call %getmeta at the end of the program code retail.sas to generate metadata for dataset retail:

    options sasautos="d:\home\sasmacrolib";%getmeta(datapath=d:\home\paper\sas\sugi28\,datalib=SUGI28,dataname=RETAIL,codename=d:\home\paper\sas\sugi28\retail.sas,macrpath=d:\home\sasmacrolib);

    This macro call will append metadata for dataset retail to the repository dataset meta_SUGI28.sas7bdat and to the csv file meta_SUGI28.csv. Now the repository dataset has the complete metadata for both shoes and retail, while the csv file is a brief version of the repository. Such calls to %getmeta for a same dataset can be repeated as many times as needed. Each new call will delete the existing metadata for this same dataset and append the new result. The brief csv file contains the following metadata: Data Set Label, Dataset Name, Path of Dataset Library, The Code Which Created Dataset Observations in Data Set, Total Number of Variables Variable Name, Variable Label

    SUGI 28 Beginning TutorialsSUGI 28 Applications Development

  • 2

    Most Frequent Values of Character Variables Most Frequent Values of Numeric Variables Frequency Count, Percent of Total Frequency Variable Mean, Maximum, Minimum Dataset Created Date, Last Modified Date Date & Time Metadata Were Generated To get a complete view of all metadata of all datasets in the repository, we will write a small program to call %viewmeta:

    * point to the macro library which contains%viewmeta;options sasautos="d:\home\sasmacrolib";* call %viewmeta;%viewmeta(datalib=SUGI28,metapath=d:\home\paper\sas\sugi28\);

    This macro call will generate a viewer-friendly csv file viewmeta.csv in the same path of the repository. This csv file displays all metadata contained in the repository file meta_sugi28.sas7bdat. For each dataset, the csv file has two blocks to display the metadata: a Dataset Block which displays the metadata for the dataset and a Variable Block which displays variable names, labels, formats, frequent values, frequency count, mean, maximum, minimum and other information about all variables in the dataset. This %viewmeta can also be called as many time as needed, each call will generate the current view of the repository and replace the previous viewmeta.csv file. The tables below show a portion of the Dataset Block and Variable Block in viewmeta.csv file: Meta Variable Name Meta Variable Description Value

    LIBNAME Library Name SUGI28

    MEMNAME Dataset Name SHOES

    MEMLABEL Data Set Label Fictitious Shoe Company Data

    ENGINE Engine Name V8

    created Date & Time Dataset Were Created 10AUG1999:15:34:42

    modified Date & Time Dataset Were Last Modified 10AUG1999:15:34:42

    metadate Date & Time Metadata Were Generated 12/15/2002 21:09

    libpath Path of Dataset Library d:\home\paper\sas\sugi28

    codepath The Code Which Created Dataset d:\home\paper\sas\sugi28\shoes.sas

    NOBS Observations in Data Set 395

    SORTED Sorted and/or Validated .

    Dataset Name

    Variable Name

    Variable Type

    Variable Length

    Variable Label

    Most Frequent Values of Numeric Variables

    Most Frequent Values of Character Variables

    Frequency Count

    Percent of Total Frequency Mean

    SHOES Product Character 14 . Boot 52 13.2 .

    SHOES Product Character 14 . Slipper 52 13.2 .

    SHOES Product Character 14 . Sport Shoe 51 12.9 .

    SHOES Product Character 14 .

    Women's Dress 51 12.9 .

    SHOES Stores Numeric 8 Number of Stores 1 37 9.4 11.65

    SHOES Stores Numeric 8 Number of Stores 3 33 8.4 11.65

    SHOES Stores Numeric 8 Number of Stores 2 29 7.3 11.65

    SHOES Stores Numeric 8 Number of Stores 4 20 5.1 11.65

    In short, to build a metadata repository for a project, all we need to do is to call %getmeta for each dataset. To view all metadata in MS Excel, a call to %viewmeta will prepare the metadata file in csv format.

    DESIGN OF %GETMETA 2. USER INPUT %Getmeta collects user input through five parameters: Datapath: physical path for the dataset directory; the meta repository will be stored in the same directory. Datalib: library name for the dataset directory. It should represent the project the data belong to and be consistent each time %getmeta is run for the same dataset. It is recommended using the same datalib name for all %getmeta calls for all datasets in the same project. Dataname: dataset name from which the metadata will be generated. Codename: physical path and file name for the SAS program which created this dataset. Macrpath: physical path for the macro library directory where %getfreq is stored.

    3. STEPS There are six steps in macro %getmeta: 1) Get dataset physical path. Although a parameter is set for a user to input the path to the data directory, the physical path to the data directory is captured through querying dictionary.members. The capture can guarantee the format of the path. Once the path is obtained, it is assigned to a macro variable libpath to be stored later in metadata.

    proc sql noprint;create table dict as

    (select pathfrom dictionary.memberswhere libname="&datalib");

    quit;data _null_;

    set dict(keep=path);** note: libpath will not have \ at the end;

    call symput('libpath',trim(left(path))); 2) Get dataset contents table. The metadata for the dataset mainly come from PROC contents output. The output of PROC contents details has 48 variables. All of them are kept as metadata for this dataset. But the output table does not contain total number of variables, the physical path to the dataset directory, and the program code which created the dataset. Since the directory path has been captured in step 1), and the code path and name have been collected through parameter values, only the total number of variables needs to be obtained. A piece of code is written to calculated the number of variables:

    proc means max data=acont noprint;var varnum;

    output out=vn max=vnum;data _null_;

    set vn;call symput('vnumb',vnum);

    where acont is the output table from PROC contents, varnum contains the sequential number assigned to a variable in the original dataset, the maximum of varnum is the total number of the variables in the dataset. This total number is then assigned to a macro variable vnumb to be put into the metadata later. 3) Obtain variable value range, most frequent values, and

    frequency distribution. The next step is to call %getfreq (see SUGI 26 Paper 81-26 by Haiping Luo for a detail explanation of %getfreq) to get variable value range, most frequent values, frequency distribution and other variable information. To control the size of frequency table returned by %getfreq, the variable values which have 1 occurrence in the entire dataset or whichs frequency is below 5 percent of the total observations are dropped from the returned frequency table.

    SUGI 28 Beginning TutorialsSUGI 28 Applications Development

  • 3

    4) Merge content table and frequency table. The output of PROC contents and the frequency table created by %getfreq are merged together to form the metadata table. The dataset path, number of variables, and the date and time when the metadata were created are added into this table. 5) Append the metadata table to the existing metadata repository. The following code checks the existence of metadata repository. If the repository exists, the new metadata will be appended to the repository. Otherwise, a new repository will be created. Also if the dataset has already had metadata stored in the repository, the existing metadata for the dataset will be deleted and the new capture will be stored into the repository.

    %if %sysfunc(exist(&&datalib..meta_&datalib))%then %do;

    data &datalib..meta_&datalib;set &datalib..meta_&datalib;if

    memname="&dataname" andcodepath = "&codename" andlibpath = "&libpath"then delete;

    proc datasets force;append base=&datalib..meta_&datalibdata=meta_&dataname;

    run;

    quit;%end;

    %else %do;data &datalib..meta_&datalib;

    set meta_&dataname;run;

    %end; 6) Create a comma-separated file to demonstrate a brief version

    of the repository. At the end of %getmeta, a print out is posted to a csv file through invoking a ODS csv statement.

    3. OUTPUT The output of %getmeta are a repository dataset meta_&datalib..sas7bdat and a brief csv file meta_&datalib..csv. Both of them are stored in the same directory where the dataset is located. The repository has 53 metadata variables, while the csv file has 18 metadata variables.

    DESIGN OF %VIEWMETA 1. USER INPUT %Viewmeta collects user input through two parameters: Datalib: this libname is used to identify the metadata repository dataset created by %getmeta, i.e., meta_&datalib..sas7bdat. Metapath: physical path for the directory where the metadata repository is located.

    2. STEPS There are two steps in macro %getmeta: 1) Get the total number of datasets stored in the repository. For the purpose of displaying metadata one dataset at a time in the output file, a dataset id is assigned to each dataset in the metadata repository. The total number of datasets is captured and stored in a macro variable dsetnumb.

    proc sort data=in.meta_&datalib out=s1;by libname MEMNAME;

    *** get number of datasets;data meta_&datalib;

    retain dsetid 0;

    set s1;by libname MEMNAME;label dsetid = "Dataset Order in

    Repository meta_&datalib";if first.memname then dsetid + 1;if last.libname then do;

    call symput('dsetnumb',dsetid);end;

    2) Loop through datasets to post to Dataset Block and

    Variable Block to the output csv file. At this step, ODS csv is first invoked to allow posting printout to the output file viewmeta.csv, dataset by dataset along the loop. Then the loop will go through each dataset until the last dataset defined by the macro variable &dsetnumb., There are two levels of metadata in the repository, those applied to the dataset as a whole and those applied to specific variables. During the loop, the dataset level metadata, such as dataset name, number of variables, etc., are putting into the Dataset Block from top down in the csv file; the variable level metadata, such as variable name, value, mean, etc., are putting into the Variable Block from left to right in the csv file (see a previous section for a demo). To generate the dataset level list from top down, the metadata are transposed by character values and by numeric values. After the transpose, the dataset level list and the variable level list are printed to the csv file. Then the loop continues to the next dataset in the repository.

    3. OUTPUT The output of %viewmeta is a cvs file in the same directory where the metadata were stored: viewmeta.csv. All 53 metadata variables for all captured datasets are displayed in the file. Each time when %viewmeta is run, the existing viewmeta.csv will be replaced by the new output.

    TEST You can follow these steps to build a test metadata repository: 1. Assume you have a directory to store SAS macros d:\home\sasmacrolib. Download the three macros, %getfreq, %getmeta, and %viewmeta, from: http://chinafoundation1.org/hp/sugipapers.htm Store the macros into the macro directory. 2. Create a project directory d:\home\paper\sas\sugi28\. Copy two sample datasets shoes.sas7bdat and retail.sasd7dat from the [SAS root]\core\sashelp directory to the project directory. 3. Create a small SAS program, type the three macro calls (two %getmeta calls and one %viewmeta call in this order) as described in the previous section Using Macros to Build Metadata Repository. 4. Run this program and you will see the output in the directory d:\home\paper\sas\sugi28\: meta_SUGI28.sas7bdat meta_SUGI28.sas7bdat viewmeta.csv 5. Open the csv files to view the metadata captured.

    SUMMARY This paper introduced the designs and usage of two macros, %getmeta and %viewmeta. These two macros plus another macro %getfreq (see SUGI 26 Paper 81-26 by Haiping Luo) can be used together to automate the process of building and reporting metadata repositories for datasets. A repository stores over 50 variables to describe the datasets and the variables in the datasets. These metadata can provide handy documentation for SAS projects.

    NOTE

    SUGI 28 Beginning TutorialsSUGI 28 Applications Development

  • 4

    The updated paper and macros can be found in this link: http://chinafoundation1.org/hp/sugipapers.htm

    CONTACT INFORMATION Your comments and questions are valued and encouraged. Contact the authors at:

    Name Haiping Luo Company Dept of Veterans Affairs Email: [email protected] 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 registered trademarks or trademarks of their respective companies.

    SUGI 28 Beginning TutorialsSUGI 28 Applications Development

    SUGI 28 Title PageSUGI 28 Conference LeadersSection Keynotes2003 SASware Ballot ResultsUpcoming SUGI ConferencesWrapup of SUGI 27Advanced TutorialsSUGI 28: Multi-platform SAS(r), Multi-platform CodeSUGI 28: Reducing the CPU Time of Your SAS(r) Jobs by More than 80%: Dream or Reality?SUGI 28: Indexing and Compressing SAS(r) Data Sets: How, Why and Why NotSUGI 28: Hashing: GenerationsSUGI 28: Version 9 EpiphaniesSUGI 28: Developing SAS/AF(r) Applications with Form Viewers and Table ViewersSUGI 28: Fast and Easy Ways to Advance on Your Beginning SAS(r) Coworkers!SUGI 28: Advanced Analytics with Enterprise Guide(r)SUGI 28: Categorical Data Analysis with GraphicsSUGI 28: A Serious Look at Macro QuotingSUGI 28: Generating Custom Excel Spreadsheets Using ODSSUGI 28: The Power of Pictures and Paint: Using Image Files and Color with ODS, SAS(r), and SAS/GRAPH(r)SUGI 28: Web Enabling Your Graphs with HTML, ActiveX, and Java Using SAS/GRAPH(r) and the Output Delivery SystemSUGI 28: PROC REPORT: Doin' It In STYLE!SUGI 28: Fancy MS Word Reports Made Easy: Harnessing the Power of Dynamic Data ExchangeSUGI 28: Using Different Methods for Accessing Non-SAS(r) Data to Build and Incrementally Update That Data WarehouseSUGI 28: SAS/ACCESS(r) to External Databases: Wisdom for the Warehouse UserSUGI 28: Undocumented and Hard-to-Find SQL FeaturesSUGI 28: Tips from the Hood: Challenging Problems and Tips from SAS-L

    Applications DevelopmentSUGI 28: %WINDOW: Get the Parameters the User Wants and You NeedSUGI 28: Next Generation Data _NULL_ Report Writing Using ODS OO FeaturesSUGI 28: Hot Links: Creating Embedded URLs Using ODSSUGI 28: ODS to RTF: Tips and TricksSUGI 28: XML in the DATA StepSUGI 28: Using SAS(r) Software to Analyze Web LogsSUGI 28: Developing SAS/AF(r) Applications Made EasySUGI 28: The One-Time Methodology: Encapsulating Application DataSUGI 28: SAS(r) Helps Those Who Help Themselves: Creating Tools to Aid in Your Application DevelopmentSUGI 28: 'Watch Your Language!' -- Using SCL Lists to Store VocabularySUGI 28: Application Refactoring with Design PatternsSUGI 28: Using IOM and Visual Basic in SAS(r) Program DevelopmentSUGI 28: Using AppDev Studio(tm) and Integration Technologies for an Easy and Seamless Interface between Java and Server-Side SAS(r)SUGI 28: A Pinch of SAS(r), a Fraction of HTML, and a Touch of JavaScript Serve Up a Grand RecipeSUGI 28: Web Enable Your SAS(r) ApplicationsSUGI 28: Producing American Community Survey Edit Analysis Reports Dynamically Using SAS/IntrNet(r)SUGI 28: Using a Dynamic SAS/IntrNet(r) Application to Create Statistical Comparison Reports and Download as SAS(r) Data SetsSUGI 28: 'The California Template' or 'How to Keep from Reinventing the Wheel Using SAS/IntrNet(r), JavaScript, and Process Reengineering'SUGI 28: UNIX Meet PC: Version 8 to the RescueSUGI 28: A Table-Driven Solution for Clinical Data SubmissionSUGI 28: A Programming Development Environment for SAS(r) ProgramsSUGI 28: StARScope: A Web-Based SAS(r) Prototype for Clinical Data VisualizationSUGI 28: Dynamically Building SQL Queries Using Metadata Tables and Macro ProcessingSUGI 28: Make Your SAS/ACCESS(r) Query More EfficientSUGI 28: Building Metadata Repository for Data SetsSUGI 28: Big Brother for SAS/IntrNet(r) Security and Tracking AgentSUGI 28: Advanced CRM Solution Using Java ApplicationsSUGI 28: Automotive Warranty Data Analysis on the World Wide WebSUGI 28: Developing Data-Driven Applications Using JDBC and Java Servlet/JSP TechnologiesSUGI 28: GoodsHound -- Building Multi-functional Web-Based Applications with SAS/IntrNet(r) and JavaScriptSUGI 28: Developing Custom Analytic Tasks for SAS(r) Enterprise Guide(r)

    Beginning TutorialsSUGI 28: A Beginner's Guide to Incorporating SAS(r) Output into Microsoft Office ApplicationsSUGI 28: Mouse Clicking Your Way to Viewing and Manipulating Data with Versions 8 and 9 of the SAS(r) SystemSUGI 28: Connecting the SAS(r) System to the Web: An Introduction to SAS/IntrNet(r) Application DispatcherSUGI 28: Describing and Retrieving Data with SAS(r) FormatsSUGI 28: Nine Steps to Get Started Using SAS(r) MacrosSUGI 28: How Regular Expressions Really WorkSUGI 28: Beyond Debugging: Program ValidationSUGI 28: Errors, Warnings, and Notes (Oh My): A Practical Guide to Debugging SAS(r) ProgramsSUGI 28: Introduction to the SAS(r) Custom Tag LibrarySUGI 28: DHTML -- GUI on the CheapSUGI 28: Tips for Manipulating DataSUGI 28: Data Warehouse Administrator: Step by StepSUGI 28: Java Syntax for SAS(r) ProgrammersSUGI 28: Java Servlets and Java Server Pages for SAS(r) Programmers: An IntroductionSUGI 28: Date Handling in the SAS(r) SystemSUGI 28: SAS(r) System Options Are Your FriendsSUGI 28: Easy, Elegant, and Effective SAS(r) Graphs: Inform and Influence with Your DataSUGI 28: SAS(r) Enterprise Guide(r) -- Getting the Job DoneSUGI 28: Getting Up to Speed with PROC REPORTSUGI 28: SAS(r) Reporting 101: REPORT, TABULATE, ODS, and Microsoft Office

    Coders' CornerSUGI 28: Space Odyssey: Concatenate Zip Files into One Master FileSUGI 28: The URL-y Show: Using SAS(r) LE and the URL Access Method to Retrieve Stock QuotesSUGI 28: So Many Files, So Little Time (or Inclination) to Type Their Names: Spreadsheets by the HundredsSUGI 28: Splitting a Large SAS(r) Data SetSUGI 28: Comparative Efficiency of SQL and Base Code When Reading from Database Tables and Existing Data SetsSUGI 28: Automatically Combining the Data from a Variety of DBMSs with ODBC and PROC SQLSUGI 28: Automatic Data File Retrieval from Different Database EnginesSUGI 28: UNLOADing Data from InformixSUGI 28: Return Code from Macro; Passing Parameter by ReferenceSUGI 28: If Only 'Page 1 of 1000'SUGI 28: Don't Dither About Your Data, Let SAS/GRAPH(r) Trending Box Plots Drive Decision MakingSUGI 28: A Handy Use of the %LINE Annotate MacroSUGI 28: A Drill-Down Diet: An Example of a Dynamic Detail Access on the Web Using SAS/GRAPH(r) and ODSSUGI 28: Make Your Life and Little Easier: A Collection of SAS Macro UtilitiesSUGI 28: More _Infile_ MagicSUGI 28: The Power of Recursive SAS(r) Macros -- How Can a Simple Macro Do So Much?SUGI 28: Continuous or Not: How One Can TellSUGI 28: Identifying Continuity in Longitudinal DataSUGI 28: Determining the Dimensionality of Data: A SAS(r) Macro for Parallel AnalysisSUGI 28: Using a SAS(r) Macro to Document the DatabaseSUGI 28: An Automated MS Powerpoint Presentation Using SAS(r)SUGI 28: A Macro Using SAS(r) ODS to Summarize Client Information from Multiple ProceduresSUGI 28: Multiple Graphs on One Page: The Easy Way (PDF) and the Hard Way (RTF)SUGI 28: Taking Control of Macro VariablesSUGI 28: PROC SQL vs. Merge -- The Miller Lite Question of 2002 and BeyondSUGI 28: An Efficient Approach to Combine SAS(r) Data Sets with Voluminous Variables That Need Name and Other ChangesSUGI 28: Danger: MERGE Ahead! Warning: BY Variable with Multiple Lengths!SUGI 28: The DOW (Not that DOW!!!) and the LOCF in Clinical TrialsSUGI 28: MACRO Function with Error Handling to Automatically Generate Global Macro Date VariablesSUGI 28: Report? Make It Easy -- An Example of Creating Dynamic Reports into ExcelSUGI 28: Another Shot at the Holy Grail: Using SAS(r) to Create Highly-Customized Excel WorkbooksSUGI 28: Combining Summary Level Data with Individual RecordsSUGI 28: RETAINing Information to Identify Entity CharacteristicsSUGI 28: Randomized RoundingSUGI 28: Logicals from Libraries: Using Storage as a Bridge between SessionsSUGI 28: %Fun &With %SYSFUNCSUGI 28: Creating Display Manager Abbreviations and Keyboard Macros for the Enhanced EditorSUGI 28: Build a SAS(r) Development Environment under WindowsSUGI 28: Using SAS(r) Catalogs to Develop and Manage DATA Step ProgramsSUGI 28: Let's Play a Game: A SAS(r) Program for Creating a Word Search MatrixSUGI 28: SAS/CONNECT(r): The Ultimate in Distributed ProcessingSUGI 28: Run Time Comparison MacroSUGI 28: Parallel Processing on the Cheap: Using Unix Pipes to Run SAS(r) Programs in ParallelSUGI 28: Date Parameters for Interval ReportingSUGI 28: Keep Those Formats Rolling: A Macro to Manage the FMTSEARCH= OptionSUGI 28: A Simplified and Efficient Way to Map Variables of a Clinical Data WarehouseSUGI 28: Renaming All Variables in a SAS(r) Data Set Using the Information from PROC SQL's Dictionary TablesSUGI 28: The BEST. Message in the SAS(r) Log

    Data Mining TechniquesSUGI 28: Modeling Customer Lifetime Value Using Survival Analysis - An Application in the Telecommunications IndustrySUGI 28: A Simple Bayesian Approach in Mining the Touch Point DataSUGI 28: Shopping for Voters: Using Association Rules to Discover Relationships in Election Survey DataSUGI 28: Monitoring, Analyzing, and Optimizing Waterflood ResponsesSUGI 28: Multistage Cross-Sell Model of Employers in the Financial IndustrySUGI 28: The Use of Geographic Information Systems to Investigate Environmental Pollutants in Relationship to Medical Treatment

    Data PresentationSUGI 28: Dynamic Behavior from Static Web ApplicationsSUGI 28: SAS(r) and the Internet for ProgrammersSUGI 28: Web Communication Effectiveness: Design and Methods to Get the Best Out of ODS, SAS(r), and SAS/GRAPH(r)SUGI 28: Regulatory Overview of Using SAS/IntrNet(r) to Collect Data from Thousands of UsersSUGI 28: Using Formats and Other Techniques to Complete PROC REPORT TablesSUGI 28: Custom Map Displays Created with SAS/GRAPH(r) Procedures and the Annotate FacilitySUGI 28: What's in a Map? A Macro-driven Drill-down Geo-graphical Representation SystemSUGI 28: Working with RGB and HLS Color Coding Systems in SAS(r) SoftwareSUGI 28: SAS/IntrNet(r) and Census Mapping: How Low Would You Like to GetSUGI 28: Exporting SAS/GRAPH(r) Output: Concepts and IdeasSUGI 28: Innovative Graph for Comparing Central Tendencies and Spread at a GlanceSUGI 28: A Plot and a Table Per Page Times Hundreds in a Single PDF FileSUGI 28: Why Data _Null_ When You Can RTF Faster?SUGI 28: Business Intelligence Applications with JMP(r) SoftwareSUGI 28: ODS or DDE for Data Presentation -- A Preliminary Comparison of Output from Different SourcesSUGI 28: ODS PDF: It's Not Just for Printing Anymore!SUGI 28: It's All in the PresentationSUGI 28: ODS LAYOUT: Arranging ODS Output as You See FitSUGI 28: Creating Drill-Down Graphs Using SAS/GRAPH(r) and the Output Delivery SystemSUGI 28: Efficient Reporting with Large Numbers of Variables: A SAS(r) Method

    Data Warehousing and Enterprise SolutionsSUGI 28: Scaling SAS(r) Data Access to Oracle RDBMSSUGI 28: Using SAS(r) Strategically: A Case StudySUGI 28: Understanding SAS/Warehouse Administrator(r)SUGI 28: How to Access PC File Data Objects Directly from UNIXSUGI 28: SAS(r) in the Office -- IT WorksSUGI 28: Multi-Center Study Data Management With A Distributed ApplicationSUGI 28: Performance Tuning SAS/ACCESS(r) for DB2SUGI 28: Using Information Effectively to Make More Profitable Decisions: The Ten Letter Solution for FinanceSUGI 28: The Value of ETL and Data QualitySUGI 28: The Horror of Bad Data QualitySUGI 28: 'How Do I Love Thee? Let Me Count the Ways.' SAS(r) Software as a Part of the Corporate Information FactorySUGI 28: Finding Time: SAS(r) and Data Warehouse Solutions for Determining Last Day of the MonthSUGI 28: New Ways and Means to Summarize FilesSUGI 28: Better Decisions Through Better DataSUGI 28: Deploying Enterprise Solutions: The Business and Technical Issues Faced by SAS(r) TechnologistsSUGI 28: Ring ChartsSUGI 28: Next Generation Warehousing with Version 9SUGI 28: Why SAS(r) is the Best Place to Put Your Clinical DataSUGI 28: Transactional Records Access Clearinghouse: SAS(r) Based Warehouse and Mining Tools Keeps Tabs on U.S. Government

    Emerging TechnologiesSUGI 28: XML? We do that!SUGI 28: Extending SAS(r) Data Services via XML and JavaSUGI 28: SAS Metadata, Authorization and Management Services -- Working Together for YouSUGI 28: Future Trends and New Developments in Data ManagementSUGI 28: Flip the Bow Tie: Pushing Business Intelligence to Operational ApplicationsSUGI 28: A Successful Implementation of a Complicated Web-based Application Through webAF(tm) and SAS(r) Integration TechnologiesSUGI 28: An Integrated View of the CustomerSUGI 28: Rapid Analytic Application DeploymentSUGI 28: Managing Clinical Trials Data with a SAS-Based Web PortalSUGI 28: PROLAP -- A Programmatic Approach to Online Analytical ProcessingSUGI 28: The Use of Scripting Languages, Database Technology, and SAS/IntrNet(r) to Revolutionize the Research ProcessSUGI 28: The SUGI Survey: A Case Study of Deploying a Web-Enabled SAS(r) Application to a HandheldSUGI 28: SAS(r) Enterprise Guide(r) Future Directions -- Analytic Business Intelligence with SASSUGI 28: New Technologies for Delivering Data to Internal and External Clients

    Hands-on WorkshopsSUGI 28: Getting PC SAS(r) to Do What You Want, When You Want, How You WantSUGI 28: How SAS(r) Thinks or Why the DATA Step Does What It DoesSUGI 28: PROC DATASETS: Managing Data EfficientlySUGI 28: Managing SAS(r) Libraries to Improve Your Programming EnvironmentSUGI 28: Macro PowerSUGI 28: XML Primer for SAS(r) ProgrammersSUGI 28: Creating Dynamic Web Based ReportingSUGI 28: SAS(r) with Style: Creating Your Own ODS Style TemplateSUGI 28: So You're Still Not Using PROC REPORT. Why Not?SUGI 28: The Simplicity and Power of the TABULATE ProcedureSUGI 28: Introduction to JMP(r)SUGI 28: Making the Most of Version 9 FeaturesSUGI 28: A Gentle Introduction to SAS/GRAPH(r) Software

    PostersSUGI 28: An Approach to Displaying Predicted Survival Data Based on the Level of a Continuous CovariateSUGI 28: Accelerating the Construction of Data Entry Applications in UNIX Systems for Epidemiology and Healthcare Policy ResearchesSUGI 28: Developing SAS(r) Ready Analyzable Data Systems: A Java Web Application for Creation and Management of SAS(r) Relational DatabasesSUGI 28: Linkage of Patient Registries and Clinical Data Sets without Patient IdentifiersSUGI 28: Spectral Decomposition of Performance Variables for Dynamic System Characterization of Web ServersSUGI 28: What's in a Map? A Macro-Driven Drill-Down Geo-graphical Representation SystemSUGI 28: Analysis of Method Comparison Studies Using SAS(r)SUGI 28: P-Value Generation Simplified with a Single SAS(r) MacroSUGI 28: ODS in an Instant!SUGI 28: The Use of Formats, Concatenate, and Sum for Reporting on "Check All That Apply" VariablesSUGI 28: An Interactive Table for the Web Using SAS(r) and JavaScriptSUGI 28: Posting Project Status to the Web Through SAS(r) ProgrammingSUGI 28: Teaching Statistical Methods Courses with Case Studies and JMP(r)SUGI 28: From Data to Analysis, Results and Reports -- A Researchers Dilemma but A Programmers ChallengeSUGI 28: Filling Report Templates with the SAS(r) System and DDESUGI 28: Creating Tables or Listings with a Zero-Record SAS(r) Data Set -- Basic Program Structure and Three Simple TechniquesSUGI 28: Creating Multiple Graphs to Link from a Dynamic Map Using SAS(r) ODS, SAS/GRAPH(r), PROC GMAP, and MACROSUGI 28: Scheduling Time with SAS(r): Project Proposal ExamplesSUGI 28: Using SAS(r) Software and Visual Basic for Applications to Produce Microsoft Graph ChartsSUGI 28: Tell Them What's Important: Communication-Effective Web- and E-mail-Based Software-intelligent Enterprise Performance ReportingSUGI 28: A SAS(r) Market Basket Analysis Macro: The Poor Man's Recommendation EngineSUGI 28: Using SAS(r) to Automatically Generate Reports in Any Special FormatsSUGI 28: MVS Point-and-Click Access to IMS Data with SAS/ACCESS(r)SUGI 28: Usage Statistics for Your Web Site: Leveraging the Flexibility of SAS(r) and WebhoundSUGI 28: Applied Population Genetics Using SAS(r) SoftwareSUGI 28: PROC FORMAT Supports PROC BOXPLOT to Handle Twofold Grouped DataSUGI 28: Developing a Marketing Geographic Segmentation System Using SAS(r) SoftwareSUGI 28: 'I'll Have What She's Having' -- Serving-up MetaData to Academic Research TeamsSUGI 28: Security Control System with SAS(r) Application DispatcherSUGI 28: %MONDRIAAN: Presenting 3D Information in 2DSUGI 28: Advantages of Using a Web Based Reporting System Over Using SAS/CONNECT(r)SUGI 28: Working with RGB and HLS Color Coding Systems in SAS(r) SoftwareSUGI 28: A SAS/IML(r) Program for Mapping QTL in Line CrossesSUGI 28: An Automated Reporting Macro to Create Cell Index -- An Enhanced RevisitSUGI 28: Metadata Application on Clinical Trial Data in Drug DevelopmentSUGI 28: Enhancement of Survival Graphs

    Professional Development and User SupportSUGI 28: Practical Tips to Customize a SAS(r) SessionSUGI 28: SAS(r) Programming ConventionsSUGI 28: Programming Standards, Style Sheets, and Peer Reviews: A Practical GuideSUGI 28: SAS(r) High-speed Automated Reporting Queue (SHARQ)SUGI 28: Where to Go from Here: Learning More about SAS(r)SUGI 28: An Overview of SAS Certification and the Test Development Process SUGI 28: Ten Things I Wish I Knew Before I Became an Independent SAS(r) Software ConsultantSUGI 28: SAS-L: A Very Powerful Free Resource for SAS(r) Users WorldwideSUGI 28: Ask and Ye Shall Receive: Getting the Most from SAS-LSUGI 28: Tinker, Tailor, Soldier, Spy: The Many Roles of the SAS(r) ConsultantSUGI 28: Not All Fish Eat Worms: A SAS(r) Programmer's Guide to MS Excel and Other Fish StoriesSUGI 28: Show-and-Tell: How to Use MS Office Products to Help with SAS(r) Applications

    Statistics and Data AnalysisSUGI 28: Case Studies in Time SeriesSUGI 28: An Introduction to the Analysis of Mixed ModelsSUGI 28: Survival Analysis Using Cox Proportional Hazards Modeling for Single and Multiple Event Time DataSUGI 28: Let the Data Speak: New Regression Diagnostics Based on Cumulative ResidualsSUGI 28: Using the SAS(r) System to Construct and Operate Control Charts with Randomized Control LimitsSUGI 28: Logistic Regression Modeling -- JMPStart(tm) Your Analysis with a TreeSUGI 28: STEPWISE Methods in Using SAS(r) PROC LOGISTIC and SAS(r) Enterprise Miner(tm) for PredictionSUGI 28: An Introduction to Genomics and SAS(r) Scientific Discovery SolutionsSUGI 28: How to Use the SAS(r) System as a Powerful Tool in BiomathematicsSUGI 28: Cutpoint Determination Methods in Survival Analysis Using SAS(r)SUGI 28: Complex Sampling Designs Meet the Flaming Turkey of GlorySUGI 28: Multilevel Designs and Their AnalysesSUGI 28: Estimating Standard Errors for CLASS Variables in Generalized Linear Models Using PROC IMLSUGI 28: SAS/STAT(r) Version 9: Progressing into the FutureSUGI 28: Fast and Easy Ways to Annoy a SAS(r) Programmer: A Statistician's Revenge!SUGI 28: Application of the LOESS Procedure for Monitoring and Detecting Critical Movements in the US Automobile MarketSUGI 28: Smoothing with SAS(r) PROC MIXEDSUGI 28: Beyond PROC LIFETEST: Alternative Linear Rank Tests for Comparing Survival DistributionsSUGI 28: Estimation of Prevalence Ratios When PROC GENMOD Does Not ConvergeSUGI 28: An Alternative to PROC MI for Large SamplesSUGI 28: Known NonsenseSUGI 28: Analysis of Data from Recurrent EventsSUGI 28: Reliability, Exploratory and Confirmatory Factor Analysis for the Scale of Athletic PrioritiesSUGI 28: SAS(r) Macros and Tools for Working with Weighted Logistic Regression Models That Use Survey DataSUGI 28: Optimization with the SAS(r) System: What It Is, What's New, and Why You Should Be Using It

    Systems ArchitectureSUGI 28: Accelerating Performance of SAS(r) Applications via Rapid Extraction and MultiprocessingSUGI 28: Using a HOLAP Solution to Analyze Large Volumes of Data via the Web SUGI 28: Developing Client/Server Applications to Maximize SAS 9 Parallel CapabilitiesSUGI 28: SAS(r) Application Performance Monitoring for UNIXSUGI 28: Multi-Lingual Computing with the 9.1 SAS(r) Unicode ServerSUGI 28: An Inside Look at Version 9 and 9.1 Threaded Base SAS(r) ProceduresSUGI 28: SAS(r), Linux/UNIX and X-Windows SystemsSUGI 28: Early Experiences with SAS(r) Release 9 on an OS390 PlatformSUGI 28: SAS(r) System on Network ApplianceSUGI 28: SAS(r) Performance Optimizations on Intel ArchitectureSUGI 28: The Bleeding Edge -- The Effects of Hardware and Software Migration on the SAS(r) SystemSUGI 28: PROC MIGRATE: How to Migrate Your Data and Know You?ve Done It Right! SUGI 28: SAS 9.1 on Solaris 9 Performance and Optimization TipsSUGI 28: Using the SAS(r) V9 Application Response Measurement System to Provide Metrics to HP-UX Workload ManagerSUGI 28: A Case Study of the Tools, Techniques, and High Level Model Used to Tune AIX Version 5L for the SAS(r) System