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

Я ищу способ распечатать изменение результатов тестов по каждому предмету с помощью макроса SAS. Вот образец данных:

Subject    Visit       Date       Test       Score
001        Baseline    01/01/99   Jump       5
001        Baseline    01/01/99   Reach      3
001        Week 6      02/12/99   Jump       7
001        Week 6      02/12/99   Reach      6
002        Baseline    03/01/99   Jump       2
002        Baseline    03/01/99   Reach      4
002        Week 6      04/12/99   Jump       5
002        Week 6      04/12/99   Reach      9

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

Subject    Visit       Date (Days from Baseline)       Test       Score    Change from Baseline Score
001        Baseline    01/01/99                        Jump       5         
                       01/01/99                        Reach      3         
001        Week 6      02/12/99    (42)                Jump       7        +2
                       02/12/99    (42)                Reach      6        +3
002        Baseline    03/01/99                        Jump       2
                       03/01/99                        Reach      4
002        Week 6      04/12/99    (42)                Jump       5        +3
                       04/12/99    (42)                Reach      9        +5

Полагаю, я могу просто использовать функцию INTCK для Дней от базовой линии, но я не уверен, как распечатать каждый тест, не сохраняя значения «Тема» и «Посещение» в каждой строке. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Вы можете сортировать по тестам и обрабатывать, используя сохранение для даты и оценки для вычисления дельт. Распечатку можно выполнить с помощью Proc REPORT, соответственно форматируя значения дельты.

Пример:

data have; input 
Subject    Visit& $8.  Date& mmddyy8. Test $ Score; format date mmddyy8.; datalines;
001        Baseline    01/01/99   Jump       5
001        Baseline    01/01/99   Reach      3
001        Week 6      02/12/99   Jump       7
001        Week 6      02/12/99   Reach      6
002        Baseline    03/01/99   Jump       2
002        Baseline    03/01/99   Reach      4
002        Week 6      04/12/99   Jump       5
002        Week 6      04/12/99   Reach      9
run;

proc sort data=have;
  by subject test date;
run;

data for_report;

  set have;
  by subject test;

  retain base_date base_score;

  if first.subject then do;
    base_date = .;
    base_score = .;
  end;

  if first.test and visit='Baseline' then do;
    base_date = date;
    base_score = score;
  end;

  if not first.test then do;
    delta_days = intck('days', date, base_date);
    delta_score = score - base_score;
  end;

run;


proc format;
  picture plus low-0 = [best12.] other = '000000009' (prefix='+');

options missing=' ';
proc report data=for_report;
  columns subject visit date delta_days test score delta_score;
  define subject / order;
  define visit / order order=data;
  format delta_days negparen.; 
  format delta_score plus.;
run;
options missing='.';

enter image description here

Альтернативный отчет может быть более предметно-ориентированным:

proc report data=for_report
  style(lines) = [just=left fontweight=bold]
;
  columns subject visit date delta_days test score delta_score;
  define subject / order noprint;
  define visit / order order=data;
  format delta_days negparen.; 
  format delta_score plus.;
  compute before subject;
    subj = catx(' ', "Subject:", subject);
    line subj $200.;
  endcomp;
run;

enter image description here

1 голос
/ 01 июля 2019

Вот один из способов сделать это.SQL-шаг вычисляет изменения от базовой линии.Конструкция case-when-only предназначена только для подавления нулей в выходных данных.

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

Я поместил код в макрос, так как это был вопрос.Однако на самом деле это мало что дает.

/*  Creating test data*/
data testdata;
    input Subject $3.  @5 Visit $8.  @17 Date mmddyy10. @28 Test $5. Score;
    format date mmddyy10.;
datalines;
001 Baseline    01/01/99   Jump       5
001 Baseline    01/01/99   Reach      3
001 Week 6      02/12/99   Jump       7
001 Week 6      02/12/99   Reach      6
002 Baseline    03/01/99   Jump       2
002 Baseline    03/01/99   Reach      4
002 Week 6      04/12/99   Jump       5
002 Week 6      04/12/99   Reach      9
;

%macro baselines(dataset=);
    /*  Adding days from baseline and change from baseline. Please note that the first visit 
    must denoted as exactly "Baseline"*/
    proc sql;
        create table changes as 
        select t1.*, case when t1.date-t2.date>0 then t1.date-t2.date else . end  as days 
            "Days from baseline", case when t1.score-t2.score>0 then t1.score-t2.score else . 
            end as score_change "Change from Baseline"
        from &dataset as t1 left join (select * from &dataset where visit="Baseline") as t2
            on t1.subject=t2.subject and t1.test=t2.test
        order by subject, visit, test;

    /*  Printing the dataset. The use of subject and visit as group variables keeps SAS from repeating the values*/
    title "Changes based on the dataset &dataset";
    proc report data=changes;
        column subject visit days test score score_change;
        define subject / group;
        define visit / group;
    run;
%mend;
%baselines(dataset=testdata)
...