如何使用 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 台 PC,然後僅用於 PC。 通過查看公式可以看出,Vec Quadratic(S,X) 中的 S 矩陣對於使用 2 PC 和 4 PC 計算的 T² 是不同的。
如果有人深入了解如何使用不同數量的 PC 編寫獲取 T² 的腳本或如何正確制定列公式來計算 T²,我將不勝感激。
感謝您的反饋和想法!,
DS
分析數據表腳本編寫回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)保存 T 方的功能僅可從控製圖平台使用,因此目前無法使用您的第一種方法。
您可以在 JMP 社區的此處搜索願望清單,看看是否有人已經提出要求。 如果是這樣,請投票(kudo)。 如果沒有,請輸入新請求。
回复:如何使用 JSL 從 PCA 平台保存 T²(或如何計算)計算T平方的方法請參見附件腳本。 它由這些平台的 JMP 開發人員提供。
回复:如何使用 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² 值。 我現在剛剛編寫的用於計算的代碼相當冗長和繁瑣,儘管我相信一旦我把所有事情都理順,它就會奏效。 但是,我更喜歡上面的解決方案——它只是一些額外的代碼字符!
在仔細檢查您發送的代碼後,我注意到從 PCA 平台計算的 T² 和代碼中的“手動”計算對於相同數量的 PC 是不同的。 關於為什麼的任何線索? “手動”計算是“錯誤的”,或者執行方式與 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²(或如何計算)我還沒有想出如何用一些“簡單”的方法強制只選擇一列。 如果用戶選擇了超過 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);
)
);