Sas 不同矩阵的IML相关性

Sas 不同矩阵的IML相关性,sas,sas-iml,Sas,Sas Iml,给定一个矩阵X(n*p),我想把X分成Y1(n*p-k)和Y2(n*k),其中Y1由X和Y2的前k列组成,Y2是其他列 现在,在R中,我可以通过调用cor(Y1,Y2,use=“pairwise.complete.obs”)获得Y1和Y2列之间的“交叉”相关性,在SAS IML中,如果corr函数只允许1个数据集,我如何获得相同的结果 我试图找到一个合适的解决方案或算法来实现它,但结果很糟糕 有人能帮忙吗?同时给我指出一些关于这类或相关的文献会很好!我不想让你为我编写代码,只是一些关于现有函数或

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

现在,在R中,我可以通过调用
cor(Y1,Y2,use=“pairwise.complete.obs”)
获得Y1和Y2列之间的“交叉”相关性,在SAS IML中,如果
corr
函数只允许1个数据集,我如何获得相同的结果

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

有人能帮忙吗?同时给我指出一些关于这类或相关的文献会很好!我不想让你为我编写代码,只是一些关于现有函数或算法的帮助或提示

多谢各位

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

查找“交叉相关性”会让你找到一系列关于信号处理的文献,以及一个非常类似于自相关函数的函数。事实上,在R中,它是用acf记录的

但这不是您的代码所做的。在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中。

我可以想出一些方法来实现这一点。最简单的方法是计算皮尔逊相关性的完整矩阵(使用成对选项),然后将结果子集。(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;

(我真的希望来自“do loop”博客的Rick会来这里)我添加了R标签,希望一位R大师能够为你指出文学。我认为这不合适。除非标签与问题实际相关,否则不应使用标签,并且(除非编辑标签以解决此问题),问题不会询问
r
函数的功能。也许应该,但是…多姆帕兹这是真的,我不明白为什么我自己找不到。你完全救了我的大脑不至于发疯。非常感谢,很好,瑞克,谢谢。在我的例子中,两个矩阵是:给定M完整矩阵,X包含没有任何缺失值的列,Y包含缺失值的列。我定义了两个索引:missidx=loc(countmiss(M,“ROW”)^=0;compidx=loc(countmiss(M,“ROW”)=0;然后我用MCor=corr(M,“pearson”,“pairwise”)计算了完整的corr矩阵;并用XYCor=MCor[compidx,missidx]得到了期望的结果;感谢您的帮助,感谢您的博客提供了鼓舞人心的内容。