
DavidK fragte nach Zeichnen der Ellipsen um Datenpunkte herum. Ich habe mich vor einiger Zeit damit abgemüht, und dies ist eine Zusammenfassung dessen, was ich mit Hilfe von Leuten herausgefunden habe, die tatsächlich wissen, was sie tun. Alle Fehler hier sind meine, Kommentare und Korrekturen willkommen!Dieses Bild ist die Ausgabe von Bivariate, die ganz am Ende des Skripts erstellt wurde. Das Ziel des Skripts besteht darin, die Parameter zum Zeichnen der grünen Ellipse zu berechnen. Das Skript verwendet für die Arbeit die in JMP integrierten Funktionen Correlation, Mean, StdDev und Eigen. Insbesondere Eigen gibt die Parameter zurück, die die Ellipse beschreiben. Diese Parameter werden in eine 2D-3x3-Transformationsmatrix umgewandelt, die dann verwendet wird, um Punkte auf einem Einheitskreis um 0,0 in die gewünschte Ellipse zu transformieren.
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>

Hier ist die „manuell“ gezeichnete Ellipse. Die Transformationsmatrix m könnte auch (mit ihrer Umkehrung) verwendet werden, um Datenpunkte in einen Einheitskreis umzuwandeln; Für Punkte innerhalb der Ellipse wäre der Abstand von 0,0 kleiner als eins. Beachten Sie, dass Bivariate bereits die gesamte Arbeit erledigt, einschließlich der Auswahl der Punkte innerhalb oder außerhalb der Ellipse.

Wenn Sie die Transformationsmatrix mit Scene3D von JMP verwenden, müssen Sie möglicherweise „m“ transponieren, um den Erwartungen von Scene3D an eine Transformationsmatrix zu entsprechen.
Bearbeiten 30. September 2017: Formatierung reparieren