Flexible visualizations allow for easy exploration of clinical trial data. JMP Clinical uses many different options in Graph Builder and Tabulate to allow for dynamic views and publication-ready output. From stacked bar charts to display adverse events by severity to line graphs to show change from baseline over time to swimmer plots graphing disease response in oncology studies, JMP Clinical uses many different Graph Builder elements. Paired with most graphs is Tabulate, which displays the statistics reflected in the graph. New Tabulate features in JMP 17 such as stack, pack, and unique ID, help make these tables ready for publication. This pairing of Graph Builder and Tabulate gives users a quick way to visualize the data through a graph and then dig further into the numbers.

Hi, I'm Sam Gardner,

and I'm presenting today with Rebecca Lyzinski.

We're going to be talking about

how we use Graph Builder and Tabulate in applications

for visualizing data from clinical trials.

We have a product called JMP Clinical,

and it's a focused and specialized product for clinical trial data review.

We give users straight out of the box

functionality to do a thorough review

of clinical trials at the study site and subject level.

It is a product that's used across the pharmaceutical industry

and at several regulatory agencies across the world.

It's built on top of JMP Pro, utilizing JMP scripting language,

and it provides a user interface for data management, configuration,

and standardized reports.

We utilize data standards as part of JMP Clinical.

We utilize the CDISC study data tabulation model

and analysis data model as required input formats

for the data that you're going to visualize.

This allows us then to develop standardized tools.

In general,

if you want to develop standardized tools,

having a data standard to follow for the input data

really enables you to do that.

We use Graph Builder and Tabulate

across almost all of our reports that we have in JMP Clinical.

We want to show you how we create the graphs

that we use in JMP Clinical

so you can learn more about these important platforms,

Tabulate and Graph Builder,

and how you could use them for your analysis work

and if you wanted to make standardized reports yourself.

We're going to show you

several of the analysis reports that we have in JMP Clinical:

our adverse events distribution that utilizes Graph Builder and Tabulate,

our adverse events risk report, which uses a multipanel Graph Builder

that also utilizes virtual joins between data tables,

and it applies some data filters.

We also are going to show you our findings time trend result,

which also uses a complicated graph builder,

a column switching and virtual joins.

Then we'll finish up

by showing you an adva nced-level collection of graph builders

that we use for our patient profiles.

One of our most popular reports is the Adverse Event Distribution Report.

This report shows a bar chart at the top and a tabulate underneath it.

The bar chart has dictionary- derived term on the X- axis,

which is a way of grouping adverse events,

and planned treatment group on the Y- axis.

Each bar represents a count of the adverse events

for a given dictionary-derived term.

Underneath we have a tabulate

that is also showing dictionary-derived term,

but it also groups the adverse events by body system or organ class.

We have two different grouping variables.

The columns represent one column for each treatment group,

one for Nicardipine in the study, and another for placebo,

as well as a total column.

The ends represent counts

and the percents are the percents of subjects with an adverse event.

Down at the bottom, there's an all row,

which represents any subject that had an adverse event in the given column.

For example, we have 882 subjects in this study

that had at least one adverse event.

One of the options that JMP Clinical includes

is a way to stack the bar chart in the table.

For example, you can stack by severity or intensity.

This creates a stacked bar chart with green bars representing mild events,

yellow for moderate, and red for severe.

It also splits out the table by mild, moderate, and severe events.

In order to recreate these, we can pop out the data table.

For the graph, we go to Graph and Graph Builder.

We select our planned treatment group and put that on the group Y.

Make this a little bigger.

There are a lot of columns in this data table,

so we're going to search for dictionary-derived term

and we'll grab that and place it on the X- axis.

This is pretty close to what's on the report,

except for the ordering.

If you right-click on the X-axis and go to, Order By,

we can select Count Descending,

and now it's ordered the same way that it was in the report.

If we want to also add that stacking, we can search for severity

and drag that variable over to the overlay.

That gets us close to what we saw, but the bars are stacked side-by-side.

In order to change that, we can go to the control panel

and instead of side-by-side, select Stacked for bar style.

Now we're back to our original graph.

Next, if we want to recreate the tabulate, we go to Analyze Tabulate.

Again, select Plan Treatment Group for our columns.

This time we're going to select dictionary-derived term

and put that in the first grouping column.

But we also want to select Body System or Organ Class

and put that as a grouping column as well.

By default, they show up as two separate columns.

We're going to select both columns,

right-click and go to Stack Group and Columns.

That allows them to both be concatenated into one column.

To add to our table,

we are going to drag the little N over underneath our treatment group

so that we get our counts and the percent next to the N.

By default, these are two separate columns.

In order to create one column, we're going to first drag the sum up above

so that Tabulate knows both the N and percent are supposed to be sums.

