来自不同矩阵的 IML 相关性

IML correlation from different matrices

给定一个矩阵 X(n * p),我想将 X 拆分为 Y1(n * p-k) 和 Y2(n * k),其中 Y1 由 X 的前 k 列组成,Y2 由其他列组成.

现在,在 R 中我可以获得调用 cor(Y1,Y2, use="pairwise.complete.obs") 的 Y1 和 Y2 的列之间的 "crossed" 相关性,我如何在 corr 函数所在的 SAS IML 中获得相同的结果只承认 1 个数据集?

我试图找到合适的解决方案或算法来实现它,但结果很糟糕。

有人可以帮忙吗?还给我一些关于这种或相关性的文献会很棒!我不希望您为我编写代码,只是对现有函数或算法提供一些帮助或提示以进行翻译。

谢谢。

编辑:不要在网上搜索交叉相关,我写它只是为了解释我自己。

查找 "crossed correlation" 可以找到一系列关于信号处理的文献和一个与自相关函数非常相似的函数。事实上,在 R 中它被记录为 acf https://stat.ethz.ch/R-manual/R-devel/library/stats/html/acf.html.

但这不是您的代码所做的。在 R:

n = 100
p = 6
k = 2

set.seed(1)

r = rnorm(n*p)
x= matrix(r,n,p)

y1 = x[,1:k]
y2 = x[,(k+1):p]

cor.ys = cor(y1,y2,use="pairwise.complete.obs")

cor.x = cor(x)

(cor.ys - cor.x[1:k,(k+1):p])

你看到 cor(y1,y2) 的结果只是 x 的相关矩阵的一部分。

您应该能够轻松地将其放入 IML 中。

我可以想出几种方法来做到这一点。最简单的方法是计算 Pearson 相关性的完整矩阵(使用成对选项),然后对结果进行子集化。 (DomPazz 说的。)如果你有数百个变量,而你只想要其中的几个相关性,那么效率会很低,但编程起来非常简单:

proc iml;
n = 100;  p = 6;  k = 2;
call randseed(1);
x = randfun(n//p, "Normal");
varNames = "x1":"x6";

corr = corr(x, "pearson", "pairwise");   /* full matrix */
idx1 = 1:k;                              /* specify VAR */
idx2 = (k+1):p;                          /* specify WITH */
withCorr = corr[idx2, idx1];             /* extract submatrix */
print withcorr[r=(varNames[idx2]) c=(varNames[idx1])];

在 SAS/IML 之外,您可以使用 PROC CORR 和 WITH 语句进行相同的计算,从而验证您的 SAS/IML 程序:

proc corr data=test noprob nosimple;
var x1-x2;
with x3-x6;
run;