在SAS中为单列表生成直方图

在SAS中为单列表生成直方图,sas,histogram,Sas,Histogram,我有一个只有一列的表,我希望根据表中的列生成一个直方图 age --- 22 33 40 74 ods graphics / reset width=6.4in height=4.8in imagemap; proc sgplot data=WORK.COMBINE; title height=14pt "Displaying maximum"; histogram age / showbins; density age; density age / typ

我有一个只有一列的表,我希望根据表中的列生成一个直方图

age
---
22 
33
40
74

ods graphics / reset width=6.4in height=4.8in imagemap;

proc sgplot data=WORK.COMBINE;
    title height=14pt "Displaying maximum";
    histogram age / showbins;
    density age;
    density age / type=Kernel;

run;

ods graphics / reset; title;

我面临的问题是,它没有显示对应y轴上的数字。虽然我只有一列,但我想显示具有最高数字的直方图,同时每个值在Y轴上保持其对应关系,但令我惊讶的是,即使是最高值也比最低值短,仅这4个数据值的直方图如下所示:

绘图例程计算存储箱的年龄范围以及存储箱中心的位置。计算是一些内部算法,您可以通过
直方图
语句选项
/binstart=binwidth=nbins=
对其进行控制

当然,柱状图条形图是用于存储箱的,高度根据落入存储箱的值的相对计数进行缩放。y轴将为实际计数或计数百分比。您将4个值分为3个存储箱,因此其中一个存储箱的计数为2(或50%=2/4)。最高值栏比最低值栏短,因为高值比低值少

当您有更多数据时会发生什么

这里有一些代码,创建了250个符合正态分布的值,并对它们进行了直方图分析,还显示了累积频率针图

data work.have;
  do personid = 1 to 250;
    do until (18 <= age <= 60);
      age = floor(18 + (32 + sqrt(62) * rannor(123)));
    end;
    output;
  end;
run;

proc freq noprint data=have;
  table age / out=freq outcum;  * data for needle plot;
run;

proc sgplot data=have;
    title height=14pt "Default bins";
    histogram age / showbins;
    density age;
    density age / type=Kernel;
run;

proc sgplot data=have;
    title height=14pt "binstart=20 binwidth=2";
    histogram age / showbins binstart=20 binwidth=2;
    density age;
    density age / type=Kernel;
run;

proc sgplot data=freq;
    title height=10pt "cum_freq needle plot of data from Proc FREQ output";
    needle x=age y=cum_freq;
run;

对于在不同类别组中查看变量分布的情况,您可能希望升级到SGPANEL:

data work.have2;
  do year = 2017, 2018;
  do group = 'Team A', 'Team B', 'Team C';
  do _n_ = 1 to 250;
    personId + 1; 
    do until (18 <= age <= 95);
      age = floor(6 + (32 + sqrt(95) * rannor(123)));
    end;
    output;
  end;
  end;
  end;
run;

ods graphics / reset;

title;
proc sgpanel data=have2;
  panelby year group / layout=lattice;
  histogram age;
  xaxis 
run;
datawork.have2;
do年=2017年、2018年;
do组=‘A队’、‘B队’、‘C队’;
do=1至250;
personId+1;

直到(18仅使用这4个数据值,直方图如下所示:

绘图例程计算箱子的年龄范围和箱子中心的位置。计算是一些内部算法,您可以通过
直方图
语句选项
/binstart=binwidth=nbins=
对其进行控制

当然,柱状图条是针对存储箱的,高度按存储箱中的值的相对计数进行缩放。y轴将是实际计数或计数百分比。您有4个值落在3个存储箱中,因此其中一个存储箱的计数为2(或50%=2/4)。最高值栏比最低值栏短,因为高值比低值少

当您有更多数据时会发生什么

这里有一些代码,创建了250个符合正态分布的值,并对它们进行了直方图分析,还显示了累积频率针图

data work.have;
  do personid = 1 to 250;
    do until (18 <= age <= 60);
      age = floor(18 + (32 + sqrt(62) * rannor(123)));
    end;
    output;
  end;
run;

proc freq noprint data=have;
  table age / out=freq outcum;  * data for needle plot;
run;

proc sgplot data=have;
    title height=14pt "Default bins";
    histogram age / showbins;
    density age;
    density age / type=Kernel;
run;

proc sgplot data=have;
    title height=14pt "binstart=20 binwidth=2";
    histogram age / showbins binstart=20 binwidth=2;
    density age;
    density age / type=Kernel;
run;

proc sgplot data=freq;
    title height=10pt "cum_freq needle plot of data from Proc FREQ output";
    needle x=age y=cum_freq;
run;

对于在不同类别组中查看变量分布的情况,您可能希望升级到SGPANEL:

data work.have2;
  do year = 2017, 2018;
  do group = 'Team A', 'Team B', 'Team C';
  do _n_ = 1 to 250;
    personId + 1; 
    do until (18 <= age <= 95);
      age = floor(6 + (32 + sqrt(95) * rannor(123)));
    end;
    output;
  end;
  end;
  end;
run;

ods graphics / reset;

title;
proc sgpanel data=have2;
  panelby year group / layout=lattice;
  histogram age;
  xaxis 
run;
datawork.have2;
do年=2017年、2018年;
do组=‘A队’、‘B队’、‘C队’;
do=1至250;
personId+1;

直到(18)你的问题很难理解。我认为你可能误解了直方图的y轴,或者你可能需要不同类型的绘图。如果你运行代码并在sashelp.class(或其他sashelp数据集之一)中制作身高或体重的直方图,它看起来像你期望的吗?是的,但在我的情况下,它不起作用。你能发布一个你的数据示例吗,可能是10-20条记录,其中直方图与你期望的不匹配?你能添加一张创建的输出图片吗?你在寻找累积频率图吗?@Richard是的,我只使用年龄作为示例。我做了一个不同的测试计算4个表并创建一个表,该表具有一个名为count的字段名和44、47、68和73的尊重值。您的问题很难理解。我认为您可能误解了直方图的y轴,或者您可能需要不同类型的绘图。如果您运行代码并在sashelp.class中生成身高或体重的直方图(或其他sashelp数据集之一),它看起来像你期望的吗?是的,但在我的情况下,它不起作用。你能发布一个你的数据示例吗,可能是10-20条记录,其中直方图与你期望的不匹配?你能添加一张创建的输出图片吗?你在寻找累积频率图吗?@Richard是的,我只使用年龄作为示例。我做了一个不同的测试对4个表进行计数,并创建了一个表,其中一个字段名为count,另一个字段名为44、47、68和73。这是一个非常可爱的表,但如果我想将其用于其他数据,请使用count->44、47、68、73。因为您给出的条件是年龄,但在没有像count这样的范围的情况下,是否有人可以将其范围从1到100?Y您可以仅使用箱数来控制年龄轴的范围
直方图年龄/showbins binstart=0 nbins=50;
SGPLOT将计算轴tic标记数,以使其合理匹配。SGPLOT语句
XAXIS min=max=
还控制绘制直方图的水平轴。好的,谢谢,但请您帮助我们o反映在你上面提供的答案中。感谢这是一个可爱的答案,但如果我想将其用于其他数据,请计数->44、47、68、73。因为你给出的条件是年龄,但在没有像计数那样的范围的情况下,有人能将其范围从1-100吗?你可以只使用箱数来控制年龄轴的范围
histogram age/showbins binstart=0 nbins=50;
SGPLOT将计算轴tic标记编号,使其合理匹配。SGPLOT语句
XAXIS min=max=
还控制绘制直方图的水平轴。好的,谢谢,但请您在上面提供的答案中反映出来。谢谢