We again select both columns and right-click.

Under Pack Columns, go to Pack.

Now we see the account and the percent in one column.

The percent has no formatting on the number of decimal places.

If we go to Change Format and go to the percent,

we can change from best to one decimal place.

Now we have a better formatted table.

One other thing that's missing is we have a group N

that we're going to stick underneath our treatment groups.

That way we can see how many subjects were in each treatment group.

You'll also notice by default

that these rows for the body system organ class are missing values.

In order to fill those in,

we're going to select Add Aggregate Statistics.

Now all our values have been filled in.

Now we just need to do a little cleanup.

Add Aggregate Statistics

adds all columns for each of our different columns.

The first step is we're going to delete some of these

just to clean it up

and we'll get rid of this all at the end.

In order to get the columns back together, we again have to drag the sum up above

and the N and percent are now back in one column.

We can also right-click on the group N and remove column label

and right-click on the sum

and we're just going to change the item label to be missing

so that it's a little cleaner.

One final thing.

You'll notice that these ends

are a little bit bigger than what was on the report.

The reason for that is automatically

the top grouping variable is a sum of all of the rows underneath it.

This is not what we want for this report

because these categories are not mutually exclusive.

A subject could have both a vasoconstriction event

and a hypertension event.

But we don't want to count them twice under vascular disorders.

We only want to count them once.

In order to do that,

we're going to grab the unique subject identifier

and drag it into the ID.

Now you'll see those numbers reduced quite a bit.

Now they represent a unique subject count

for that type of event.

One other thing to point out on this report

is that we do on this data table

have a reference by unique subject identifier to TADSL.

What that means is that the table is being virtually linked

to this TADSL table,

which allows us to filter on demographic variables

that are found in the ADSL table.

Now I'm going to hand it over to Sam so he can talk about the risk reports

and how we use virtual joins to filter those tables.

Thanks, Rebecca.

That was a really nice description of that report

and how it was put together.

I'm going to show you another report

that Rebecca is responsible for developing.

This one is our adverse event risk report.

What this report will do

is it will go through all of the reported adverse events,

and it will count the number of events by treatment group

and calculate a percent or a rate.

It displays on the graph two things.

It displays two different graphs.

On the left-hand side,

it shows the rates for each treatment group.

You can see that the color key there

shows which treatment group is being displayed there.

For pruritus,

we've got a rate of pruritus in the placebo group of 9.3%.

We have a rate of pruritus in the low-dose group of 27.381%,

and in the high-dose group of 30.92%.

Usually, what we're interested in in this case

is the difference in the rates compared to the placebo group.

What's shown on the right-hand side of the graph

is the calculation of the differences for each treatment group

and the placebo group.

There are three treatment groups, so there are two computed differences:

the high dose and the low dose compared to placebo.

We also display a confidence interval around those points.

We make this report filterable.

One thing we can do is,

let's say we only want to look at

adverse events that occur at a certain rate,

maybe higher than 5% of the time,

and we can narrow that down quite a bit and reduce it.

We also have a corresponding tabulate table

that's very similar to the tabulate that Rebecca showed earlier.

What I want to do is show you how to recreate this Graph Builder graph

because there's lots of interesting things you can do in Graph Builder

that you might not be aware of.

The first thing I'm going to do is

I'm going to open up the data tables that we use,

and we actually use three different data tables.

Let me clear this report filter selection first.

There we go.

Now I'm going to open up the data tables that we use.

The first one is the data that's u sed to actually make the plot.

We call that the risk plot table.

The second table is the term ID table,

and it's just the list of unique terms

that we want to display in the graph on the Y-axis.

Then the last table is a filter table.

It's what we use to actually filter the report.

I've got all those three open.

Let's start out by making the graph of the risks and the risk differences.

I've got a Graph Builder.

We're going to take the dictionary-derived term,

drag that onto the Y-axis.

Make this bigger.

Then we're going to take the calculation,

in this case, the variable we just labeled percent,

and we're going to put that onto the X-axis.

Then what we want to do is we want to overlay by the active treatment.

Just want to put that on there.

The next thing we want to do is we want to introduce

a little bit of customization of the way the points are presented.

You can see the points,

there's a bar here where you can control the points

and the way they're drawn.

One thing is we want to make sure that they have some jitter in them.

In this case, the jitter is set to auto,

but we can set that type of jitter that we want.

I'm going to change it to center grid.

Another thing that we want to do

is we want to change the way the points are drawn.

Under the Graph menu

that you can access through right-clicking in the graph,

I'm going to right-click, Select Graph, and go to Marker Drawing mode,

and I'm going to choose outlined.

That changes those points to have an outline, a more sharp outline,

and it really makes them stand out much more significantly.

That's this plot of the percent or the rates

of each of those adverse events.

One thing I'm also going to do

is I'm just going to add a grid line  o n the Y-axis,

which you can just look across then

so you can see where the individual points line up

and match that to the grouping level for the dictionary-d erived term.

That's for the rates.

The next thing I want to do is I want to look at the differences.

We have a risk difference variable and I'm going to drag that

and I'm going to drag that down onto the X-axis but to the right.

What it actually does is it creates another graph.

Now I have a graph of the risk differences.

I also want to put an interval around those.

What we do is we have two variables

that have the upper and lower limit for the intervals.

I'm going to select those and drag them to the interval zone.

You notice what happens when I do that.

It actually draws intervals around all the points on all the graphs

that I've added in here.

I don't want that on the points for the percent variable.

For the interval style or the error interval,

I'm going to set that to be none.

It turns those off.

Essentially what we've done is we've recreated the graph.

This is a little busy because there's lots of categories here.

We could just filter this table.

We could go here and we could select the local data filter.

Let's say we wanted to just filter on risk difference.

We could say,

let's only look when the risk difference may be greater than 3% in absolute value.

What I'm going to do is I'm going to set a limit

that it's between three and three and then invert that.

Then that reduces the number.

Maybe I want that to be a little bit more restrictive,

so make that 5, - 5 .

There we go.

That reduces the number that are selected.

But the thing is, it's kind of weird.

It only filtered the values for the risk difference

and it didn't filter the values for the percent.

It didn't filter everything the way we wanted it to.

We needed to do something a little bit different.

I'm going to clear that.

What I'm going to do is

I'm going to link this table, the left-hand table,

which is used to make the graph,

to the table of all of the unique levels that are displayed on the Y-axis,

all of the dictionary-derived terms.

The way we do that first is for the dictionary-derived term,

we have to make sure that the link ID property is set.

What that tells JMP is that if I link to this table,

this is the variable that I'm going to use

for matching to the table that I'm linking it to.

I set that to be the link ID.

Then over here for the dictionary-derived term,

what I need to do is I need to choose the link reference,

and I'm going to choose the actual table, this actual table as the link reference.

Now what's happened is these two tables are linked.

The last thing I need to do to specify this virtual linking properly

is to right-click, select Column Info,

and under the link reference property,

choose the row states that I want to broadcast

from the middle table to this linked table.

I want to accept the row states from the reference table.

I'm going to choose the selected, excluded, and hidden row states

and accept those from this center table.

Then when I do that, when I select rows in this data table,

I end up selecting rows in the corresponding link table.

If I hide and exclude those rows,

they become hidden and excluded in this plot

because I've hidden and excluded several of the rows in this linked table.

That's one level of linking.

But what we really want to do is we want to filter this graph

based on corresponding measures or metrics that are calculated in this table.

These are based on the differences and the risks

and other difference measures

between the placebo group and the treatment group.

What I'm needing to do to make that happen

is I need to link this right-hand table to the center table.

I'm going to do that as well.

I'm going to go here to the dictionary-d erived term

for the right-hand table,

and I'm going to choose the link reference

and pick that table that I want to link to,

which is this one displayed here.

Open up the column properties here, go to the link reference property.

Now what I want to do is I want to dispatch row states,

the selected, excluded, and hidden row states,

from this table to the linked table.

What I've done now is I've linked two tables together.

I have the table on the left is linked to the center table,

and there's a many-to-one relationship.

There's actually a three-to-one relationship.

For every row in the center table,

there are three rows in the left-hand table.

I've also linked the table on the left, which has a two-to-one relationship

where every row in the center table,

there are two rows in the right-hand table.

What I want to do is I want to push row states

from the right-hand table to the far left-hand table,

and having this linking between the two

and pushing row states from the right-hand table

to the center table,

and then those row states being accepted by the left-hand table

allows me to do that.

Now what I can do is I can filter on this table,

and I'll just open up the data filter,

and I'm going to choose the absolute risk difference.

I'm going to say if the absolute risk difference is large,

that those are the points that I want to display.

Now that I have everything linked up,

I can use the table that's on the left-hand side to filter the graph,

which is based on the data on the right-hand side.

If I go and open up a local data filter,

I'm going to turn on show and include as the options.

I'm going to choose absolute risk difference

because that's a good filtering criteria

just to find things that have a large absolute risk difference.

Then now notice it's filtering the table.

I'm filtering the left-hand table, pushing it through to the middle table,

which is pushing those row states through to the right-hand table.

Some clever virtual joins.

One thing we do in addition to JMP Clinical

is we use a callback function when we use our filters.

Actually, there's a way with JMP scripting

you can write a little function that will run

every time you change a data filter

and it can do some additional things

to customize the graph just a little bit more.

