Фиктивные переменные в SAS

Предположим, что у нас есть некоторый набор данных people, который имеет категориальную переменную income с 4 уровнями (1,2,3,4). Как мы будем кодировать это в SAS? Это будет:

data people;
set people;
if income=1 then income1=1;
else if income=2 then income2=1
else if income =3 then income3=1;
run;

Другими словами, это создало бы три фиктивные переменные для четырех уровней. Правильно ли это?

5 ответов

И я бы написал что-то более общее.

%macro cat(indata, variable);
 proc sql noprint;
 select distinct &variable. into :mvals separated by '|'
 from &indata.;
 %let mdim=&sqlobs;
 quit;
 data &indata.;
 set &indata.;
 %do _i=1 %to &mdim.;
 %let _v = %scan(&mvals., &_i., |);
 if &variable. = &_v. then &variable.&_v. = 1; else &variable.&_v = 0;
 %end;
 run;
%mend;
%cat(people, income);


Я изменил ваш код ниже. Это дало бы 3 фиктивной закодированной переменной. income = 4 будет вашим ссылочным кодом.

data people_dummy;
 set people;
 if income=1 then income1=1 ; else income1=0;
 if income=2 then income2=1 ; else income2=0; 
 if income=3 then income3=1 ; else income3=0;
run;


Код: -

proc sql noprint;
 select distinct 'income' || strip(put(income,8.)) into :income_var separated by ' '
 from people;
quit;
data people(rename = (in = income));
 set people(rename = (income = in));
 length &income_var. 8;
 array tmp_arr(*) income:;
 do i = 1 to dim(tmp_arr);
 if in eq i then tmp_arr(i) = 1;
 else tmp_arr(i) = 0;
 end;
 drop i;
run;

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

Шаг данных установит соответствующую переменную в значение 1, а другие - на 0 в соответствии со значением переменной дохода.


Несколько более гибкий способ сделать это - массивы.

data people;
set people;
array incomes income1-income4;
do _t = 1 to dim(incomes);
 if income=_t then income[_t] = 1;
 else if not missing(income) then income[_t]=0;
 else income[_t]=.;
end;
run;


Вам не нужно писать "else". Ниже также будет работать:

income1_ind=(income1 eq 1);
 income2_ind=(income2 eq 2);

licensed under cc by-sa 3.0 with attribution.