JSL을 사용하여 PCA 플랫폼에서 T²를 저장하는 방법(또는 계산하는 방법)안녕 모두,
<
<< Save T Square 호출이 다변수 제어 차트에서 작동한다는 것을 알고 있지만 PCA 또는 다변수 플랫폼에서는 작동하지 않는 것 같습니다. PCA 플랫폼에서 T² 공식을 생성하기 위해 PCA 플랫폼을 사용해야 합니다. PCA 플랫폼에서 계산에 사용할 PC의 수를 실제로 지정할 수 있기 때문입니다. 이는 Mahalanobis 거리의 제곱과 같은 일반적인 T² 통계가 아닙니다. 보고서 창으로 보낸 << T²(1, Save T Square) 호출도 작동하지 않습니다.
1. 스크립트를 사용하여 사용할 PC의 수를 지정하고 T² 공식을 데이터 테이블에 저장할 수 있습니까? 지금까지 이에 대한 옵션을 찾지 못했습니다.
2. 그렇지 않은 경우 가장 잘 계산하는 방법은 무엇입니까? 계산이 정의된 것으로 알고 있습니다. 여기 , 하지만 빨간색 핫 버튼을 사용하여 데이터 테이블에 저장되는 수식은 약간 다른 것 같습니다.
저장된 공식(수동 저장)에 따르면 T² = Vec Quadratic(S, X)= Diag(X*S*X`), 여기서 X는 데이터의 표준화된 벡터, X`는 전치, S는 역 공분산입니다. 행렬. 이것은 마할라노비스 거리의 제곱인 표준 T²입니다.
그러나 에 따르면 선적 서류 비치 PCA 플랫폼의 i번째 T² 값에 대해 T_i² = [X_ci*P_a]*L-1*[P`_a*X`_ci], 여기서 X_ci는 i번째 표준화된 관측값이고, P_a는 첫 번째 "a"를 포함하는 행렬입니다. 고유값(즉, 모두가 아닐 수도 있음)이고 L-1은 첫 번째 A 고유값을 포함하는 대각 행렬입니다. 원칙적으로 이것은 Vec Quadratic(L-1, [X_ci*P_a])와 같아야 합니다. 단, 역 공분산 행렬 S를 사용하는 대신 첫 번째 "a" PC의 역 axa 고유값 행렬을 사용하고 X 이제 X_ci*P_a]입니다. 그렇지 않으면 나타날 것입니다.
JMP가 이미 이 모든 것을 계산할 때 n-주성분 T²를 저장하기 위해 이 문제를 재설계하는 것은 다소 복잡하고 불필요해 보입니다. 저장 프로세스를 자동화하고 싶지만 옵션 1이 작동하지 않는 것 같습니다. 즉, 옵션 2가 차선책입니다. 그래도 수식을 넣은 새 열을 만들기 위해 수식을 복구하려는 시도는 좀 많이 보입니다.
다변수 플랫폼에서 저장된 T² 수식(및 T² = Mahal.Dist.² 방식)을 보여주는 Iris.jmp 파일의 수정된 데이터 테이블을 첨부한 다음, 모든 공식을 사용하여 공식이 결정되는 PCA 플랫폼의 T²를 첨부합니다. 4 PC 다음 PC에만. 공식을 보면 알 수 있듯이 Vec Quadratic(S,X)의 S 행렬은 2 PC 대 4 PC를 사용하여 계산된 T²에 대해 다릅니다.
다른 수의 PC에서 T²를 구하는 스크립팅 방법이나 T²를 계산하기 위해 열 공식을 올바르게 공식화하는 방법에 대한 통찰력이 있는 사람이 있다면 그 통찰력에 감사할 것입니다.
귀하의 의견과 생각에 감사드립니다!,
DS
해석학데이터 테이블스크립팅Re: JSL을 사용하여 PCA 플랫폼에서 T²를 저장하는 방법(또는 계산하는 방법)T 제곱을 저장하는 기능은 관리도 플랫폼에서만 사용할 수 있으므로 현재로서는 첫 번째 접근 방식이 불가능합니다.
여기 JMP 커뮤니티에서 위시리스트를 검색하여 누군가가 이미 요청했는지 확인할 수 있습니다. 그렇다면 투표하십시오(쿠도). 그렇지 않은 경우 새 요청을 입력합니다.
Re: JSL을 사용하여 PCA 플랫폼에서 T²를 저장하는 방법(또는 계산하는 방법)T제곱 계산 방법은 첨부된 스크립트를 참조하시기 바랍니다. 이 플랫폼의 JMP 개발자가 제공했습니다.
Re: JSL을 사용하여 PCA 플랫폼에서 T²를 저장하는 방법(또는 계산하는 방법)안녕하세요 @markbailey ,
플랫폼 개발자의 JSL을 포함하여 피드백을 보내주셔서 감사합니다. 글쎄, 그것이 밝혀지면서 내가 추구했던 것에 대한 해결책 (옵션 1) ~이다 JSL로 실제로 가능!! 그리고 훨씬 더 간단합니다. 나는 당신이 보낸 코드에서 그것을 볼 필요가있었습니다.중요한 부분은 다음과 같습니다.
Outlier Analysis( 1, Number of Components( N ), Save T Square ),
구성 요소 수 입력에서 "N"을 변경하고 T 제곱 저장을 추가하면 실제로 정의한 N 구성 요소에 대한 데이터 테이블에 T² 공식이 저장됩니다. Outlier Analysis() 호출 내에서 "T Square 저장"에 요청을 보낼 수 있다는 것을 몰랐습니다. N 구성 요소와 함께 이 작업을 수행하면 내가 하고 싶었던 일을 정확하게 수행할 수 있습니다. 도움을 주셔서 감사합니다! 위시리스트나 그 무엇도 입력할 필요가 없습니다. JMP가 이미 당신을 위해 할 수 있습니다!
2, 3, 4 PC의 T² 값을 계산하는 스크립트가 있는 Iris_mod.jmp 데이터 테이블을 첨부합니다. 필요한 경우 T² 값을 효율적으로 계산하는 방법을 아는 것이 좋습니다. 내가 계산을 하기 위해 지금 작성하고 있는 코드는 다소 길고 성가신 것이지만, 일단 모든 것이 정리되면 효과가 있을 것이라고 생각합니다. 그러나 위의 솔루션을 선호합니다. 코드의 몇 문자만 추가하면 됩니다!
보내주신 코드를 자세히 살펴보면 PCA 플랫폼에서 계산된 T²와 코드의 "수동" 계산이 동일한 PC 수에 대해 다르다는 것을 알았습니다. 이유에 대한 단서가 있습니까? "수동" 계산이 "잘못"되었거나 PCA가 수행하는 방식과 다르게 수행되었거나 다른 작업이 진행 중입니다. 동일한 PC 수에 대한 T² 결과가 PCA 플랫폼 및 "수동" 계산과 다르다는 것을 보여주는 또 다른 데이터 테이블 Iris_mod_different_T2.jmp도 첨부합니다. 추후 공지가 있을 때까지 PCA 플랫폼의 T² 공식을 사용하는 것을 선호합니다. "수동" 계산에 다른 점이 있는지 그리고 값이 동일하지 않은 이유를 알고 싶습니다.
다시 한 번 감사합니다!,
DS
추신 관심 있는 사람이 있으면 내가 작업한 코드가 아래에 있습니다. 사용자가 PCA를 수행할 열을 선택한 다음 DModX 및 T² 공식을 추출하는 데 사용할 PC 수를 동적으로 선택할 수 있는 대화형 코드입니다. 다른 분석을 원할 경우 선택한 수의 PC를 데이터 테이블에 저장할 수도 있습니다.
덕분에 @jthi Plot Col Box()의 경우 <
Names Default To Here( 1 );
//Clear Symbols();
//Function to choose the data table to model
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL> PCRptOutlier << Save DModX( N_PCs );
If( savePCs == 1,
PCRptOutlier << Save Principal Components( N_PCs )
);
PCRptOutlier<<CLOSEWINDOW> 0, Try( choose_data_table, Throw( "No data found" ) )
);
ModMetrics;
);
Firstwin;</CLOSEWINDOW>Re: JSL을 사용하여 PCA 플랫폼에서 T²를 저장하는 방법(또는 계산하는 방법)"간단한" 방법으로 하나의 열만 강제로 선택하는 방법을 찾지 못했습니다. 사용자가 2개 이상의 행을 선택한 경우 테이블 상자를 "강제로" 업데이트할 수 있습니다. 그것은 적어도 어떤 행이 분석될 것인지 조금 더 명확하게 할 것입니다.
이것은 항상 첫 번째 선택된 행을 사용하지만 일부 열에서 가장 큰 값을 가진 행을 사용하도록 수정할 수 있습니다.
Names Default To Here(1);
New Window("Mountains",
tb = Table Box(
String Col Box("Mountain", {"K2", "Delphi", "Kilimanjaro", "Grand Teton"}),
Number Col Box("Elevation (meters)", {8611, 681, 5895, 4199}),
Plot Col Box("", {8611, 681, 5895, 4199})
)
);
tb << Set Selectable Rows();
tb << set row change function(
Function({this}, {selRows},
selRows = this << get selected rows;
If(N Items(selRows) > 1,
this << Set Selected Rows(Matrix(selRows[1]));
);
Print(this << get selected rows);
)
);