If you see it in our product, it does it a little bit differently,

but it looks pretty much the same as what I'm doing here.

Now, Rebecca can show you something.

One of our other most commonly used reports

is our findings time trends.

When you launch findings time trends, you'll get two graphs,

but I'm just going to focus on the first graph.

The first graph shows the mean change from baseline

for a given lab test over the course of the study,

shown by visits.

The bottom graph shows

the number of records at each visit for that lab test.

If we want to recreate this table, we can pop out our data table.

Again, we'll go to Graph and Graph Builder.

We're going to use Billy Rubin as an example.

We'll grab the Billy Rubin record and put it on our Y-axis.

We want our graph plotted by visit.

We'll grab visit and put it on the X-axis.

By default, we end up with points,

but we want to switch it over to a line graph.

Once we have our line graph,

we also want to split it out by treatment group.

Treatment group is not actually a variable in our base data set,

but it is a variable in the linked data set to TADSL.

We can go into our reference data set

and actually grab that plan treatment value

from the virtually joined one

and drag it over to our overlay.

That splits out our lines into two different treatment groups.

We also want to add intervals.

Under error interval,

instead of using auto, we'll change that to confidence interval.

Now we have a confidence interval for each of our visits

for each of our treatment groups.

We also want to add the bar graph.

We're going to grab Billy Rubin again

and this time drag it over into the bottom c orner of the Y-axis

so that we now have two separate panels.

By default,

we end up with just a duplicate of the panel we already created.

We're going to change this by right- clicking,

going to the line and change to bar.

Now we have a bar graph.

We can go ahead and remove our confidence intervals from this one

by selecting none under error interval.

We get pretty close to our final results with just these two panels.

But we also want to add points onto our top panel.

By default, we get a point for every single row in the data table.

We're going to just go over here and change our summary statistic to mean.

Now we're just going to clean up a little bit.

We can change the labels by clicking on the label

and then typing in a new one, so number of records.

On the top, we'll do the same thing

and change it to mean change from baseline.

We can also clean up our legend a little bit.

You'll see, because we have two panels

it actually show the treatment group twice,

we don't really want to see that.

We can go to the red triangle, go to Legend Settings,

and we'll just unclick a couple of these

so that we only see the treatment groups once.

We're back to our panel that we created in the report

and we can add our column switcher.

If you go to the red triangle and go to Redo Column Switcher,

we can change out the Billy Rubin record.

We want to change the lab test that's being shown on the Y-axis.

This dataset has a bunch of different lab tests

from alkaline phosphatase

all the way down to partial pressure oxygen.

We're just going to select all those lab tests and click OK.

Now we have a column switcher

and you can actually select each lab test

and you'll see that the graph changes to show you the lab test that's selected.

Now I'm going to hand it back to Sam

so that he can show some more complicated graphing

using patient profiles.

Thanks, Rebecca.

Just to wrap up here,

I want to show you a more advanced collection of graphs that we use

called our patient profile.

This is a way just to visualize everything that happens to a subject

in a clinical trial that's been recorded in the data.

We collect things like when did they do their study visits

and what day did that happen and what study day?

What were the disposition events that they had, the exposure they had?

Did they have adverse events

and what was the duration of the adverse events?

When did they take medications during the trial?

Vital signs that were recorded

or test results that were recorded can also be displayed.

We have a lot of ability to customize this and configure it.

This is all scripted, so I can't really show you,

"How would I build all this just with the graphical user interface and JMP?"

You need to know a little bit of JMP scripting.

But in reality,

each one of these graphs is just a graph builder

that have been put together on top of each other

and then a little bit of editing of the report layer

to remove some of the controls.

That's really what's happened.

We've also added some custom, like the legend here is a custom graphic

that we add in to display,

and it's just an image that displays in the report window.

But really, all of this is just Graph Builder for the most part.

We can switch between patients here

and look at the profile of each different patient in the trial

as we would want to.

I hope you've been able to see during this presentation

just some of the ways you can use Graph Builder and Tabulate

to summarize your data.

More than just the standard,

I did a few clicks and this is the result I get.

With a little bit of extra knowledge of how to customize the output

for the graphs and the tables that you have displayed,

you can actually get some very nice-looking output

that you can use for presentation within JMP

and even for reporting.

Some of this that we've used has been driven by regulatory guidelines

that say they would like to see tables and graphs look this way.

We've been able to achieve that using some of these features

like stacking and packing columns, and tabulate,

having multipanel displays,

doing the filtering in a unique way, and using column- switching,

to make it not just a reporting tool, but an interactive tool as well.

Thanks for your attention,

and we are happy to hear any feedback you've got

or questions about the product

or about what we've shown you in this presentation.

Published on ‎03-25-2024 04:55 PM by Staff | Updated on ‎07-07-2025 12:10 PM

