4.1 Оператор IF-THEN

Задача: Для каждого пациента измерили уровень гемоглобина в крови (Hemoglobin -HGB):

Lesson4.1.1

Для таких задач нужно использовать оператор IF-THEN и ELSE.

Синтаксис операторов IF-THEN и ELSE

IF expression THEN statement1;
ELSE statement2;

Если логическое выражение (expression) – верное, тогда выполняется действие statement1, в другом же случае выполняется statement2.

Выражение содержит операнды и операторы, которые формируют набор инструкций, создающих значение.

Операнды это

  • Имена переменных
  • Константы

Операторы это

  • Символы
    • сравнения
    • логических операций
    • арифметических вычислений
  • SAS функции;

Операторы сравнения:

Mnemonic Symbol Definition
LT < Less than
GT > Greater than
EQ = Equal to
LE <= Less than or equal to
GE >= Greater than or equal to
NE ^= or ~= Not equal to

Логические операторы:

Mnemonic Symbol Definition
OR | or, either
AND & and, both
NOT ^ or ~ not

Используя IF-THEN реализуем нашу задачу в SAS:

Так как мы имеем три уровня проверки показателя гемоглобина, мы используем конструкцию ELSE IF. Т.е. если первая проверка на низкий уровень (HGB < LOWER_R) не верная, мы переходим ко второй проверки для нормального показателя (LOWER_R =< HGB =< UPPER_R) и т.д. Получаем следующий датасет:

Lesson4.1.2

Условное выполнение

Вы можете использовать операторы DO и END , чтобы выполнять группу операторов по условию.

IF expression THEN DO;
executable statements
END;
ELSE DO;

executable statements
END;

Возвращаясь к пункту а) нашей задачи, можно увидеть, что мы два раза проверяли пациентов на одно и то же условие (является ли он мужского пола) для нижнего и верхнего предела.

Эту проверку можно объединить в одну, пользуясь операторами DO и END:

data range2;
    set list;
    
    if SEX="M" then do;
        LOWER_R=13.2;
        UPPER_R=17.1;
    end;
        else do;
            LOWER_R=11.7;
            UPPER_R=15.5;
        end;
run;

ВАЖНО не забывать, что для каждого DO блока должен быть свой END!

Рассмотрим случай, когда у пациента не было замера уровня гемоглобина в крови:

Lesson4.1.3 Lesson4.1.4

Можно увидеть, что для пустых значений HGB наш индикатор имеет значение ”Low”. Но для пустого значения уровня гемоглобина, мы не можем присвоить переменной ANRIND какое-то значение. Рассмотрим наш шаг для этого анализа:

data analysis;
    set range;
    length ANRIND $20;
    
    if HGB < LOWER_R then ANRIND="Low";
        else if LOWER_R =< HGB =< UPPER_R then ANRIND="Normal";
        	else if HGB > UPPER_R then ANRIND="High";
run;

Мы проверяем только то, что переменная HGB меньше заданного нижнего предела, не исключая случая, когда эта же переменная может быть пустой. Пустое значение переменной всегда меньше любого числа. Поэтому для пустого значения первый IF верен, и соответственно заполняется переменная ANRIND. Чтобы этого избежать используем функцию MISSING:

data analysis;
    set range;
    length ANRIND $20;
    
    if not missing(HGB) and HGB < LOWER_R then ANRIND="Low"; 
        else if LOWER_R =< HGB =< UPPER_R then ANRIND="Normal";
    	    else if HGB > UPPER_R then ANRIND="High";
run;

/*not missing(HGB)= Если не пустая переменная HGB*/ 

Получаем в результате датасет analysis

Lesson4.1.5

Функции ifn и ifc

Иногда вместо конструкции if-then и else удобно использовать функции ifn (для числовых значений) и ifc (для символьных значений):

IFN (logical-expression, value-returned-when-true, value-returned-when-false <,value-returned-when-missing>)

Рассмотрим функцию на примере дата сета range

data range;
    set list;
/*определяем нижний предел*/
    if SEX="M" then LOWER_R=13.2;
        else LOWER_R=11.7;
/*определяем верхний предел*/
    if SEX="M" then UPPER_R=17.1;
      else UPPER_R=15.5;
 run;
data range;
    set list;
/*определяем нижний предел*/
    LOWER_R=ifn(SEX="M", 13.2, 11.7);
/*определяем верхний предел*/
    UPPER_R=ifn(SEX="M", 17.1, 15.5);
run;

Функция IFC имеет точно такой же синтаксис, только ее результатом является символьная переменная.

Дополнительные материалы: