x 轴在 SAS 中应与时间成比例

x-axis should be time-proportional in SAS

我需要呈现一个线性 x 轴,这意味着时间点之间的距离需要与时间成比例。我完成了以下代码:

/*Produce mean +/- SD plot with line graph*/
proc sgplot data=adpc;
vline hours /response=value group=dose stat=mean limitstat=stderr;
xaxis label='Hours post dose';
yaxis label='Mean +/- SD';
run;

这是输出: x 轴具有变量 hours,其值为 0、1、2、3、4、6、8、24(小时)。我认为与时间成比例,意味着它应该在观察之间具有相等的范围。例如,x 轴应该是 0,2,4,6,8,10,12,14,16,18,20,22,24(不确定时间比例是什么意思)。 我应该添加什么?

这里的问题是 VLINE 是分类图 - 类似于条形图,但有线条。所以 X 轴是分类轴!使分类轴成比例的唯一方法是不跳过任何类别。

最好使用 series 或类似的方法,它使用数字轴。

这是一个使用虚构数据的示例(请在以后提供!)和一个 HIGHLOW 来添加您的柱状图。

data adpc;
call streaminit(7);
do dose = 1,5,10,100;
    do _i = 1 to 100;
        hours = rand('Integer',1,8);
        if hours in (5,7) then hours=24;
        value = rand('Uniform')*100*log(dose+1);
        output;
    end;
end;
run;
proc means data=adpc nway;
  class dose hours;
  var value;
  output out=adpc_mean mean(value)=value stderr(value)=std;
run;

data adpc_calc;
  set adpc_mean;
  std_high = value+std;
  std_low  = value-std;
run;


proc sgplot data=adpc_calc;
  series x=hours y=value/group=dose;
  highlow x=hours high=std_high low=std_low/ lowcap=serif highcap=serif;
  xaxis values=(1,2,3,4,6,8,24);
run;

您是否尝试过在 XAXIS 语句中明确指定值?

您需要将它们全部列出,但这应该会给您一个想法:

xaxis label='Hours post dose' values = ("0" "2" "4" "6" "8" "10" "12" ... "24");

编辑:这个使用来自@Joe 的假数据的更简化版本效果很好。

data adpc;
call streaminit(7);
do dose = 1,5,10,100;
    do _i = 1 to 100;
        hours = rand('Integer',1,8);
        if hours in (5,7) then hours=24;
        value = rand('Uniform')*100*log(dose+1);
        output;
    end;
end;
run;

proc sgplot data=adpc;
vline hours /response=value group=dose stat=mean limitstat=stderr;
xaxis label='Hours post dose' values = (0 to 24 by 2);
yaxis label='Mean +/- SD';
run;

将选项 type=time 添加到您的 XAXIS 语句中。您还需要使用 values= 选项来明确说明要勾选的剂量值。

示例:

proc sgplot data=have;
vline hours /response=value group=dose stat=mean limitstat=stderr;
xaxis label='Hours post dose' 
   type=time values=(0 to 4,6,8,24)  /* added to xaxis statement */
;
yaxis label='Mean +/- SD';
run;

完整示例:

data have;
  call streaminit(2021);
  do patid = 1 to 500;
    dose = int( (patid-1) / (500/4) );
    do hours = 0 to 4, 6, 8, 24;
      select (dose);
        when (0) value = hours/24 * 25;
        when (1) value = hours/24 * 45;
        when (2) value = ifn (hours<6, hours/6 * 100, 100 - hours/24 * 25);
        when (3) value = ifn (hours<6, hours/6 * 250, 250);
        otherwise;
      end;

      base = value;
      jitter = rand('uniform') * hours;
      value = min(jitter * value, 250);

      output;
    end;
  end;
run;

ods html file='vline.html';

proc sgplot data=have;
vline hours /response=value group=dose stat=mean limitstat=stderr;
xaxis label='Hours post dose' type=time values=(0 to 4,6,8,24);
yaxis label='Mean +/- SD';
run;

ods html close;

生产