2016-07-14 11 views
-1

現在、私はSASの問題に直面しています。私は職業上の傷害とそのような事故によってもたらされた賃金の損失に関する私の修士論文を書いています。私は与えられた母集団の月額賃金情報を持つデータセットを持っています。データセットには、各個人の特定の識別子と、教育、性別などの背景情報の範囲が含まれています。個人が特定の月の賃金支払いを受け取った場合、その特定の月のデータセットに、上記の情報。その人が特定の月(例えば、失業、休日、病気など)の賃金支払いを受けていない場合、その特定の月のデータセットにその人が見つかりません。前月と後の月の両方でしたがって、たとえば、1年中働いた人物は、データセットに12の観測値を持ちます。何らかの理由で誰かが2ヶ月間働いていない場合、その人は10回しか観察できません。既存の観測値以外の観測値を生成する

私はこの問題を世話しないと、私の見積もりにプラスの偏見を与える可能性が高いです。ある月に労働災害に苦しんで、その後病気のために欠席した月を戻すことは、賃金の支払いを0にするべきであるが、依然として「バックグラウンド」情報を含んでいなければならない。

私はここで見つけることができるデータセットの例をアップロードした:

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

データは賃金情報、教育グループ、性別との3人(1,2,3)が含まれています。識別子2を持つ人物は、8ヶ月間の支払いを受けておらず、そのため、その月について何も観察していません。

SASプログラムを作成する方法がわかりません。そのSASプログラムを作成すると、その人の情報が入力されます。私は、賃金の支払いが0であるが、先月の他の変数に関する遅れた情報を持つ、人2の8月の新たな観測をしたいと思う。私の元のデータセットには数千人の人がいて、潜在的に複数の存在しない賃金情報を持つ可能性があります。

答えて

0

最も簡単な方法は、データが完璧だった場合は月と個人の組み合わせを1つずつ含むmasterテーブルを作成することです。このデータセットを取得したら、に欠陥のある実データを結合して、欠落しているデータに関係なく完全なビューを取得できます。

すべての列が無関係であるため、遅延情報は必要ありません。ここで

full_viewデータセットが非欠落や不足している両方のケースが含まれていますダミー例(私は、ユーザーの代わりに、個人を呼び出す)

/* 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; 

です。給与情報が不足している場合、不足しているケースを検出できます。

注: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; 

一つの違いは、私は賃金の欠損値を置き換えるということで、それはAltons'ソリューションと非常によく似

+0

だけでも、usersテーブルに – Altons

+0

欠損値を帰するために余分なビットを追加しました!私はそれを試みる!私はそれについてそのように行くとは思わなかった。 – Altons

+0

おかげでたくさんの性別を追加アルトン –

0

を役に立てば幸い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; 
関連する問題