Flexible visualizations allow for easy exploration of clinical trial data. JMP Clinical uses many different options in Graph Builder and Tabulate to allow for dynamic views and publication-ready output. From stacked bar charts to display adverse events by severity to line graphs to show change from baseline over time to swimmer plots graphing disease response in oncology studies, JMP Clinical uses many different Graph Builder elements. Paired with most graphs is Tabulate, which displays the statistics reflected in the graph. New Tabulate features in JMP 17 such as stack, pack, and unique ID, help make these tables ready for publication. This pairing of Graph Builder and Tabulate gives users a quick way to visualize the data through a graph and then dig further into the numbers.

Hi, I'm Sam Gardner,

and I'm presenting today with Rebecca Lyzinski.

We're going to be talking about

how we use Graph Builder and Tabulate in applications

for visualizing data from clinical trials.

We have a product called JMP Clinical,

and it's a focused and specialized product for clinical trial data review.

We give users straight out of the box

functionality to do a thorough review

of clinical trials at the study site and subject level.

It is a product that's used across the pharmaceutical industry

and at several regulatory agencies across the world.

It's built on top of JMP Pro, utilizing JMP scripting language,

and it provides a user interface for data management, configuration,

and standardized reports.

We utilize data standards as part of JMP Clinical.

We utilize the CDISC study data tabulation model

and analysis data model as required input formats

for the data that you're going to visualize.

This allows us then to develop standardized tools.

In general,

if you want to develop standardized tools,

having a data standard to follow for the input data

really enables you to do that.

We use Graph Builder and Tabulate

across almost all of our reports that we have in JMP Clinical.

We want to show you how we create the graphs

that we use in JMP Clinical

so you can learn more about these important platforms,

Tabulate and Graph Builder,

and how you could use them for your analysis work

and if you wanted to make standardized reports yourself.

We're going to show you

several of the analysis reports that we have in JMP Clinical:

our adverse events distribution that utilizes Graph Builder and Tabulate,

our adverse events risk report, which uses a multipanel Graph Builder

that also utilizes virtual joins between data tables,

and it applies some data filters.

We also are going to show you our findings time trend result,

which also uses a complicated graph builder,

a column switching and virtual joins.

Then we'll finish up

by showing you an adva nced-level collection of graph builders

that we use for our patient profiles.

One of our most popular reports is the Adverse Event Distribution Report.

This report shows a bar chart at the top and a tabulate underneath it.

The bar chart has dictionary- derived term on the X- axis,

which is a way of grouping adverse events,

and planned treatment group on the Y- axis.

Each bar represents a count of the adverse events

for a given dictionary-derived term.

Underneath we have a tabulate

that is also showing dictionary-derived term,

but it also groups the adverse events by body system or organ class.

We have two different grouping variables.

The columns represent one column for each treatment group,

one for Nicardipine in the study, and another for placebo,

as well as a total column.

The ends represent counts

and the percents are the percents of subjects with an adverse event.

Down at the bottom, there's an all row,

which represents any subject that had an adverse event in the given column.

For example, we have 882 subjects in this study

that had at least one adverse event.

One of the options that JMP Clinical includes

is a way to stack the bar chart in the table.

For example, you can stack by severity or intensity.

This creates a stacked bar chart with green bars representing mild events,

yellow for moderate, and red for severe.

It also splits out the table by mild, moderate, and severe events.

In order to recreate these, we can pop out the data table.

For the graph, we go to Graph and Graph Builder.

We select our planned treatment group and put that on the group Y.

Make this a little bigger.

There are a lot of columns in this data table,

so we're going to search for dictionary-derived term

and we'll grab that and place it on the X- axis.

This is pretty close to what's on the report,

except for the ordering.

If you right-click on the X-axis and go to, Order By,

we can select Count Descending,

and now it's ordered the same way that it was in the report.

If we want to also add that stacking, we can search for severity

and drag that variable over to the overlay.

That gets us close to what we saw, but the bars are stacked side-by-side.

In order to change that, we can go to the control panel

and instead of side-by-side, select Stacked for bar style.

Now we're back to our original graph.

Next, if we want to recreate the tabulate, we go to Analyze Tabulate.

Again, select Plan Treatment Group for our columns.

This time we're going to select dictionary-derived term

and put that in the first grouping column.

But we also want to select Body System or Organ Class

and put that as a grouping column as well.

By default, they show up as two separate columns.

We're going to select both columns,

right-click and go to Stack Group and Columns.

That allows them to both be concatenated into one column.

To add to our table,

we are going to drag the little N over underneath our treatment group

so that we get our counts and the percent next to the N.

By default, these are two separate columns.

In order to create one column, we're going to first drag the sum up above

