Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

- JMP User Community
- :
- Discussions
- :
- JSL for evaluating tolerance interval USL and LSL after calculation

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

Highlighted

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

Aug 17, 2018 2:01 AM
(5463 views)

Hi,

So I want to write a script that will calculate a tolerance interval with 99% coverage, alpha = 0.95, on a column of data.

Once it has done this I want to access/evaluate the USL and LSL to be used for hiding/excluding values that fall outside those limits.

The reason I am doing this is I have two columns of data that I have stacked together, and I want to produce side by side box plots.

But when I produce them there are major outliers in the box plots that cause the axes to be scaled poorly. There are only ever going to be a handful of these major outliers so there is no issue with me just getting rid of them

I'm pretty new to JMP so any help is appreciated. If you think there is a better/easier way of achieving this that would also be great.

2 ACCEPTED SOLUTIONS

Accepted Solutions

Highlighted

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

OK Danny. Sometimes you can get the required values directly, and sometimes you need to access the report layer to get them (try 'Help > Books > Scripting Guide').

This code should get you started:

```
NamesDefaultToHere(1);
// Do the Distribution
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dist = dt << Distribution( Column( :Height ) );
// Add tolerance intervals (search for the latter using 'Help > Scripting Guide')
dist << Tolerance Interval(Alpha( 0.95 ), Proportion( 0.85 ));
// Get the report layer
distRep = dist << Report;
// Dig out the required values (do 'Show Tree Structure' to see how the report is made up)
lt = distRep[NumberColBox(5)] << get;
ut = distRep[NumberColBox(6)] << get;
// Set extreme values to missing
vals = Column(dt, "Height") << getValues;
vals[Loc(vals < lt[1] | vals > ut[1] )] = .;
Column(dt, "Height") << setValues(vals);
```

Highlighted

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

Ian is faster than I. Below is a script for the stacked data.

As Ian was alluding, you need to learn more JSL for selecting and getting values from tables and reports. To be prepared for your next script you should read the Help> Books> Scripting Guide chapters "Scripting Platforms" and "Display Trees". This will help you understand the nested structure of JMP reports and learn the syntax to navigate, reference and get.

Note that Ian's script empties values. This script maintains their values them, but excludes them from the analyses.

```
Names default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_stck = dt << Stack(
columns( :height, :weight ),
Source Label Column( "Var" ),
Stacked Data Column( "Data" )
);
close(dt,NoSave);
obj = Distribution( Column( :Data ), By(:Var) );
//using a lower proportion, .80, to screen something
obj << Tolerance Interval( Alpha( 0.95 ), Proportion( 0.8 ) );
tol_dt = report(obj[1])[OutlineBox(2)]["Tolerance Intervals"][TableBox(1)]<<Make Combined Data Table;
tol_dt << set Name("Tolerance Intervals");
for(i=1, i<=nrow(tol_dt), i++,
str = tol_dt:Var[i];
vlo = tol_dt:Lower TI[i];
vhi = tol_dt:Upper TI[i];
dt_stck << select where(:Var==str & (:Data < vlo | :Data > vhi) ) << hide and exclude(1);
dt_stck << clear select;
);
nw = New Window("Custom Display",
VListBox(
onew = dt_stck << Oneway( Y(:Data), X(:Var)),
text box(),
dbb = tol_dt <<New Data Box()
)
);
dbb << close side panels;
dbb << set max size(410,240);
nw << journal window;
```

7 REPLIES 7

Highlighted
##

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

Re: JSL for evaluating tolerance interval USL and LSL after calculation

Are the tolerance limits and spec limits different?

Highlighted
##

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

Re: JSL for evaluating tolerance interval USL and LSL after calculation

No I want to use the tolerance limits as spec limits.

Highlighted
##

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

Re: JSL for evaluating tolerance interval USL and LSL after calculation

Even if you want to script something it's good to do it by hand once, especially since JMP will often generate code that you can use.

With that in mind, take a look here to see how to get the Tolerance Intervals via 'Analyze > Distribution'. Once you have these values, you could, for instance, use 'Rows > Row Selection > Select Where . . .', followed by 'Rows > Delete Rows'.

Highlighted
##

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

Re: JSL for evaluating tolerance interval USL and LSL after calculation

Hi Ian, thank you for the reply. I know how to write the script that will generate the distribution report and calculate the tolerance interval. Its the next part that I am stuck on. When I get JMP to generate a script for the tolerance interval this is what it gives me:

Distribution( Continuous Distribution( Column( :Data ), Tolerance Interval( Alpha( 0.95 ), Proportion( 0.99 ) ) ) )

So you can see, at this point in my script I do not know my USL and LSL. I need my script to somehow read what the USL/LSL of the tolerance interval that it has just calculated are and then exclude/delete rows accordingly.

Highlighted

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

OK Danny. Sometimes you can get the required values directly, and sometimes you need to access the report layer to get them (try 'Help > Books > Scripting Guide').

This code should get you started:

```
NamesDefaultToHere(1);
// Do the Distribution
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dist = dt << Distribution( Column( :Height ) );
// Add tolerance intervals (search for the latter using 'Help > Scripting Guide')
dist << Tolerance Interval(Alpha( 0.95 ), Proportion( 0.85 ));
// Get the report layer
distRep = dist << Report;
// Dig out the required values (do 'Show Tree Structure' to see how the report is made up)
lt = distRep[NumberColBox(5)] << get;
ut = distRep[NumberColBox(6)] << get;
// Set extreme values to missing
vals = Column(dt, "Height") << getValues;
vals[Loc(vals < lt[1] | vals > ut[1] )] = .;
Column(dt, "Height") << setValues(vals);
```

Highlighted

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

Ian is faster than I. Below is a script for the stacked data.

As Ian was alluding, you need to learn more JSL for selecting and getting values from tables and reports. To be prepared for your next script you should read the Help> Books> Scripting Guide chapters "Scripting Platforms" and "Display Trees". This will help you understand the nested structure of JMP reports and learn the syntax to navigate, reference and get.

Note that Ian's script empties values. This script maintains their values them, but excludes them from the analyses.

```
Names default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_stck = dt << Stack(
columns( :height, :weight ),
Source Label Column( "Var" ),
Stacked Data Column( "Data" )
);
close(dt,NoSave);
obj = Distribution( Column( :Data ), By(:Var) );
//using a lower proportion, .80, to screen something
obj << Tolerance Interval( Alpha( 0.95 ), Proportion( 0.8 ) );
tol_dt = report(obj[1])[OutlineBox(2)]["Tolerance Intervals"][TableBox(1)]<<Make Combined Data Table;
tol_dt << set Name("Tolerance Intervals");
for(i=1, i<=nrow(tol_dt), i++,
str = tol_dt:Var[i];
vlo = tol_dt:Lower TI[i];
vhi = tol_dt:Upper TI[i];
dt_stck << select where(:Var==str & (:Data < vlo | :Data > vhi) ) << hide and exclude(1);
dt_stck << clear select;
);
nw = New Window("Custom Display",
VListBox(
onew = dt_stck << Oneway( Y(:Data), X(:Var)),
text box(),
dbb = tol_dt <<New Data Box()
)
);
dbb << close side panels;
dbb << set max size(410,240);
nw << journal window;
```

Highlighted
##

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Email to a Friend
- Report Inappropriate Content

Re: JSL for evaluating tolerance interval USL and LSL after calculation

Thank you! Very much appreciate the help! Sorry about the delay in accepting the answer, I haven't gone back to work on the script until today.

Article Labels

There are no labels assigned to this post.