Combine Integrate with Interpolate or SplineEval to get the area under the curve.
@sseligman wrote Using JMP to Find the Area Under a Curve ; here's a little more information on some builtin functions.
The Interpolate function uses a sorted list of X coordinates and a corresponding list of Y coordinates and answers the question "if X was 42, what would Y be?" using linear interpolation between the nearest two X coordinates in the sorted list. Linear interpolation produces straight line segments with data points on the corners of the curve.
The SplineEval function does the same thing (with help from the Spline Coef function) using a spline interpolation. A spline is a flexible, springy metal wire that passes close to the data points, depending on how stiff it is. Usually data points do not fall on the spline curve.
Both of those functions produce all the data points in a curve from the first X to the last X.
The Integrate function answers a different question: "how much area is under this curve in this range?" Interpolate has four arguments; the first two describe a f(x) function that generates a curve and the last two describe a range of x values. The result of Integrate( f(x), x, low, high ) is the area under the curve as x goes from low to high. The first two variables seem to repeat x because f(x) might be an expression like a+2*b and the second variable tells if a or b is the variable between low and high.
The JSL for this post is about using Interpolate or SplineEval as Interpolate's f(x) value. It builds an interactive graph to help understand how finding the area under a curve defined by some noisy data points might work with linear or spline interpolation. It also shows the exact answer (red) before the noise (black data points) was added to the data. The blue curve is the spline fit to the black data points. The bar graph in the middle shows the three area computations side-by-side; only the middle blue bar moves when the spline tension changes. With the right random data, any bar can be taller or shorter than the others.
JSL makes a graph like this; the lambda slider changes the blue spline's tension.
JMP 16 required...for each...
New Window( "Integrate Area Under Curve",
window:f = Function( {t},
50 + Sin( t / 10 ) * 40
);
window:xmin = 20;
window:xmax = 80;
window:xcoarse = window:xmin :: window:xmax :: 4;
window:xfine = window:xmin :: window:xmax :: 0.125;
window:random = 10;
window:generatedata = Function( {},
window:ycoarse = window:f( window:xcoarse ) + J( 1, N Col( window:xcoarse ), Random Normal( 0, window:random ) );
window:ycoarse[Loc( window:ycoarse > 99 )] = 99;
window:ycoarse[Loc( window:ycoarse < 1 )] = 1;
);
window:generatedata();
window:loglambda = 2;
window:patternsize = 299;
window:pat01 = J( window:patternsize, window:patternsize, (Random Integer( 0, 255 ) / 255) ^ 0.5 );
window:pat02 = J( window:patternsize, window:patternsize, (Random Integer( 0, 255 ) / 255) ^ 3 );
window:pat03 = J( window:patternsize, window:patternsize, (Random Integer( 0, 255 ) / 255) ^ 2 );
window:bar01 = 38;
window:bar02 = 44;
window:bar03 = 50;
window:show = [1 1 1];
window:barwide = 5;
window:barbottom = 50;
window:bartop = window:barbottom + 5;
window:aucMin = 1500;
window:aucMax = 4000;
window:aucToGraph = Function( {y},
Interpolate( y, 0, window:barbottom - window:bartop, window:aucMin, 7, window:aucMax, 97 - window:bartop )
);
window:drawAucBar = Function( {x, y},
y = window:aucToGraph( y );
Polygon(
x || x || x + .1 * window:barwide || x + .3 * window:barwide || x + .5 * window:barwide || x + .8 * window:barwide || x + window:barwide
|| x + window:barwide,
window:barbottom || window:barbottom + 5 || window:barbottom + 6 || window:barbottom + 4 || window:barbottom + 7 || window:barbottom + 3
|| window:barbottom + 5 || window:barbottom
);
If( y >= 0,
Polygon(
x || x || x + .1 * window:barwide || x + .3 * window:barwide || x + .5 * window:barwide || x + .8 * window:barwide || x + window
:barwide || x + window:barwide,
window:bartop + y || window:bartop + 5 || window:bartop + 6 || window:bartop + 4 || window:bartop + 7 || window:bartop + 3 || window
:bartop + 5 || window:bartop + y
)
);
);
window:g = Graph Box(
framesize( 1200, 600 ),
X Scale( window:xmin - 5, window:xmax + 5 ),
window:splineparms = Spline Coef( window:xcoarse, window:ycoarse, Power( 10, window:loglambda ) );
window:auc01 = Integrate( Interpolate( t, window:xcoarse, window:ycoarse ), t, window:xmin, window:xmax );
window:auc02 = Integrate( Spline Eval( t, window:splineparms, 0 ), t, window:xmin, window:xmax );
window:auc03 = Integrate( window:f( t ), t, window:xmin, window:xmax );
window:aucMin = 500 * Floor( (Min( window:auc02, window:auc03, window:auc01 )) / 500 );
window:aucMax = 500 * Ceiling( (Max( window:auc02, window:auc03, window:auc01 )) / 500 );
Fill Color( "gray" );
Pen Color( "black" );
Pen Size( 1 );
window:poly = 0 || window:ycoarse || 0;
window:polx = window:xmin || window:xcoarse || window:xmax;
Fill Pattern( window:pat01 );
If( window:show[1],
Polygon( window:polx, window:poly );
Line( window:polx, window:poly );
);
window:drawAucBar( window:bar01, window:auc01 );
Fill Color( "blue" );
window:poly = 0 || Spline Eval( window:xfine, window:splineparms, 0 ) || 0;
window:polx = window:xmin || window:xfine || window:xmax;
Fill Pattern( window:pat02 );
If( window:show[2],
Polygon( window:polx, window:poly )
);
window:drawAucBar( window:bar02, window:auc02 );
Fill Color( "yellow" );
window:poly = 0 || window:f( window:xfine ) || 0;
window:polx = window:xmin || window:xfine || window:xmax;
Fill Pattern( window:pat03 );
If( window:show[3],
Polygon( window:polx, window:poly )
);
window:drawAucBar( window:bar03, window:auc03 );
For Each( {y}, 0 || (window:aucMin :: window:aucMax :: 100),
yy = window:bartop + window:aucToGraph( y );
H Line( 37, 56, yy );
If( 0 == Mod( y, 500 ),
Text( {56.3, yy - 1}, Char( y ) )
);
);
Pen Size( 3 );
Pen Color( "black" );
Text Color( "black" );
Text( {window:bar01 + .5, 44}, "AUC linear\!n" || Char( window:auc01, 10, 2 ) );
Pen Color( "blue" );
Text Color( "blue" );
Y Function( Spline Eval( t, window:splineparms, 0 ), t );
Text( {window:bar02 + .5, 44}, "AUC spline\!n" || Char( window:auc02, 10, 2 ) );
Pen Color( "red" );
Text Color( "red" );
Y Function( window:f( a ), a );
Text( {window:bar03 + .5, 44}, "AUC sine\!n" || Char( window:auc03, 10, 2 ) );
Fill Pattern();
Marker( Combine States( Color State( "black" ), Marker State( 12 ) ), window:xcoarse, window:ycoarse );
);
,
H List Box(
Text Box( "Lambda: " ),
Slider Box( -2, 6, window:loglambda, window:g << reshow ),
Spacer Box( size( 20, 1 ) ),
Button Box( "Change Data Points",
window:generatedata();
window:g << reshow;
),
Spacer Box( size( 20, 1 ) ),
Text Box( "random: " ),
Slider Box(
0,
20,
window:random,
window:generatedata();
window:g << reshow;
),
Spacer Box( size( 20, 1 ) ),
window:cb = Check Box(
{"linear", "spline", "sine"},
Function( {v, i},
window:show[i] = v;
window:g << reshow;
),
<<set( 1, window:show[1] ),
<<set( 2, window:show[2] ),
<<set( 3, window:show[3] )
)
)
);