
davidk preguntó sobre dibujar las elipses alrededor de los puntos de datos. Luché con esto hace un tiempo y este es un resumen de lo que descifré con la ayuda de personas que realmente saben lo que están haciendo. ¡Todos los errores aquí son míos, comentarios y correcciones bienvenidos!Esta imagen es la salida de Bivariate, producida al final del guión. El objetivo del script es calcular los parámetros para dibujar la elipse verde. El script utiliza las funciones integradas de JMP Correlation, Mean, StdDev, Eigen para hacer el trabajo. Eigen, en particular, devuelve los parámetros que describen la elipse. Esos parámetros se convierten en una matriz de transformación 2D 3x3 que luego se usa para transformar puntos en un círculo unitario alrededor de 0,0 en la elipse deseada.
x = Open( "$sample_data\big class.jmp" );
H = x:height << get values; // column vectors
W = x:weight << get values;
data = H || W; // 2 columns by 40 rows
corr = Correlation( data );
mean = Mean( H ) || Mean( W );
stddev = Std Dev( H ) || Std Dev( W );
cov = Diag( stddev ) * corr * Diag( stddev );
{D, E} = Eigen( cov );
// sort columns of E. Don't know why; it controls which ellipse axis goes with the bigger vector, I think.
// you can see the gap in the ellipse change position if you use [1,2] (or just comment the next 3 lines)
jj = [2,1];
E = E[ 0, jj ];
D = D[ jj ];
// there seems to be a lot of opinions on how to do the confidence limit...
NormalContour = sqrt(ChiSquare Quantile( 0.95, 2 ));
T = NormalContour * E * Diag( Sqrt( D ) );
m = (T` |/ mean) || [0, 0, 1]; // transform matrix
unitCircle = J(100,3); // 2x2 transform uses 3x3 matrix for homogeneous coords
For( i = 1, i <= 100, i++,
unitCircle[i, 1] = Sin( (i - 1) * 2 * Pi() / 100 ); // divide by 99 to close the gap
unitCircle[i, 2] = Cos( (i - 1) * 2 * Pi() / 100 );
unitCircle[i, 3] = 1;
);
ellipse = unitCircle * m; // draw the ellipse as a unit circle transformed by m
New Window( "Ellipse from Eigen Values and Vectors",
Graph Box(xscale(50,75),yscale(40,180),
Marker( Marker State( 12 ), H, W ),
line( ellipse[0,1], ellipse[0,2])
)
);
// for comparison...
x<<BIVARIATE></BIVARIATE>

Aquí está la elipse dibujada "manualmente". La matriz de transformación, m, también podría usarse (con su inversa) para convertir puntos de datos en un círculo unitario; la distancia desde 0,0 sería menor que uno para puntos dentro de la elipse. Observe que Bivariate ya hace todo el trabajo, incluida la selección de los puntos dentro o fuera de la elipse.

Si usa la matriz de transformación con Scene3D de JMP, es posible que deba transponer "m" para que coincida con las expectativas de Scene3D para una matriz de transformación.
editar 30 de septiembre de 2017: reparar el formato