Задача: Для каждого пациента измерили уровень гемоглобина в крови (Hemoglobin -HGB):
- В зависимости от пола, определить пониженный уровень гемоглобина LOWER_R (для женщин - 11,7 g/dL, для мужчин – 13,2 g/dL), повышенный уровень UPPER_R (для женщин - 15,5 g/dL, для мужчин – 17,1 g/dL ).
- Требуется создать переменную-индикатор ANRIND, которая принимает значение “Low”, ”Normal” и “High”, пользуясь пределами LOWER_R и UPPER_R.

Для таких задач нужно использовать оператор 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:
-
Определяем максимальный и минимальный уровень гемоглобина в крови для каждого пациента в зависимости от его пола:
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;
-
Создаем переменную ANRIND, длина которой равна 20, для анализа уровня гемоглобина в заданных пределах нормы (LOWER_R и UPPER_R). Для этого используем операторы сравнения (<, =< и >):
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;
Так как мы имеем три уровня проверки показателя гемоглобина, мы используем конструкцию ELSE IF. Т.е. если первая проверка на низкий уровень (HGB < LOWER_R) не верная, мы переходим ко второй проверки для нормального показателя (LOWER_R =< HGB =< UPPER_R) и т.д. Получаем следующий датасет:

Условное выполнение
Вы можете использовать операторы 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!
Рассмотрим случай, когда у пациента не было замера уровня гемоглобина в крови:


Можно увидеть, что для пустых значений 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

Функции 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 имеет точно такой же синтаксис, только ее результатом является символьная переменная.
Дополнительные материалы: