如何使用 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)。 如果没有,请输入新请求。