
DavidK Interrogé sur dessiner les ellipses autour des points de données. J'ai lutté contre cela il y a quelque temps et voici un résumé de ce que j'ai découvert avec l'aide de personnes qui savent réellement ce qu'elles font. Toutes les erreurs ici sont de moi, commentaires et corrections sont les bienvenus !Cette image est la sortie de Bivariate, produite à la toute fin du script. Le but du script est de calculer les paramètres pour dessiner l'ellipse verte. Le script utilise les fonctions intégrées de JMP Correlation, Mean, StdDev, Eigen pour effectuer le travail. Eigen, en particulier, renvoie les paramètres qui décrivent l'ellipse. Ces paramètres sont transformés en une matrice de transformation 2D 3x3 qui est ensuite utilisée pour transformer les points d'un cercle unité autour de 0,0 en l'ellipse souhaitée.
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>

Voici l'ellipse dessinée "manuellement". La matrice de transformation m pourrait également être utilisée (avec son inverse) pour convertir des points de données en un cercle unitaire ; la distance par rapport à 0,0 serait inférieure à un pour les points à l'intérieur de l'ellipse. Notez que Bivariate fait déjà tout le travail, y compris la sélection des points à l'intérieur ou à l'extérieur de l'ellipse.

Si vous utilisez la matrice de transformation avec Scene3D de JMP, vous devrez peut-être transposer "m" pour correspondre aux attentes de Scene3D en matière de matrice de transformation.
modifier le 30 septembre 2017 : réparer le formatage