1

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

现在,在 RI 中可以获得 Y1 和 Y2 调用列之间的“交叉”相关性cor(Y1,Y2, use="pairwise.complete.obs"),我怎样才能在corr函数只接受 1 个数据集的 SAS IML 中获得相同的结果?

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

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

谢谢你。

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

4

2 回答 2

1

查找“交叉相关”会引导您找到一系列关于信号处理的文献和一个很像自相关函数的函数。事实上,在 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。

于 2015-08-14T11:52:19.730 回答
1

我可以想到几种方法来做到这一点。最简单的是计算 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;
于 2015-08-14T23:08:13.167 回答