如何使用 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);
)
);