Как структурировать данные для анализа повторяющихся событий в SAS по классам - PullRequest
0 голосов
/ 23 октября 2018

Я хотел бы структурировать свой длинный набор данных (множество записей на один идентификатор), чтобы создать интервалы для выполнения модели пропорциональных рисков Кокса в SAS (анализ повторяющихся событий).У меня есть широкие и длинные случаи, рассчитанные как дни от даты рождения, а также даты посещения.Я хочу, чтобы последний верхний интервал представлял последний последующий период времени, будь то широкий / длинный случай или посещение.Если широких или длинных вхождений нет вообще, мы принимаем дату последнего посещения в качестве верхнего интервала.

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

id  Class   DOB O_Date  Visit_Date  O_Time  Visit_Time  Time_Interval_O Episode_Sum Episode_Wide    Episode_Long    _freq_  Lower_O Upper_O Status
4       6/7/2011    .   7/15/2011   0   38  0   0   .   .   1   0   38  0
108 Long    7/15/2011   8/30/2011   11/23/2011  46  131 0   1   1   1   73  0   46  1
108 Wide    7/15/2011   9/16/2011   11/23/2011  63  131 46  2   2   1   1   46  63  1
108 Wide    7/15/2011   11/23/2011  11/23/2011  131 131 63  3   3   1   1   63  131 1
108 Wide    7/15/2011   11/15/2012  11/23/2011  489 131 131 4   4   1   1   131 489 1
108 Wide    7/15/2011   12/27/2012  11/23/2011  531 131 489 5   5   1   2   489 531 1
409 Long    6/23/2011   10/2/2011   10/22/2012  101 487 0   1   0   1   1   0   101 1
409 Wide    6/23/2011   3/22/2012   10/22/2012  273 487 101 1   1   2   2   101 273 1
409 Wide    6/23/2011   3/22/2012   10/22/2012  273 487 .   2   1   2   .   273 487 0
545 Long    7/9/2011    5/24/2012   1/31/2012   320 206 0   1   1   1   9   0   320 1

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

Из общего набора данных вхождений я хочу, чтобы версия длинных вхождений выглядела следующим образом:

id  Class   DOB O_Date  Visit_Date  O_Time  Visit_Time  Time_Interval_O Episode_Sum Episode_Wide    Episode_Long    _freq_  Lower_O_Long    Upper_O_Long    Status
4       6/7/2011    .   7/15/2011   0   38  0   0   .   .   1   0   38  0
108 Long    7/15/2011   8/30/2011   11/23/2011  46  131 0   1   1   1   73  0   46  1
108 Wide    7/15/2011   9/16/2011   11/23/2011  63  131 46  2   2   1   1   46  531 0
409 Long    6/23/2011   10/2/2011   10/22/2012  101 487 0   1   0   1   1   0   101 1
409 Wide    6/23/2011   3/22/2012   10/22/2012  273 487 101 1   1   2   2   101 273 1
409 Wide    6/23/2011   3/22/2012   10/22/2012  273 487 .   2   1   2   .   273 487 0
545 Long    7/9/2011    5/24/2012   1/31/2012   320 206 0   1   1   1   9   0   320 1

Это частичный код, который я использовал для создания переменных в общем наборе данных.Переменная FREQ отсутствует, если строка была добавлена ​​к окончательному набору данных.Это необходимо для того, чтобы интервал включал время последнего посещения верхнего времени.Как бы я достиг желаемой таблицы данных для длинных и широких отдельно?

data O1; set O1;
O_time = intck('DAY', dob, O_Date, 'D');
Visit_time = intck('DAY', _dob, Visit_date, 'D');
if Visit_time ne .;

/*Accounting for occurrences when born*/
if dob=O_date then O_time=1;

time_interval_O = lag(O_time);
run;

proc sort data=O1; by baby_id Episode_sum; run;

Data O2; set O1; 
by baby_id; 
if first.baby_id then time_interval_O=0;

lower_O = time_interval_O;
upper_O = O_time;

if Episode_sum =0 then upper_O = O_time; 
if Episode_sum >0 then status=1; else status=0;
if upper_O >Visit_time then status=1;
run;

Data O3; set O2;

if _freq_=. and O_time < Visit_time then lower_O = O_time;
if _freq_=. and O_time < Visit_time then upper_O = Visit_time;
run;
...