so that Tabulate knows both the N and percent are supposed to be sums.

We again select both columns and right-click.

Under Pack Columns, go to Pack.

Now we see the account and the percent in one column.

The percent has no formatting on the number of decimal places.

If we go to Change Format and go to the percent,

we can change from best to one decimal place.

Now we have a better formatted table.

One other thing that's missing is we have a group N

that we're going to stick underneath our treatment groups.

That way we can see how many subjects were in each treatment group.

You'll also notice by default

that these rows for the body system organ class are missing values.

In order to fill those in,

we're going to select Add Aggregate Statistics.

Now all our values have been filled in.

Now we just need to do a little cleanup.

Add Aggregate Statistics

adds all columns for each of our different columns.

The first step is we're going to delete some of these

just to clean it up

and we'll get rid of this all at the end.

In order to get the columns back together, we again have to drag the sum up above

and the N and percent are now back in one column.

We can also right-click on the group N and remove column label

and right-click on the sum

and we're just going to change the item label to be missing

so that it's a little cleaner.

One final thing.

You'll notice that these ends

are a little bit bigger than what was on the report.

The reason for that is automatically

the top grouping variable is a sum of all of the rows underneath it.

This is not what we want for this report

because these categories are not mutually exclusive.

A subject could have both a vasoconstriction event

and a hypertension event.

But we don't want to count them twice under vascular disorders.

We only want to count them once.

In order to do that,

we're going to grab the unique subject identifier

and drag it into the ID.

Now you'll see those numbers reduced quite a bit.

Now they represent a unique subject count

for that type of event.

One other thing to point out on this report

is that we do on this data table

have a reference by unique subject identifier to TADSL.

What that means is that the table is being virtually linked

to this TADSL table,

which allows us to filter on demographic variables

that are found in the ADSL table.

Now I'm going to hand it over to Sam so he can talk about the risk reports

and how we use virtual joins to filter those tables.

Thanks, Rebecca.

That was a really nice description of that report

and how it was put together.

I'm going to show you another report

that Rebecca is responsible for developing.

This one is our adverse event risk report.

What this report will do

is it will go through all of the reported adverse events,

and it will count the number of events by treatment group

and calculate a percent or a rate.

It displays on the graph two things.

It displays two different graphs.

On the left-hand side,

it shows the rates for each treatment group.

You can see that the color key there

shows which treatment group is being displayed there.

For pruritus,

we've got a rate of pruritus in the placebo group of 9.3%.

We have a rate of pruritus in the low-dose group of 27.381%,

and in the high-dose group of 30.92%.

Usually, what we're interested in in this case

is the difference in the rates compared to the placebo group.

What's shown on the right-hand side of the graph

is the calculation of the differences for each treatment group

and the placebo group.

There are three treatment groups, so there are two computed differences:

the high dose and the low dose compared to placebo.

We also display a confidence interval around those points.

We make this report filterable.

One thing we can do is,

let's say we only want to look at

adverse events that occur at a certain rate,

maybe higher than 5% of the time,

and we can narrow that down quite a bit and reduce it.

We also have a corresponding tabulate table

that's very similar to the tabulate that Rebecca showed earlier.

What I want to do is show you how to recreate this Graph Builder graph

because there's lots of interesting things you can do in Graph Builder

that you might not be aware of.

The first thing I'm going to do is

I'm going to open up the data tables that we use,

and we actually use three different data tables.

Let me clear this report filter selection first.

There we go.

Now I'm going to open up the data tables that we use.

The first one is the data that's u sed to actually make the plot.

We call that the risk plot table.

The second table is the term ID table,

and it's just the list of unique terms

that we want to display in the graph on the Y-axis.

Then the last table is a filter table.

It's what we use to actually filter the report.

I've got all those three open.

Let's start out by making the graph of the risks and the risk differences.

I've got a Graph Builder.

We're going to take the dictionary-derived term,

drag that onto the Y-axis.

Make this bigger.

Then we're going to take the calculation,

in this case, the variable we just labeled percent,

and we're going to put that onto the X-axis.

Then what we want to do is we want to overlay by the active treatment.

Just want to put that on there.

The next thing we want to do is we want to introduce

a little bit of customization of the way the points are presented.

You can see the points,

there's a bar here where you can control the points

and the way they're drawn.

One thing is we want to make sure that they have some jitter in them.

In this case, the jitter is set to auto,

but we can set that type of jitter that we want.

I'm going to change it to center grid.

Another thing that we want to do

is we want to change the way the points are drawn.

Under the Graph menu

that you can access through right-clicking in the graph,

I'm going to right-click, Select Graph, and go to Marker Drawing mode,

and I'm going to choose outlined.

That changes those points to have an outline, a more sharp outline,

