如何使用 JSL 從 PCA 平台保存 T²(或如何計算)大家好,
我正在嘗試讓一些 JSL 代碼工作以從主組件平台保存 T²,例如如何通過調用 <
我知道調用 << Save T Square 將適用於多變量控製圖,但它似乎不適用於 PCA 或多變量平台。 我需要使用 PCA 平台來生成 T² 公式,因為在 PCA 平台中,您實際上可以指定要在計算中使用的 PC 數量,它不是正常的 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 是下一個最佳選擇。 即便如此,嘗試恢復公式以創建一個包含公式的新列似乎有點過分。
我附上了 Iris.jmp 文件的修改數據表,它顯示了從多變量平台保存的 T² 公式(以及 T² = Mahal.Dist.²),然後是 PCA 平台的 T²,其中公式是使用所有4 台個人電腦,然後只到個人電腦。 通過查看公式可以看出,Vec Quadratic(S,X) 中的 S 矩陣對於使用 2 個 PC 和 4 個 PC 計算的 T² 是不同的。
如果有人了解如何使用不同數量的 PC 編寫腳本獲取 T²,或者如何正確制定列公式來計算 T²,我將不勝感激。
感謝您的反饋和想法!,
DS
分析數據表腳本回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)你好@ih ,
非常酷,感謝您提供有關如何訪問紅色三角形的信息,我以前不知道該怎麼做。
謝謝!,
DS
回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)你好@SDF1 ,
您可以進入 PCA 平台的離群值分析部分以保存 T2 並執行紅色小三角菜單中的所有其他操作,您只需要進入可編寫腳本的對像以進行離群值分析。這是一個例子:
Names default to here(1);
dt = Open( "$Sample_data/iris.jmp" );
pca = Principal Components(
Y( :Sepal length, :Sepal width, :Petal length, :Petal width ),
Estimation Method( "Default" ),
"on Correlations"
);
pca << Outlier Analysis();
//Get a reference to the outlier analysis itself
oa = (pca << XPath("//OutlineBox[text()='Outlier Analysis']"))[1] << Get Scriptable Object;
//Now you can access that red triangle menu and more
oa << Number of Components(1);
oa << Save T²;
oa << Save T² Contribution;
回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)你好@馬克貝利和@jthi ,
感謝您的反饋。 這有助於解決能夠選擇多行的問題。 事實上,我對其進行了一些更改,以提醒用戶他們選擇了太多項目。 感謝您的所有投入,並幫助我按照自己喜歡的方式獲得此代碼功能。
Mount = Expr(
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} ),
<<SET selectable="" rows=""> 1, Throw( "Too many items selected!\!rOnly one selection possible." ),
N Items( selRows ) == 1,
N = selrows;
);
)
)
)
)
);
Mount;</SET>如果您聽說過為什麼 T² 會得出不同的值,我很想知道為什麼。
謝謝!,
DS
回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)順便說一句,您不需要保存顯示引用然後在窗口打開後使用它來發送消息。 您可以使用消息發送作為函數調用中的另一個參數來製作顯示框。 如果窗口是模態的,這種方式特別有用。
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} ),
<< Set Selectable Rows(1),
<< 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( selRows );
);
);
)
)
);回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)我還沒有想出如何用一些“簡單”的方法強制只選擇一列。 如果用戶選擇了多於 1 行,您可以“強制”更新表格框。 它至少會讓它更清楚一點,即哪一行將被分析。
這將始終使用第一個選定的行,但您可以將其修改為使用某列中具有最大值的行:
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);
)
);回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)你好@馬克貝利,
感謝您的反饋,包括來自平台開發人員的 JSL。 好吧,事實證明,這是我所追求的解決方案(選項 1)是JSL 實際上是可能的!! 而且也簡單得多。 我只需要在您發送的代碼中看到它。關鍵部分在這裡:
Outlier Analysis( 1, Number of Components( N ), Save T Square ),
通過更改 Number of Components 輸入中的“N”,並添加 Save T Square,它實際上會將 T² 公式保存到您定義的 N 個組件的數據表中。 我不知道在 Outlier Analysis() 調用中,您可以將請求發送到“Save T Square”。 與 N 組件一起執行此操作正是我希望做的,感謝您的幫助! 無需輸入願望清單或任何東西,JMP 已經可以為您完成!
我附上了 Iris_mod.jmp 數據表和用於計算 2、3 和 4 台 PC 的 T² 值的腳本。 很高興知道如何有效地計算我需要的 T² 值。 我現在剛剛編寫的用於計算的代碼相當冗長和繁瑣,儘管我相信一旦我把所有事情都弄清楚它就會起作用。 但是,我更喜歡上面的解決方案——它只是多了幾個字符的代碼!
在仔細檢查您發送的代碼後,我注意到對於相同數量的 PC,從 PCA 平台計算的 T² 和代碼中的“手動”計算是不同的。 關於為什麼的任何線索? “手動”計算“錯誤”或執行方式與 PCA 的計算方式不同,或者發生了其他事情。 我還附上了另一個數據表 Iris_mod_different_T2.jmp,它顯示了相同數量的 PC 的 T² 結果與 PCA 平台和“手動”計算不同。 在另行通知之前,我更喜歡使用 PCA 平台的 T² 公式。 我想知道“手動”計算是否有什麼不同以及為什麼值不一樣。
再次感謝!,
DS
聚苯乙烯 如果有人感興趣,我一直在研究的代碼如下。 它是一個交互式代碼,允許用戶選擇要在其上執行 PCA 的列,然後動態選擇用於提取 DModX 和 T² 公式的 PC 數量。 如果您想進行其他分析,您甚至可以將選定的 PC 數量保存到數據表中。
非常感謝@jthi尋求此代碼其他方面的幫助,以便讓事情按預期工作,例如 <
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>回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)T平方的計算方法見附件。 它由這些平台的 JMP 開發人員提供。
回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)保存 T 方的功能只能從控製圖平台獲得,因此目前無法使用第一種方法。
您可以在 JMP 社區的此處搜索願望清單,看看是否有人已經提出要求。 如果是這樣,請投票給它 (kudo)。 如果沒有,請輸入新請求。