Макрос SAS для среднего изменения базовых значений - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть следующие данные:

Patient     Visit         VisitNumber    LAB        LABVALUE
001         BASELINE      1              LAB1       10
001         DAY 100       2              LAB1       15
001         DAY 200       3              LAB1       12
002         BASELINE      1              LAB1       11
002         DAY 100       2              LAB1       14
002         DAY 200       3              LAB1       12
001         BASELINE      1              LAB2       40
001         DAY 100       2              LAB2       45
001         DAY 200       3              LAB2       42
002         BASELINE      1              LAB2       41
002         DAY 100       2              LAB2       44
002         DAY 200       3              LAB2       42

Я хотел бы создать следующую таблицу, которая суммирует переменную 'LABVALUE' для всех пациентов при каждом посещении (Таблица 2):

Visit       VisitNumber       LAB         MEAN            BASELINEMEAN        CHANGEBASEMEAN
BASELINE    1                 LAB1        10.5            10.5                .
DAY 100     2                 LAB1        14.5            10.5                4
DAY 200     3                 LAB1        12              10.5                1.5
BASELINE    1                 LAB2        40.5            40.5                .
DAY 100     2                 LAB2        44.5            40.5                4
DAY 200     3                 LAB2        42              40.5                1.5

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

proc sort data=have;
  by patient lab visitnumber;
run;

data for_report;

  set have;
  by patient lab;

  retain base_visitnum base_labvalue;

  if first.patient then do;
    base_visitnum = .;
    base_labvalue = .;
  end;

  if first.lab and visit='BASELINE' then do;
    base_visitnumber = visitnumber;
    base_labvalue = labvalue;
  end;

  if not first.lab then do;
    delta_labvalue = labvalue - base_labvalue;
  end;

run;

Это генерирует следующую таблицу:

   LAB      Visit     VisitNumber       LABVALUE        BASE_VISITNUM      BASE_LABVALUE   DELTA_LABVALUE
   LAB1     BASELINE  1                 10              1                  10              .
   LAB1     DAY 100   2                 15              1                  10              5
   LAB1     DAY 200   3                 12              1                  10              2 
   LAB1     BASELINE  1                 11              1                  11              .
   LAB1     DAY 100   2                 14              1                  11              3
   LAB1     DAY 200   3                 12              1                  11              1
   LAB2     BASELINE  1                 40              1                  10              .
   LAB2     DAY 100   2                 45              1                  10              5
   LAB2     DAY 200   3                 42              1                  10              2 
   LAB2     BASELINE  1                 41              1                  11              .
   LAB2     DAY 100   2                 44              1                  11              3
   LAB2     DAY 200   3                 42              1                  11              1

Любое понимание как как я могу сгенерировать таблицу 2 будет принята с благодарностью.

1 Ответ

1 голос
/ 08 апреля 2020

Это даст вам большую часть пути:

proc sql noprint;
  create table table2 as
    select visit,
           visitnumber,
           lab,
           mean(value) as mean,
           mean(base_labvalue) as baselinemean
    from for_report
    group by visit, visitnumber, lab
  ;
quit;

Я оставил некоторые детали для вас, чтобы завершить: -)

Кроме того, обратите внимание на несоответствие между base_visitnum и base_visitnumber в вашем примере кода.

...