Транспонировать корреляционную матрицу в один длинный вектор в SAS - PullRequest
0 голосов
/ 28 ноября 2018

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

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;

Помощь приветствуется

Ответы [ 2 ]

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

Просто Массив с функцией 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;
0 голосов
/ 28 ноября 2018

Ты рядом.Вы столкнулись со странной проблемой с переменной 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...