200 likes | 410 Views
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.
E N D
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 • Hierarchy: SMQ: Standard MedDRA Query 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
Tables Used by System • PT: Preferred Term summary table • HLT: High-Level Term summary table • DME: Designated Medical Events summary table • MedCat: MedDRACategory 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 rawdata 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
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!