как упорядочить набор данных SAS в хронологическом порядке пары даты начала / окончания - PullRequest
1 голос
/ 10 апреля 2020

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

Ниже приведен пример небольшой части моего набора данных, где PATID - это идентификатор участника, x1DRG - препарат (1 или 2), x1SDT - дата, когда они начали принимать этот препарат, а x1EDT - дата, когда они остановились. То же самое для остальных столбцов.

Так, например, для первой записи x1DRG = 2 (участник принимал препарат 2), начиная с X1SDT = 11/6/2019, без x1EDT (имеется в виду, что он в настоящее время его принимает), x2DRG по-прежнему 2, препарат был начат в x2SDT = 7/7/2016, препарат был прекращен в x2EDT = 1/9/2017, и наконец x3DRG (все еще 2) был снова запущен в x3SDT = 1/9/2017 и закончился в x3EDT = 6/5 / 2018.

То, что я хочу сделать, это посмотреть, сколько участников остановили исследуемый препарат, основываясь на этих датах начала и окончания. Таким образом, в конечном итоге я получу набор данных SAS с идентификатором участника, столбец STOP с 1 или 0, в зависимости от того, остановил ли он препарат или нет, столбец DRUG с наркотиком, который был остановлен (1 или 2), столбец с CURRENT. Наркотик он включен, если он не остановился, и столбец с датой остановки, когда он остановил препарат, если он остановил его. Так, например, для PATID 1 столбец STOP будет равен 0 (не останавливать его), CURRENT DRUG будет равен 2, STOP DATE будет пустым, поскольку он все еще принимает лекарство 2. Для PATID 6 у нас будет STOP: 1 (он остановился), DRUG будет равно 1, CURRENT DRUG будет пустым (в настоящее время не принимается наркотик), DOP STOP будет 24.11.2009.

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

Однако проблема в том, что для некоторых участников (строки, выделенные красным цветом, интервалы 1, 7, 8, 9), как видно, последовательность дат начала и окончания не в хронологическом порядке. Например, для участника 1 самая старая дата начала в последовательности - x2SDT (12/7/2016), когда он впервые начал принимать препарат 2, затем он остановился на x2EDT (9 января 2017 г.), а затем снова начал на x3SDT ( 09.01.2017), остановился на x3EDT (05.06.2008) и, наконец, снова запустился на x1SDT (06.11.2017) и в настоящее время принимает препарат 2, так как x1EDT нет. Таким образом, в этом и многих других случаях x1SDT не соответствует самой старой дате, как и должно быть, поэтому вам нужно визуально проверить последовательность и выяснить, какой порядок правильный, и на основании этого решить, находится ли он еще на наркотике. или нет .. Теперь, учитывая, что у меня около 500 записей, я, очевидно, не хочу (и не имею времени) вручную go просмотреть все из них и принять решение. Я думал об этом уже несколько дней, но, к сожалению, я все еще на довольно начальном уровне c для начинающих с SAS и не понял, как решить эту проблему программно. Если у кого-нибудь есть пример кода / предложения для меня, я буду очень признателен!

enter image description here

Итак, я думаю о заключительном наборе данных, который я может получить что-то подобное, может быть? Хотя я не уверен, что это возможно, так или иначе, окончательный формат не должен иметь большого значения, пока я могу заставить программу дать мне то, что мне нужно. enter image description here

1 Ответ

0 голосов
/ 11 апреля 2020

Предполагается, что грязные данные были импортированы из Excel в SAS.

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

data have; * slightly tweaked data;
attrib
  patid length=8
  x1drg informat=best8. x1sdt x1edt format=mmddyy10. informat=anydtdte.
  x2drg informat=best8. x2sdt x2edt format=mmddyy10. informat=anydtdte.
  x3drg informat=best8. x3sdt x3edt format=mmddyy10. informat=anydtdte.
  x4drg informat=best8. x4sdt x4edt format=mmddyy10. informat=anydtdte.
  x5drg informat=best8. x5sdt x5edt format=mmddyy10. informat=anydtdte.
  x6drg informat=best8. x6sdt x6edt format=mmddyy10. informat=anydtdte.
;
infile datalines missover;
input patid -- x6edt;
datalines;
1 2 11/06/2019 .           2 12/07/2016 01/09/2017  2 01/09/2017 06/05/2018
2 2 11/06/2019 .           . .          .           . 
3 1 01/06/2019 .           . .          .           .
4 2 12/20/2019 02/12/2020  1 03/03/2020 .           .
5 1 11/11/2019 .           . .          .           .
6 1 06/03/2019 11/15/2019  1 11/24/2019 11/24/2019  .
7 2 03/27/2019 .           2 05/08/2018 03/27/2019  2 04/18/2018 05/08/2018  2 04/12/2018 04/18/2018
8 1 06/25/2019 .           2 06/07/2019 06/24/2019  2 01/16/2019 06/07/2019  1 09/20/2018 01/15/2019
9 2 08/09/2019 12/06/2019  2 05/08/2019 08/08/2019  2 12/07/2019 12/07/2019  2 12/08/2019 01/15/2020  2 01/16/2020 01/19/2020  2 01/25/2020 .
;

Вы хотите преобразовать данные в структуру с четырьмя столбцами; PatId drug start_dt end_dt. Proc TRANSPOSE не имеет синтаксиса для прямого поворота построчных N групп из M столбцов в N строк из M столбцов. Вы можете использовать подход под названием DATA step ARRAY pivoting . Эту фразу вы можете найти в документах конференции, но не в документации SAS.

Пример:

6 групп из 3 переменных следует поворачивать по строкам. Используйте 3 массива по 6 элементов в каждом, чтобы упорядочить исходные переменные для легкого изменения формы.

* transpose by data step array method;
data have_categorical;
  set have;

  array drugs  x1drg x2drg x3drg x4drg x5drg x6drg;
  array starts x1sdt x2sdt x3sdt x4sdt x5sdt x6sdt;
  array ends   x1edt x2edt x3edt x4edt x5edt x6edt;

  do index = 1 to dim(drugs);
    drug = drugs(index);
    start_dt = starts(index);
    end_dt = ends(index);

    if not missing(drug) then OUTPUT;
  end;

  attrib start_dt end_dt format=yymmdd10. informat=anydtdte.;

  keep patid drug start_dt end_dt;
run;

Когда данные представлены в категориальной форме, вы можете выполнить BY групповую обработку на шаге DATA, шаг PRO C или SQL.

Ваши диапазоны дат выглядят взаимоисключающими - другими словами, нет диапазонов дат, которые перекрывают другие. Обработка усложняется, если возможны совпадения. Более того, выясняется, что пациент имеет только ОДНО активное лекарственное средство, у которого отсутствует конечная дата.

Сортируйте данные, чтобы исключить исходное упорядочение даты волей-неволей.

proc sort data=have;
  by patid start_dt end_dt;
run;

Использование BY групповая обработка для присвоения упорядоченного по порядку номера последовательности, а также переменных состояния и флагов для последнего диапазона дат пациента.


data want;
  set have;
  by patid;

  if first.patid
    then seqNum = 1;  * row is first date range for patid, reset sequence number;
    else seqNum + 1;  * row is next date range for patid, increment sequence number;

  if last.patid then do;
    * set the flag value at the last date range of patid;
    * presume EDT will be either missing (open range, still using), or
    * the date when usage stopped;

    stop_date = EDT;

    if missing(EDT) then do;
      STOP = 0;
      CURRENT_DRUG = DRUG;
    end;
    else 
       STOP = 1;
  end;

  format stop_date mmddyy10. seqnum stop current_drug 4.;
run;
...