2016-07-14 6 views
-1

В настоящее время я столкнулся с проблемой в SAS. Я пишу магистерскую диссертацию о профессиональных травмах и о потере заработной платы, причиненной таким несчастным случаем. У меня есть набор данных с ежемесячной информацией о заработной плате для данного населения. Набор данных содержит конкретный идентификатор для каждого человека, а также ряд справочной информации, такой как образование, пол и т. Д. Если человек получил платеж по заработной плате за определенный месяц, он или она находится в моем наборе данных за этот конкретный месяц с вышеуказанным месяцем, упомянутой информации. Если человек не получил оплату заработной платы в течение определенного месяца (например, из-за безработицы, отпуска, болезни и т. Д.), Это лицо не найдено в моем наборе данных за этот конкретный месяц - даже если это лицо могло получить выплату заработной платы как в предыдущем месяце, так и в более позднем месяце. Так, например, человек, который работал целый год, имеет 12 наблюдений в наборе данных. Если кто-то по какой-то причине не работал в течение 2 месяцев, у этого человека есть только 10 наблюдений.Генерация наблюдений за несуществующими наблюдениями

Я, скорее всего, получу положительное уклонение в своих оценках, если я не позабочусь об этой проблеме. Человек может страдать от производственного травматизма в течение определенного месяца, а затем возвращаться через месяц после этого, месяц, когда данное лицо отсутствует в связи с болезнью, должно составлять оплату заработной платы, но все равно содержать «справочную» информацию.

Я загрузил пример набора данных, который можно найти здесь:

https://www.dropbox.com/s/0zkr0430menotdf/Data.xlsx?dl=0

Данные содержат три человека (1,2,3) с информацией заработной платы, группы образования, пола. Лицо с идентификатором 2 не получило платеж за 8-й месяц и, следовательно, не наблюдает за этим месяцем.

Я не знаю, как сделать программу SAS, которая заполнила бы информацию для этого человека. Я хотел бы сделать новое наблюдение за 8-м месяцем для человека 2 с выплатой заработной платы в ноль, но с запаздывающей информацией о других переменных за предыдущий месяц. В моем исходном наборе данных у меня много тысяч человек, где некоторый потенциал может иметь несколько несуществующих данных о заработной плате.

ответ

0

Самый простой способ - построить таблицу master, которая будет содержать каждую комбинацию месяцев и отдельных лиц, если бы ваши данные были идеальными. После того, как у вас есть этот набор данных, вы оставите свои ошибки реальных данных, чтобы получить полный обзор независимо от отсутствующих данных.

Не нужно задерживать информацию, так как все столбцы будут там независимо.

Вот фиктивный пример (я называю пользователь вместо лиц)

/* table with 1-12 that represents months ids*/ 
data months(drop=i); 
do i=1 to 12; 
month=i; 
output; 
end; 
run; 
/* table with unique user ids*/ 
    data users; 
user_id = 1000;gender='M';output; 
user_id = 1001;gender='F';output; 
run; 

/* Your data*/ 
data my_data; 
input user_id month salary; 
cards; 
1001 1 1500 
1001 2 1500 
1001 3 1500 
1001 4 1500 
1001 5 1500 
1001 6 1500 
1001 7 1500 
1001 8 1500 
1001 9 1500 
1001 10 1500 
1001 11 1500 
1001 12 1500 
1000 1 800 
1000 2 800 
1000 3 800 
1000 4 800 
; 
run; 

/* Step1: Build a full combination of (cartesian join) of months & users 
    In this case is 12 months x 2 users = 24 records 
*/ 
proc sql; 
create table master_tbl as 
    select * from months, users; 
quit; 

/* Step2: Left join your 'faulty' data against the master table to get a full view 
for each user */ 

proc sql; 
create table full_view as 
Select t1.*, t2.salary from master_tbl t1 left join my_data t2 
          on t1.user_id = t2.user_id and 
           t1.month = t2.month; 
quit; 

Набор данных full_view будет содержать как не пропущенный и отсутствуют случаи. Вы можете обнаружить недостающие случаи, когда отсутствует информация о зарплате.

Примечание: Если вы считаете, что переменная wage также ошибочна, создайте в ваших данных фиктивный флаг (f = 1) и введите его в набор данных full_view, чтобы выделить отсутствующие данные.

EDIT 1: Для замены данных вы можете сделать:

data full_view; 
set full_view; 
if salary = . then do; 
    salary = 0; 
    salary_ind = (salary = 0); /*Dummy to keep track of what you have imputed*/ 
end; 
run; 

Надеется, что это помогает

+0

просто добавил дополнительный бит для вменения отсутствующих значений – Altons

+0

добавить пол в таблице пользователей – Altons

+0

Спасибо большое, Alton! Я попробую! Я не думал об этом. –

0

Совершенно аналогичен решению Altons', одна разницы в том, что я заменить недостающие значения заработной платы в Шаг PROC SQL.

/*Load the data*/ 
PROC SQL; 
    CREATE TABLE have AS 
     SELECT t1.Identifier, 
      t1.Month, 
      t1.Wage, 
      t1.'education category'n, 
      t1.gender 
     FROM WORK.DATA t1 
      ORDER BY identifier, month; 
QUIT; 


/*Create a dataset with 12 observations of each id.*/ 
data a; 
    do i=1 to 3; 
     do j=1 to 12; 
      identifier=i; 
      month=j; 
      output; 
     end; 
    end; 

    drop i j; 
run; 


/*Merge the dataset above with the original dataset, replacing missing values of wage with 0.*/ 
proc sql; 
    create table ab as 
     select a.*, coalesce(b.wage,0) as wage, b.'education category'n, b.gender 
      from a 
       left join have as b on a.identifier=b.identifier and a.month=b.month; 
quit; 


/*Use the update statement to carry forward previous non-missing values.*/ 
data want; 
    update a (obs=0) ab; 
    by identifier; 
    output; 
run;