如何使用短格式数据创建重叠直方图 sas?

How to create overlaid histograms sas with short format data?

我有这样的数据:

var1  target
1.2   X
2     Y
2.3   Z

我想用百分比覆盖直方图,看起来像这样:

图表可以堆叠,只要它们是可比较的。我已经试过了,但它不起作用:

proc univariate data=mydata;
  var var1;
  by target;
  histogram;
run;

将它们放在一个面板中非常容易:

data have_data;
  call streaminit(7);
  do _j = 1 to 1e3;
      do _i = 1 to 3;
        target=byte(_i+120);
        var1=rand('Normal',_i,0.5);
        output;
      end;
  end;
run;

proc sgpanel data=have_data;
  panelby target/columns=1;
  histogram var1;
  density var1;
run;

当然,这不是重叠的。覆盖更具挑战性,我认为需要一些额外的步骤。

要进行叠加,最简单的选择可能是将 var1 拆分为三个变量,每个目标值一个。 (对于其他目标值,它可以为空。)然后在一个 SGPLOT 调用中创建三个直方图和密度图。

data want;
  set have_Data;
  array vars[3];
  vars[rank(target)-120] = var1;
run;
title;
proc sgplot data=want noautolegend;
  histogram vars1/name='x' legendlabel='x';
  histogram vars2/name='y' legendlabel='y';
  histogram vars3/name='z' legendlabel='z';
  density vars1;
  density vars2;
  density vars3;
  keylegend 'x' 'y' 'z'/position=top;
run;

我想你也可以使用 gtl 来做到这一点,如果你知道 and/or 很乐意学习它,因为它允许你叠加直方图,如果需要的话我可能会嘲笑有事。

在 SAS 9.4m3 中,OVERLAY 选项被添加到 PROC UNIVARIATE 的 HISTOGRAM 语句中。这意味着您现在可以直接从 PROC UNIVARIATE 获取所需的图表:

proc Univariate data=sashelp.iris;
class Species;
var SepalLength;
histogram SepalLength / kernel overlay;
run;

在 PROC SGPLOT 中,SAS 9.4m2 引入了对 HISTOGRAM 语句中 GROUP= 选项的支持。因此,如果您更喜欢 PROC SGPLOT,则可以将数据转换为长格式并使用 GROUP= 选项。

proc sgplot data=sashelp.iris;
histogram SepalLength / group=Species  transparency=0.5;
density SepalLength/ group=Species type=kernel;
run;

有关叠加和镶嵌直方图的更多信息,请参阅文章 "Comparative histograms: Panel and overlay histograms in SAS"