A System for Analyzing Drug Safety Data Using JMP® JMP Discovery 2011 Conference September 14, 2011 Peter Mroz Manager, Statistical Programmer Methods and Analysis J&J Pharmaceutical Development, LLC, United States The views expressed are my own and do not necessarily represent the views of J&J or any of its operating companies. This presentation is not meant to endorse any product or company including the conference organization. Introduction • JMP® 9-based system analyzes drug safety data. • Uses enhanced and easy to understand data manipulation and visualization techniques • Allows medically trained personnel to explore safety data and identify adverse events of interest for a given drug. • New features in JMP 9 provided significant advantages – Add-ins for menus and application distribution – Cell colorization – Separate windows for each object. • Advantages of using JMP – – – – – – Computational speed Interactivity Linking between objects Drill-down to underlying data Data filtering Ability to create user-friendly interfaces. System Overview: • Investigates adverse events for a drug • Input data filtered by user to focus on area of interest • Disproportionality analysis compares Reporting Fraction (RF) of events in different periods Current RF = # Current Events for one PT / Total Current Cases Previous RF = # Previous Events for one PT / Total Previous Cases FRR = Current RF / Previous RF • Users define MedDRA coding dictionary categories to group data • Drill-down to underlying data Launch safety application for a selected case Retrieve additional case information for selected cases from safety application • Visualization via barcharts, trend plots and heat map grid MedDRA Coding Dictionary • MedDRA - Medical Dictionary for Regulatory Activities • Standardizes medical terminology used to classify adverse event information SMQ: Standard MedDRA Query • Hierarchy: SMQs are groupings of terms that relate to a defined medical condition or area of interest SOC: System Organ Class HLGT: High Level Group Term HLT: High Level Term PT: Preferred Term LLT: Low Level Term Partial Sample MedDRA Hierarchy for PT=HEADACHE Verbatim Term LLT Name PT Name HLT Name HLGT Name SOC Name SEVERE PALPITATIONS IN THE HEAD HEAD THROBBING HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS FEELING OF FULLNESS IN HEAD FULLNESS HEAD HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS SEVERE HEAD PRESSURE HEAD PRESSURE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS FUZZY HEADACHE HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS TEMPOROMANDIBULAR JOINT HEADACHE TEMPORAL HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS EPISODES OF HEADACHE PRIOR TO REACHING ORGASM HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS PRE-EXITING HEAD PAIN HEAD PAIN HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS NITROGLYCERIN INDUCED HEADACHE DRUG-INDUCED HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS PAIN IN BRAIN PAIN HEAD HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS RELAPSED PAIN IN BRAIN PAIN HEAD HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS ELECTRICAL SHOOTING PAINS IN HER HEAD HEAD PAIN HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS OCCASIONAL BREAKTHROUGH HEADACHE INTERMITTENT HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS INTERMITTENT PAIN IN FOREHEAD FOREHEAD HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS HEADACHE PAROXYSMAL HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS UNABLE TO LAY ON LEFT SIDE OF HEAD DUE TO HEAD PAIN HEAD PAIN HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS ORTHOSTATIC POSITIONAL HEADACHE HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS FRONTOTEMPORAL BILATERAL CEPHALEA CEPHALGIA HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS PRESSURE HEADACHE THAT WAS WORSE THAN A MIGRAINE HEAD PRESSURE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS CHRONIC HEADACHE WITH SUPERIMPOSED MIGRAINES CHRONIC HEADACHES HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS ICE PICK HEADACHE ICE PICK HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS INCREASE IN BREAKTHROUGH HEADACHE HEADACHE AGGRAVATED HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS SEVERE BASAL HEADACHE HEADACHE HEADACHE HEADACHES NEC HEADACHES NERVOUS SYSTEM DISORDERS Tables Used by System • • • • PT: Preferred Term summary table HLT: High-Level Term summary table DME: Designated Medical Events summary table MedCat: MedDRA Category summary table for user-defined MedDRA coding dictionary groupings • Cell colorization used to distinguish time periods, subtotals, trends • Summary tables linked to main table by special JSL code Tables Used by System (cont) Main data table PT-level summary table HLT-level summary table DME-level summary table Custom MedDRA-level summary table Table Cell Acts Like a Hyperlink • • • Users click on a single cell in the Case Number column. Safety application is launched for that Case Number A column formula does the work: surv_col_names = surv_dataset << get column names(string); if (!contains(surv_col_names, "Select Logic"), // then surv_dataset << new column("Select Logic", character, formula( // Need the table names inside the formula, esp for JMP 9 because of scoping dst = current data table(); If (Selected(), sel_cols = dst << get selected columns; sel_rows = dst << get selected rows; if (islist(sel_cols), // then if (nitems(sel_cols) == 1 & nrows(sel_rows) == 1 & uppercase(char(sel_cols[1])) == "CASE NUMBER", // then one_case_no = column(dst, "Case Number")[sel_rows[1]]; myapp_url = "http://myapp.com/abcde/caseno=" || char(one_case_no); web(myapp_url); // Launches web browser for URL ); // end 1 col, 1 row, AER col // end islist ); // end if selected "x"; // Need a dummy value for the column ); // end forumula ); // end new column column(surv_dataset, "Select Logic") << hide; // Move the cursor to the first cell surv_dataset << go to row(1) << Clear Select << go to(:Case Number) << clear column selection; ); // end if Select Logic column ); Link Two Tables Not Normally Linked • Summary tables derived from original dataset, but not linked • SDF dataset Tabulations + Calculated Columns PT Summary Table • Clicking rows in PT summary table highlights all rows in main dataset containing selected PTs • Clicking cells in Current, Previous, Cumulative column sections highlights rows in main dataset for PT + corresponding time period. Link Two Tables Not Normally Linked (part 1) /* File Name: Surveillance Cross Highlight.JSL Description: Adds a formula to the tabulated data to link it back to the raw data table */ pt_col_names = surv_tab_dt << get column names(string); if (!contains(pt_col_names, "Select Logic"), // then surv_tab_dt << new column("Select Logic", character, formula( // Need the table names inside the formula, esp for JMP 9 because of scoping dt = Data Table( ::surv_name ); dtab = Data Table( ::surv_name || " PT Worksheet" ); If (Selected(), selected_cols = dtab << get selected columns; selected_rows = dtab << get selected rows; // Only perform the actions for the first selected row – // the other rows are in the selected_rows list if (row() == selected_rows[1], // then // Put all selected PT values into a list ptx_list = column(dtab, "PT")[selected_rows]; Link Two Tables Not Normally Linked (part 2) where_list = {}; // If no columns selected, JMP v8 returns Scriptable[], JMP v9 returns a list {} if (islist(selected_cols) & nitems(selected_cols) > 0, // then columns have been selected for (k = 1, k <= nitems(selected_cols), k++, one_col = char(selected_cols[k]); //-------------------------------------------------------------------------------// Current column selected if (one_col == "Curr Case Count" | one_col == "Curr %", insertinto(where_list, "(:Time Period == \!"Current\!")"); ); // end if Curr if (one_col == "Curr Serious" | one_col == "Curr % Serious", insertinto(where_list, "(:Time Period == \!"Current\!" " || " & :Serious == \!"Y\!")"); ); // end if Curr Serious if (one_col == "Curr Label" | one_col == "Curr % Label", insertinto(where_list, "(:Time Period == \!"Current\!" " || " & :Labeled == \!"Y\!")"); ); // end if Curr labeled //-------------------------------------------------------------------------------// Similar logic for Previous and Cumulative column selections ); // end loop over selected columns ); // end if columns selected Link Two Tables Not Normally Linked (part 3) //-------------------------------------------------------------------------------- // OK we've figured out PTs that were selected and put any // column selections into where_list. Build a complete // where clause and execute it select_expr = "dt << select where(contains(ptx_list, :PT Name)"; if (nitems(where_list) > 0, // then // Convert list to a delimited string where_clause = concat items(where_list, " | "); select_expr = select_expr || " & (" || where_clause || "))"; // else , select_expr = select_expr || ")"; ); // Finally perform the select eval(parse(select_expr)); ); // end if this is the first selected row ); // end if selected() "x"; // return a value - you get an error message without this. ); // end formula definition ); // new column ); // end if column exists // Hide this new column :Select Logic << hide; // end Surveillance Cross Highlight V3.JSL MedDRA Category Builder • Allow users to define drug-specific grouping of data • MedDRA categories defined by different MedDRA levels: SOC, HLGT, HLT, PT, SMQ • Picklists are loaded from Oracle database • Summary table created for custom categories • Can trend on custom categories MedDRA Category Builder (cont) Heat Map Grid Plot • • • • Shows all PT/HLT values for entire time period One PT/HLT per cell Horizontal axis within cell shows time Color indicates height of PT/HLT count or reporting fraction • Idea from last year’s Discovery conference! Heat Map Grid Plot (cont) • Click on cell of interest • Click Trend Chart Button Heat Map Grid Plot (trend chart) • Trend chart created for Neutropenias HLT Trend Chart • Users can plot trends of PT, HLT, DME, MedCAT values • Y axis can be Case Count or Reporting Percentage • X axis can be Month, Quarter or Year Trend Chart (cont) • Trend chart showing 3 MedDRA Categories by month Conclusions • JMP has powerful data manipulation and visualization abilities • With some JSL scripting it is possible to make JMP jump!