Отметить пациентов, потерянных для наблюдения после их первого события - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь найти пациентов, которые потеряли для наблюдения (навсегда или временно) после их первого события. Итак, у нас есть дата события (edate) и общее количество дней регистрации для каждого года (от regdays_09 до regdays_12). Я хочу отметить пациентов, которые зарегистрировались менее 365 дней в году или пропустили зарегистрированный год. Я очень ценю любую помощь с этим.

data Want;  
informat edate date7.;  
format edate date7.;  
input ID edate regdays_09 regdays_10 regdays_11 regdays_12 flag  
CARDS;  
100 06jan09 365  365  365   365  0   
101 10APR09 365  365   .      .  1  
102 23Mar09 180   .    .      .  1  
103 03Sep09 365   .   365   365  1  
104 20Aug09 300   .     .   365  1  
run; 

Ответы [ 3 ]

0 голосов
/ 23 февраля 2020

Сначала подумайте, что в 2012 году 366 дней, поэтому все вы, пациенты, потерпели неудачу. Вы можете написать дерево решений, которое может быть реализовано как набор вложенных IF-THEN-ELSE. если первый год имеет один или несколько дней, мы должны проверить, что все последующие годы заполнены полностью. Если в первые годы нет записанных дней, сделайте то же самое для следующего года и т. Д.

IF regdays_09>0 THEN DO;
  IF regdays_10=365 AND regdays_11=365 AND regdays_12=366 THEN flag=0;
  ELSE flag=1;
END;ELSE IF regdays_10>0 THEN DO;
  IF regdays_11=365 AND regdays_12=366 THEN flag=0;
  ELSE flag=1;
END;ELSE IF regdays_11>0 THEN DO;
  IF regdays_12=366 THEN flag=0;
  ELSE flag=1;
END;ELSE flag=0;

Теперь, когда вы станете более опытным в программировании, вы можете попробовать то же самое с вложенными циклами.

0 голосов
/ 25 февраля 2020

Спасибо всем! На основании комментариев, которые я получил здесь, а также комментария от ShiroAmanda по другому вопросу, я получил следующий код, который я хотел:

data have;  
informat edate date7.;  
format edate date7.;  
input ID edate regdays_09 regdays_10 regdays_11 regdays_12;
CARDS;  
100 06jan09 365  365  365   365 
101 10APR09 365  365   .      . 
102 23Mar09 180   .    .      . 
103 03Sep09 365   .   365   365 
104 20Aug10 300   .     .   365 
105 10Sep12  .   365  365   365
106 12sep11  .   360  365   360
 run;

data want (drop=x i mval: start);
  set have;
ARRAY Mval {4} (2009,2010,2011,2012); 
ARRAY Mvar {4}  regdays_09 regdays_10 regdays_11 regdays_12; 
do i=1 to dim(mval);
  if year(edate)=mval(i) then 
    do x=i to dim(mval); start=i;
      totalsum=sum(totalsum,mvar(x));
    end; 
    if totalsum<(dim(mval)-start+1)*365 then flag=1;else flag=0;
end;
run;
0 голосов
/ 19 февраля 2020

Если я вас правильно понимаю:

data have;  
informat edate date7.;  
format edate date7.;  
input ID edate regdays_09 regdays_10 regdays_11 regdays_12;
CARDS;  
100 06jan09 365  365  365   365 
101 10APR09 365  365   .      . 
102 23Mar09 180   .    .      . 
103 03Sep09 365   .   365   365 
104 20Aug09 300   .     .   365 
run;

data want;
   set have;
   flag = (sum(of regdays:) ne 4*365);
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...