Наибольшая корреляция SAS не равна 1

Предположим, у меня есть набор данных have, который содержит взаимные корреляции (полученные из результатов процедуры proc corr):

  _NAME_    A      B      C
  A         1      0.2    0.8
  B         0.2    1      0.3
  C         0.8    0.3    1

Я пытаюсь вычислить наибольшее значение корреляции

 data want;
 set have;
 max_corr = max(of A B C);
 run;

Что производит:

  _NAME_    A      B      C     max_corr
  A         1      0.2    0.8   1
  B         0.2    1      0.3   1
  C         0.8    0.3    1     1

Однако это значение равно 1 для каждой строки, что и ожидается, поскольку корреляция по диагонали равна 1. Как настроить код, чтобы отображать наибольшую корреляцию, не равную 1?

Например, я ищу

  _NAME_    A      B      C     max_corr
  A         1      0.2    0.8   0.8
  B         0.2    1      0.3   0.3
  C         0.8    0.3    1     0.8

Предложение по улучшению вопроса: не используйте A, B и C как имена столбцов, так и значения имен. Также укажите ожидаемый результат, т. е. приведите минимально воспроизводимый пример .

jarlh 15.08.2024 12:40

какой результат вы хотите показать? пожалуйста, приведите пример

Busra Ecem Sakar 15.08.2024 12:44

@BusraEcemSakar — я добавил пример того, что хочу показать.

user860374 15.08.2024 12:52

@jarlh - я добавил пример ожидаемых результатов. Имена столбцов и значения имен в наборе данных одинаковы, поскольку это результат взаимной корреляции в SAS. Он был сгенерирован на основе базовых данных proc corr data = input_data out=have (where=(_TYPE_ = "CORR")); var A B C; run;

user860374 15.08.2024 12:54

спасибо за ваш пример, я опубликовал свой ответ.

Busra Ecem Sakar 15.08.2024 13:08

Кажется, это не связано с SQL, поэтому я удаляю этот тег.

jarlh 15.08.2024 13:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
50
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать оператор if, вот код

data want;
    set have;
    
    /* Initialize max_corr as missing */
    max_corr = .;

    /* Compare each correlation and ignore the diagonal (where value = 1) */
    if A < 1 then max_corr = max(max_corr, A);
    if B < 1 then max_corr = max(max_corr, B);
    if C < 1 then max_corr = max(max_corr, C);
    
run;

Кажется, вам просто нужно второе по величине значение?

data have;
input _NAME_ $ A B C;
datalines;
A 1 0.2 0.8 
B 0.2 1 0.3 
C 0.8 0.3 1 
;

data want;
   set have;
   max_corr = largest(2, of A--C);
run;
Ответ принят как подходящий

Вы можете использовать самую большую функцию.

data corr;
   input _NAME_ $   A      B      C;
   max_corr = largest(2,of a b c);
   cards;
  A         1      0.2    0.8
  B         0.2    1      0.3
  C         0.8    0.3    1
;;;;
   run;
proc print;
   run;

Я подозреваю, что на самом деле вам нужна наибольшая корреляция, кроме внутренней корреляции (которая всегда равна 1).

В этом случае используйте МАССИВ и уберите диагональное значение. Вы всегда можете вернуть 1 после нахождения МАКС.

data corr;
  input _NAME_ $ A B C ;
cards;
A   1      0.2    0.8
B   0.2    1      0.3
C   0.8    0.3    1
;;;;

data want;
  set corr;
  array _num_ _numeric_;
  _num_[_n_]=.;
  max_corr = max(of _num_[*]);
  length max_corr_var $32;
  max_corr_var = vname(_num_[whichn(max_corr,of _num_[*])]);
  _num_[_n_]=1;
run;

Результат

                                                    max_
Obs    _NAME_     A      B      C     max_corr    corr_var

 1       A       1.0    0.2    0.8       0.8         C
 2       B       0.2    1.0    0.3       0.3         C
 3       C       0.8    0.3    1.0       0.8         A

Другие вопросы по теме