Создание переменной возрастной группы в SAS - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужна помощь в создании этой переменной возрастной группы.По моим данным возраст измеряется до 9 знаков после запятой.Я могу решить, какие категории я выбрал для квартилей.Но я продолжаю получать эти ошибки ...

"ОШИБКА 388-185: ожидание арифметического оператора. ОШИБКА 200-322: символ не распознается и будет игнорироваться."

Я попытался округлить и изменить файл на <=, но все равно выдает ту же ошибку ...: (</p>

data sta310.hw4;
   set sta310.gbcshort;
   age_cat=.;
   if age le 41.950498302 then age_cat = 1;
   if age > 41.950498302 and le 49.764538386 then age_cat=2;
   if age > 49.764538386 and le 56.696966378 then age_cat=3;
   if age > 56.696966378 then age_cat=4;
run;

Ответы [ 4 ]

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

Если вы группируете с квартилями, избегайте жесткого кодирования и используйте PROC RANK с GROUPS = 4.Группы будут от 0 до 3, но идея та же.

   proc rank data=sta310.gbcshort out=sta310.hw4 groups=4;
   var age;
   rank age_cat;
   run;

В вашей текущей программе эта строка / логика является вашей проблемой:

if age > 41.950498302 and le 49.764538386 then age_cat=2;

Это должно быть:

 if 41.950498302 < age <= 49.764538386 then age_cat=2;

Вы также должны переключить их наIF / ELSE IF, а не IF заявления.Вы должны сделать это, потому что как только он находит категорию, он перестает оценивать условия, поэтому он не проверяет каждое условие IF, что делает его немного быстрее.Это не то, что вы заметите в своей домашней работе, но если вы когда-либо работаете с большими наборами данных, это действительно важно знать.

if age <= 41.950498302 then age_cat = 1;
else if 41.950498302 < age <= 49.764538386 then age_cat=2;
else if 49.764538386 < age <= 56.696966378 then age_cat=3;
else if 56.696966378 < age then age_cat=4;
0 голосов
/ 20 ноября 2018

Синтаксис and le или and <= неверен.Такой синтаксис может быть чем-то вне COBOL.

Попробуйте эту форму выражения SAS

  • значение < переменная <= значение

Пример

data sta310.hw4;
   set sta310.gbcshort;
   age_cat=.;
   if age <= 41.950498302 then age_cat = 1;
   if 41.950498302 < age <= 49.764538386 then age_cat=2;
   if 49.764538386 < age <= 56.696966378 then age_cat=3;
   if 56.696966378 < age then age_cat=4;
run;    

Аналогичное и безопасное сито логики можно выполнить с помощью оператора select.

  select;
    when (age <= 41.950498302) age_cat=1;
    when (age <= 49.764538386) age_cat=2;
    when (age <= 56.696966378) age_cat=3;
    otherwise age_cat=4; 
  end;

SAS select отличается от C switch оператором в том, что подтверждается оператор when.мимо select (и не требует break, как это часто наблюдается в switch/case)

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

Проблема была в ваших операторах if с несколькими условиями.Кроме того, поскольку age_cat не является числовой переменной (т. Е. Вы не хотите суммировать эту переменную), я бы поставил ее как символьную переменную длины 1, указав ее заранее в операторе формата (наилучшая практика в управлении данными SAS),Наконец, я бы также предложил переформулировать вашу конструкцию if else, чтобы сделать ее более эффективной для памяти:

data sta310.hw4;
   set sta310.gbcshort;
   format age_cat $1.; 
   if age <= 41.950498302 then age_cat = "1";
   else if 41.950498302 < age <= 49.764538386 then age_cat= "2";
   else if 49.764538386 < age <= 56.696966378 then age_cat="3";
   else age_cat="4";
run;

Надеюсь, это поможет,

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

эти вещи лучше использовать в формате proc.Вам не хватает вашего имени переменной после вашего и артеметического оператора.также вам не нужно age_cat =.в начале.пожалуйста, добавьте вашу переменную возраста после и до вашего артеметического оператора, как показано ниже

 data sta310.hw4;
 set sta310.gbcshort;
 age_cat=.;
  if age le 41.950498302 then age_cat = 1;
  if age > 41.950498302 and age le 49.764538386 then age_cat=2;
  if age > 49.764538386 and age le 56.696966378 then age_cat=3;
   if age > 56.696966378 then age_cat=4;
 run;
...