2017-07-12 48 views
0

我有一個如下所示的數據集。一個人可以是'被動','主動'或'其他'。我想計算一個人在被激活之前「被動」的週數。變量'start_week'表示何時「被動」法術開始。如果一個人有不止一個'被動'法術,觀察結果會重新出現在下一行,但是有不同的start_week。SAS計算多個特定法術的持續時間

ID y_1449 y_1448 y_1449 y_1450 y_1451 y_1452 y_1501 ... y_1608 start_week 
01 passive passive passive passive active active active ...   5 
02 other passive active active active passive active ...   3 
02 other passive active active active passive active ...   7 
04 
... 
N other other  other other passive active active ...   6 

我可以計算出觀察的時間只有一個法術的代碼,但是當觀測再次發生,不順心的事,並沒有持續時間的計算正確無誤。我有以下代碼:

%let period = y_1449-y_1452 y_1501-y_1553 y_1601-y_1608; 
%let passive = 'passive'; 
%let active = 'active'; 

data want; 
    data have; 
    array y(*) $period; 
    transition_to_active=0; 
    weeks=0; 
    active_week; 

    do i=start_week to 62; 
     if y(i) in &passive. then do; 
       weeks=weeks+1; 
     end; 

     if y(i) in &active. and y(i+1) in &active. 
     and y(i+2) in &active. and y(i+3) in &active. then do; 
      transition_to_active=1; 
      active_week=i; 
      leave; 
     end; 
    end; 
run; 

這裏transition_to主動「表示該人是否實現了由「被動」爲「主動」和「active_week」表示一週的人作出這種轉變的tranistion。 任何人都可以看到爲什麼持續時間的計算不適用於多種法術?

+0

你的數據,你對算法的描述和你的實現都有些不一致。示例記錄的所有start_week都設置爲活躍星期(從1開始)的索引,而不是所述的被動星期 - 您是否有描述倒退?爲什麼需要連續四個星期才能將轉換標記爲有效?請說明實際發生的情況,並解釋爲什麼這是不正確的,而不是僅僅說'出了什麼問題'。 –

回答

1

我認爲這能解決你的問題:

data input; 
input ID start_week y_1447 $ y_1448 $ y_1449 $ y_1450 $ y_1451 $ y_1452 $ y_1501 $; 
datalines; 
01 3 passive passive passive passive active active active 
02 5 other passive active active active passive active 
02 7 other passive active active active passive active 
; 
run; 

%let period = y_1447--y_1501; 
%let passive = 'passive'; 
%let active = 'active'; 

data want; 
set input; 
array y[*] . 
by ID; 

last_sw = lag(start_week); 
if first.id then 
    weeks = start_week-1; 
else do; 
    start = last_sw; 

    weeks = 0; 

    do i=start to start_week; 
     if y[i]= &passive then 
      weeks = weeks + 1; 
    end; 
end; 

drop start last_sw i; 
run; 

在最後START_WEEK啓動計數循環,計數「無源」的數量,當你到了新的START_WEEK停止。

如果這是第一次使用ID,那麼您只需要START_WEEK減去1即可得到週數直到開始。