выбрать самые высокие коррелированные пары из матрицы SAS - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть такой набор данных

data have;
    do i = 1 to 1000;
    y = ranuni(0);
    x1 = y ** 2;
    x2 = x1 ** 3;
    x3 = x2 - x1/2;
    output;
    end;
run;

Я строю корреляционную матрицу так:

proc corr
    data = have
    out = correlation_matrix
        (where = (_TYPE_ = "CORR"))
    noprint;
run;

Я попытался вслух придумать какой-нибудь код, который мог бы достичь чего-то похожего на то, что я ищу, синтаксис или логика верны, но я пытаюсь описать, что я ищу

proc sort
    data = correlation_matrix
    by _NAME_;
run;

data _temp;
    set correlation_matrix;
    array col[*] _numeric_;

    by _NAME_;

    do i = 1 to dim(col);
        if col(i) > 0.6 then do;
            %let list = append(vname(col));
    end;
run;

И из матрицы корреляции я ищу способ вернуть пары, которые имеют корреляцию 60% или выше некоторого порога, пары, которые я затем буду использовать для построения матриц графика рассеяния / гистограммы, подобных этой

proc contents;
    data = high_correlation_pairs
    out  = contents
    noprint;
run;

proc sort
    data = contents
    nodupkey;
    by name;
run;

proc sql noprint;
    select name INTO: highly_correlated_pairs
        separated by " "
            from contents
;
quit;

ODS GRAPHICS /
        IMAGEMAP=OFF;
OPTIONS VALIDVARNAME=ANY;
    PROC SGSCATTER 
        DATA=have;
        TITLE "Scatter Plot Matrix";
        FOOTNOTE;
        MATRIX &highly_correlated_pairs
                / 
                DIAGONAL=(HISTOGRAM  )
                START=TOPLEFT
                NOLEGEND
    ;
    RUN;
TITLE; FOOTNOTE;

Я просто не уверен, как выбрать переменные из матрицы, у которых есть пара с корреляцией более 60%, это может даже на NAME вернуть столбцы с corr более 60%

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Редактировать: чтобы включить полный ответ:

PROC TRANSPOSE используется для транспонирования матрицы корреляции в пары x, y и подмножества в корреляции интереса.Макропеременная создана для использования в PROC SGSCATTER.

ПРИМЕЧАНИЕ: PLOTREQUESTS = x1 * x2 x1 * y x2 * x3 x2 * y

data have;
   do i = 1 to 1000;
      y = ranuni(0);
      x1 = y ** 2;
      x2 = x1 ** 3;
      x3 = x2 - x1/2;
      output;
      end;
   run;
proc corr data=have out=corr noprint;
   run;
proc transpose name=with data=corr out=pair(where=(.6 le abs(col1) lt 1));
   where _type_ eq 'CORR';
   by _name_ notsorted;
   run;
data pairV / view=pairv;
   set pair;
   call sortc(_name_,with);
   run;
proc sort data=pairv out=pair2 nodupkey;
   by _name_ with;
   run;
proc sql noprint;
   select catx('*',_name_,with) into :plotrequests separated by ' ' from pair2;
   quit;
%put NOTE: &=plotrequests;
proc sgscatter data=have;
   plot &plotrequests;
   run;
   quit;

enter image description here

0 голосов
/ 13 ноября 2018

Вы можете получить такие пары: ключом является функция vname, которая возвращает имя элемента массива:

data high_corrs;
  set correlation_matrix;
  array coefs i--x3;
  length var1 var2 $32.;
  do j = 1 to dim(coefs);
    corr = coefs(j);
    if _n_ < j and corr > 0.6 then do;
      var1 = vname(coefs(_n_));
      var2 = vname(coefs(j));
      output;
    end;
  end;
  keep var1 var2 corr;
run;

Может быть, оттуда вы можете выработать остальное?

...