首页 > 解决方案 > SAS 宏打印出基线分数的变化

问题描述

我正在寻找一种使用 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 函数,但我不确定如何在不保留每行中的“主题”和“访问”值的情况下打印每个测试。任何帮助将非常感激。

标签: arraysloopssas

解决方案


您可以使用保留日期和分数来计算增量,按测试和流程进行排序。可以使用 打印输出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='.';

在此处输入图像描述

备用报告可以更加以主题为中心:

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;

在此处输入图像描述


推荐阅读