Boxplot by groups&块,具有轴对齐的统计信息

时间:2015-12-23 16:37:19

标签: sas boxplot sas-gtl

我一直在按照组和时间点块为boxplot构建GTL模板。我怀疑SAS 9.4(TS Level 1M2)中的GTL还没有完全支持这种多维,轴对齐的BOXPLOT加BLOCKPLOT组合。

  • 如果我错了,我会对正确方法的建议表示赞赏。
  • 如果我是对的,我欢迎提出一个或多或少直接的GTL解决方案的建议。

下面的代码生成第一个图,但我真的想要第二个图。换句话说,我希望BLOCKPLOT支持与BOXPLOT(时间点和处理组)相同的两个x轴级别。但是,BLOCKPLOT只会在X轴(时间点)内堆叠CLASS(治疗组)。但是BOXPLOT将在块内沿着X轴分离GROUP。

我没有找到任何方法从BLOCKPLOT的“堆栈”方法切换到像BOXPLOT这样的“集群”方法。 (我也尝试过AXISTABLEs,但它们的行为类似于BLOCKPLOT。)

感谢您指出正确的方法或建议解决方案。

我已经看过的代表性讨论:

从9.4(TS1M2)代码绘制,如下: Plot from 9.4 (TS1M2) code, below

我想编码的显然操纵的情节: Obviously manipulated plot that I want from GTL

第一个剧情代码:

/* Set up test data structure, with few seed observations */
  proc sql;
    create table labstruct
      (  mygroup         char(3) label='Treatment Group'
       , myvisitnum      num     label='Visit number'
       , myvisitname     char(8) label='Visit name'
       , labtestname     char(8) label='Name of lab test'
       , labseed         num     label='Lab measurement seed'
       , lablow          num     label='Low end of normal range'
       , labhigh         num     label='High end of normal range'
      )
    ;
    insert into labstruct
      values('A', 1,  'Day 1',  'Test XYZ', 48, 40, 60)
      values('B', 1,  'Day 1',  'Test XYZ', 52, 40, 60)
      values('A', 5,  'Week 1', 'Test XYZ', 50, 40, 60)
      values('B', 5,  'Week 1', 'Test XYZ', 50, 40, 60)
      values('A', 10, 'Week 2', 'Test XYZ', 52, 40, 60)
      values('B', 10, 'Week 2', 'Test XYZ', 48, 40, 60)
    ;
  quit;

  /* Make more obs from the seeds above */
    data labdata;
      set labstruct;

      do repeat = 1 to 20;
        labvalue = labseed + 6*rannor(3297);
        if ranuni(59843)>0.1 then output;
      end;

      label labvalue = 'Lab measurement';
      drop repeat labseed;
    run;


/* Calculate summary stats, and merge onto lab data for use as "block" labels */
  proc summary data=labdata noprint;
    by myvisitnum mygroup;
    var labvalue;
    output out=labstats (drop=_type_) 
           n=n mean=mean std=std;
  run;

  /* Merge summary stats onto lab data, used in GTL template as "block" labels */
  data labdata;
    merge labdata (in=in_data)
          labstats (in=in_stats);
    by myvisitnum mygroup;
    label n      = 'n'
          mean   = 'Mean'
          std    = 'Std Dev';
  run;


proc template;
  define statgraph xalignedstats;
    dynamic _TRT _AVISIT _AVISITN _AVAL _STAT1 _STAT2 _STAT3;

    begingraph / border=false dataskin=none attrpriority=none;

      layout overlay / walldisplay=none ;

        innermargin / align=top separator=false pad=(top=0);
          blockplot x=_AVISITN block=_AVISIT /
                    display=(outline values) valuefitpolicy=split ;
        endinnermargin;

        boxplot x=_AVISITN y=_AVAL /
                group=_TRT groupdisplay=cluster clusterwidth=0.8 ;

        innermargin / align=bottom separator=false pad=(bottom=0);
          blockplot x=_AVISITN block=_TRT / class=_TRT label='Treatment' filltype=alternate;
          blockplot x=_AVISITN block=_STAT1 / class=_TRT label='n' filltype=alternate;
          blockplot x=_AVISITN block=_STAT2 / class=_TRT label='Mean' filltype=alternate;
          blockplot x=_AVISITN block=_STAT3 / class=_TRT label='Std Dev' filltype=alternate;
        endinnermargin;

      endlayout;

    endgraph;
  end;
run;

proc sgrender data=labdata template=xalignedstats;
  dynamic 
          _TRT     ='mygroup'
          _AVISITN ='myvisitnum' 
          _AVISIT  ='myvisitname' 
          _AVAL    ='labvalue'
          _STAT1   ='n'
          _STAT2   ='mean'
          _STAT3   ='std'
          ;
run;

1 个答案:

答案 0 :(得分:2)

至少其中的核心是可以回答的。如果您使用axistable而不是blockplot,则可以选择指定classdisplay=cluster,其行为与groupdisplay=cluster类似(为什么名称不同,不知道)。

proc template;
  define statgraph xalignedstats;
    dynamic _TRT _AVISIT _AVISITN _AVAL _STAT1 _STAT2 _STAT3;

    begingraph / border=false dataskin=none attrpriority=none;

      layout overlay / walldisplay=none ;

        innermargin / align=top separator=false pad=(top=0);
          blockplot x=_AVISITN block=_AVISIT /
                    display=(outline values) valuefitpolicy=split ;
        endinnermargin;

        boxplot x=_AVISITN y=_AVAL /
                group=_TRT groupdisplay=cluster clusterwidth=0.8 ;

        innermargin / align=bottom separator=false pad=(bottom=0);
          axistable x=_AVISITN value=_TRT / class=_TRT label='Treatment' classdisplay=cluster colorgroup=_TRT;
          axistable x=_AVISITN value=_STAT1 / class=_TRT label='n'  classdisplay=cluster colorgroup=_TRT;
          axistable x=_AVISITN value=_STAT2 / class=_TRT label='Mean' classdisplay=cluster colorgroup=_TRT;
          axistable x=_AVISITN value=_STAT3 / class=_TRT label='Std Dev' classdisplay=cluster colorgroup=_TRT;
        endinnermargin;

      endlayout;

    endgraph;
  end;
run;

你可能有更难的时间(或不可能的时间)使所有的格式正确,如交替的颜色,但这至少是一个开始。您可以考虑使用colorgroup使颜色与您的线条颜色相匹配,例如,尽管没有(很多/任何)控制背景填充。