
DavidK 에 대해 물었다 타원 그리기 데이터 포인트 주변. 나는 얼마 전에 이것을 통해 어려움을 겪었고 이것은 그들이 무엇을 하고 있는지 실제로 알고 있는 사람들의 도움으로 내가 의아해했던 것에 대한 요약입니다. 여기에있는 모든 실수는 내 것입니다. 의견과 수정을 환영합니다!이 그림은 스크립트 맨 끝에서 생성된 Bivariate의 출력입니다. 스크립트의 목표는 녹색 타원을 그리는 매개변수를 계산하는 것입니다. 이 스크립트는 JMP의 기본 제공 함수인 Correlation, Mean, StdDev, Eigen을 사용하여 작업을 수행합니다. 특히 Eigen은 타원을 설명하는 매개변수를 반환합니다. 이러한 매개변수는 2D 3x3 변환 행렬로 변환되어 0,0 주변의 단위 원에 있는 점을 원하는 타원으로 변환하는 데 사용됩니다.
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>

다음은 "수동으로" 그린 타원입니다. 변환 행렬 m은 데이터 포인트를 단위 원으로 변환하는 데 역으로 사용할 수도 있습니다. 0,0으로부터의 거리는 타원 내부의 점에 대해 1보다 작습니다. Bivariate는 타원 내부 또는 외부의 점을 선택하는 것을 포함하여 이미 모든 작업을 수행합니다.

JMP의 Scene3D와 함께 변환 행렬을 사용하는 경우 변환 행렬에 대한 Scene3D의 예상과 일치하도록 "m"을 바꿔야 할 수 있습니다.
2017년 9월 30일 수정: 서식 복구