将相关矩阵转置为 SAS 中的一个长向量

Posted

技术标签:

【中文标题】将相关矩阵转置为 SAS 中的一个长向量【英文标题】:Transpose a correlation matrix into one long vector in SAS 【发布时间】:2019-04-30 17:14:43 【问题描述】:

我正在尝试将相关矩阵转换为一个长列向量,以便我具有以下结构

data want;
input _name1_$ _name2_$ _corr_;
datalines;
var1 var2 0.54
;
run;

我有以下代码,它输出 name1 和 corr;但是,我正在努力获得 name2

DATA TEMP_1
    (DROP=I J);
    ARRAY VAR[*] VAR1-VAR10;
    DO I = 1 TO 10;
        DO J = 1 TO 10;
            VAR(J) = RANUNI(0);
        END;
        OUTPUT;
    END;
RUN;

PROC CORR
    DATA=TEMP_1
    OUT=TEMP_CORR
        (WHERE=(_NAME_ NE " ")
         DROP=_TYPE_)
    ;
RUN;

PROC SORT DATA=TEMP_CORR; BY _NAME_; RUN;

PROC TRANSPOSE
    DATA=TEMP_CORR
    OUT=TEMP_CORR_T
    ;
    BY _NAME_;
RUN;

感谢您的帮助

【问题讨论】:

你想要完整的对称矩阵吗?还是只使用上三角形?要包括对角线吗? 我们想要下对角线或上对角线! 【参考方案1】:

你已经接近了。 name 变量遇到了一个奇怪的问题,因为它也变成了 PROC TRANSPOSE 之外的变量。如果你重命名它,你会得到你想要的。我还明确列出了变量并添加了一些 RENAME 数据集选项以获得您可能想要的。

PROC TRANSPOSE
DATA=TEMP_CORR (rename=_name_ = Name1)
OUT=TEMP_CORR_T (rename = (_name_ = Name2 col1=corr))
;
by name1;
var var1-var10;
RUN;

编辑:如果您不想重复,可以将 WHERE 添加到 OUT 数据集。

PROC TRANSPOSE
DATA=TEMP_CORR (rename=_name_ = Name1)
OUT=TEMP_CORR_T (rename = (_name_ = Name2 col1=corr) where = name1 > name2)
;
by name1;
var var1-var10;
RUN;

【讨论】:

啊,我明白了,这是有道理的,感谢!【参考方案2】:

只是一个带有 VNAME() 函数的数组。要只输出上三角,请将 DO 循环的下限设置为 _N_。

data want ;
  length _name1_ _name2_ $32 _corr_ 8 ;
  keep _name1_ _name2_ _corr_;
  set corr;
  where _type_ = 'CORR';
  array x _numeric_;
  _name1_=_name_;
  do i=_n_ to dim(x);
    _name2_ = vname(x(i));
    _corr_ = x(i);
    output;
  end;
run;

【讨论】:

以上是关于将相关矩阵转置为 SAS 中的一个长向量的主要内容,如果未能解决你的问题,请参考以下文章

矩阵和向量相乘

正交矩阵和它的转置矩阵相乘不是单位矩阵是怎么回事

矩阵转置python的实现

matlab中求矩阵的转置矩阵,是啥函数?

R语言矩阵向量操作(矩阵乘法,向量内积外积(叉乘),矩阵转置,矩阵的逆)

R语言矩阵向量操作(矩阵乘法,向量内积外积(叉乘),矩阵转置,矩阵的逆)