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;
生产
我需要呈现一个线性 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;
这是输出:
这里的问题是 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;
生产