and it really makes them stand out much more significantly.

That's this plot of the percent or the rates

of each of those adverse events.

One thing I'm also going to do

is I'm just going to add a grid line  o n the Y-axis,

which you can just look across then

so you can see where the individual points line up

and match that to the grouping level for the dictionary-d erived term.

That's for the rates.

The next thing I want to do is I want to look at the differences.

We have a risk difference variable and I'm going to drag that

and I'm going to drag that down onto the X-axis but to the right.

What it actually does is it creates another graph.

Now I have a graph of the risk differences.

I also want to put an interval around those.

What we do is we have two variables

that have the upper and lower limit for the intervals.

I'm going to select those and drag them to the interval zone.

You notice what happens when I do that.

It actually draws intervals around all the points on all the graphs

that I've added in here.

I don't want that on the points for the percent variable.

For the interval style or the error interval,

I'm going to set that to be none.

It turns those off.

Essentially what we've done is we've recreated the graph.

This is a little busy because there's lots of categories here.

We could just filter this table.

We could go here and we could select the local data filter.

Let's say we wanted to just filter on risk difference.

We could say,

let's only look when the risk difference may be greater than 3% in absolute value.

What I'm going to do is I'm going to set a limit

that it's between three and three and then invert that.

Then that reduces the number.

Maybe I want that to be a little bit more restrictive,

so make that 5, - 5 .

There we go.

That reduces the number that are selected.

But the thing is, it's kind of weird.

It only filtered the values for the risk difference

and it didn't filter the values for the percent.

It didn't filter everything the way we wanted it to.

We needed to do something a little bit different.

I'm going to clear that.

What I'm going to do is

I'm going to link this table, the left-hand table,

which is used to make the graph,

to the table of all of the unique levels that are displayed on the Y-axis,

all of the dictionary-derived terms.

The way we do that first is for the dictionary-derived term,

we have to make sure that the link ID property is set.

What that tells JMP is that if I link to this table,

this is the variable that I'm going to use

for matching to the table that I'm linking it to.

I set that to be the link ID.

Then over here for the dictionary-derived term,

what I need to do is I need to choose the link reference,

and I'm going to choose the actual table, this actual table as the link reference.

Now what's happened is these two tables are linked.

The last thing I need to do to specify this virtual linking properly

is to right-click, select Column Info,

and under the link reference property,

choose the row states that I want to broadcast

from the middle table to this linked table.

I want to accept the row states from the reference table.

I'm going to choose the selected, excluded, and hidden row states

and accept those from this center table.

Then when I do that, when I select rows in this data table,

I end up selecting rows in the corresponding link table.

If I hide and exclude those rows,

they become hidden and excluded in this plot

because I've hidden and excluded several of the rows in this linked table.

That's one level of linking.

But what we really want to do is we want to filter this graph

based on corresponding measures or metrics that are calculated in this table.

These are based on the differences and the risks

and other difference measures

between the placebo group and the treatment group.

What I'm needing to do to make that happen

is I need to link this right-hand table to the center table.

I'm going to do that as well.

I'm going to go here to the dictionary-d erived term

for the right-hand table,

and I'm going to choose the link reference

and pick that table that I want to link to,

which is this one displayed here.

Open up the column properties here, go to the link reference property.

Now what I want to do is I want to dispatch row states,

the selected, excluded, and hidden row states,

from this table to the linked table.

What I've done now is I've linked two tables together.

I have the table on the left is linked to the center table,

and there's a many-to-one relationship.

There's actually a three-to-one relationship.

For every row in the center table,

there are three rows in the left-hand table.

I've also linked the table on the left, which has a two-to-one relationship

where every row in the center table,

there are two rows in the right-hand table.

What I want to do is I want to push row states

from the right-hand table to the far left-hand table,

and having this linking between the two

and pushing row states from the right-hand table

to the center table,

and then those row states being accepted by the left-hand table

allows me to do that.

Now what I can do is I can filter on this table,

and I'll just open up the data filter,

and I'm going to choose the absolute risk difference.

I'm going to say if the absolute risk difference is large,

that those are the points that I want to display.

Now that I have everything linked up,

I can use the table that's on the left-hand side to filter the graph,

which is based on the data on the right-hand side.

If I go and open up a local data filter,

I'm going to turn on show and include as the options.

I'm going to choose absolute risk difference

because that's a good filtering criteria

just to find things that have a large absolute risk difference.

Then now notice it's filtering the table.

I'm filtering the left-hand table, pushing it through to the middle table,

which is pushing those row states through to the right-hand table.

Some clever virtual joins.

One thing we do in addition to JMP Clinical

is we use a callback function when we use our filters.

Actually, there's a way with JMP scripting

you can write a little function that will run

every time you change a data filter

and it can do some additional things

to customize the graph just a little bit more.

If you see it in our product, it does it a little bit differently,

but it looks pretty much the same as what I'm doing here.

Now, Rebecca can show you something.

One of our other most commonly used reports

is our findings time trends.

When you launch findings time trends, you'll get two graphs,

but I'm just going to focus on the first graph.

The first graph shows the mean change from baseline

for a given lab test over the course of the study,

shown by visits.

The bottom graph shows

the number of records at each visit for that lab test.

If we want to recreate this table, we can pop out our data table.

Again, we'll go to Graph and Graph Builder.

We're going to use Billy Rubin as an example.

We'll grab the Billy Rubin record and put it on our Y-axis.

We want our graph plotted by visit.

We'll grab visit and put it on the X-axis.

By default, we end up with points,

but we want to switch it over to a line graph.

Once we have our line graph,

we also want to split it out by treatment group.

Treatment group is not actually a variable in our base data set,

but it is a variable in the linked data set to TADSL.

We can go into our reference data set

and actually grab that plan treatment value

from the virtually joined one

and drag it over to our overlay.

That splits out our lines into two different treatment groups.

We also want to add intervals.

Under error interval,

instead of using auto, we'll change that to confidence interval.

Now we have a confidence interval for each of our visits

for each of our treatment groups.

We also want to add the bar graph.

We're going to grab Billy Rubin again

and this time drag it over into the bottom c orner of the Y-axis

so that we now have two separate panels.

By default,

we end up with just a duplicate of the panel we already created.

We're going to change this by right- clicking,

going to the line and change to bar.

Now we have a bar graph.

We can go ahead and remove our confidence intervals from this one

by selecting none under error interval.

We get pretty close to our final results with just these two panels.

But we also want to add points onto our top panel.

By default, we get a point for every single row in the data table.

We're going to just go over here and change our summary statistic to mean.

Now we're just going to clean up a little bit.

We can change the labels by clicking on the label

and then typing in a new one, so number of records.

On the top, we'll do the same thing

and change it to mean change from baseline.

We can also clean up our legend a little bit.

You'll see, because we have two panels

it actually show the treatment group twice,

we don't really want to see that.

We can go to the red triangle, go to Legend Settings,

and we'll just unclick a couple of these

so that we only see the treatment groups once.

We're back to our panel that we created in the report

and we can add our column switcher.

If you go to the red triangle and go to Redo Column Switcher,

we can change out the Billy Rubin record.

We want to change the lab test that's being shown on the Y-axis.

This dataset has a bunch of different lab tests

from alkaline phosphatase

all the way down to partial pressure oxygen.

We're just going to select all those lab tests and click OK.

Now we have a column switcher

and you can actually select each lab test

and you'll see that the graph changes to show you the lab test that's selected.

Now I'm going to hand it back to Sam

so that he can show some more complicated graphing

using patient profiles.

Thanks, Rebecca.

Just to wrap up here,

I want to show you a more advanced collection of graphs that we use

called our patient profile.

This is a way just to visualize everything that happens to a subject

in a clinical trial that's been recorded in the data.

We collect things like when did they do their study visits

and what day did that happen and what study day?

What were the disposition events that they had, the exposure they had?

Did they have adverse events

and what was the duration of the adverse events?

When did they take medications during the trial?

Vital signs that were recorded

or test results that were recorded can also be displayed.

We have a lot of ability to customize this and configure it.

This is all scripted, so I can't really show you,

"How would I build all this just with the graphical user interface and JMP?"

You need to know a little bit of JMP scripting.

But in reality,

each one of these graphs is just a graph builder

that have been put together on top of each other

and then a little bit of editing of the report layer

to remove some of the controls.

That's really what's happened.

We've also added some custom, like the legend here is a custom graphic

that we add in to display,

and it's just an image that displays in the report window.

But really, all of this is just Graph Builder for the most part.

We can switch between patients here

and look at the profile of each different patient in the trial

as we would want to.

I hope you've been able to see during this presentation

just some of the ways you can use Graph Builder and Tabulate

to summarize your data.

More than just the standard,

I did a few clicks and this is the result I get.

With a little bit of extra knowledge of how to customize the output

for the graphs and the tables that you have displayed,

you can actually get some very nice-looking output

that you can use for presentation within JMP

and even for reporting.

Some of this that we've used has been driven by regulatory guidelines

that say they would like to see tables and graphs look this way.

We've been able to achieve that using some of these features

like stacking and packing columns, and tabulate,

having multipanel displays,

doing the filtering in a unique way, and using column- switching,

to make it not just a reporting tool, but an interactive tool as well.

Thanks for your attention,

and we are happy to hear any feedback you've got

or questions about the product

or about what we've shown you in this presentation.



0 Kudos