SAS: построение дат без учета выходных с использованием PROC SGPLOT
Я использую SAS 9.3 и пытаюсь создать график с использованием PROC SGPLOT, в котором (1) отображаются только даты, содержащиеся в моем наборе данных, в качестве последовательных дат (т. Е. Исключая выходные и праздничные дни), а (2) отображается полезная информация о XAXIS (например, первый день месяца). Я могу сделать оба из них по отдельности, но я не могу придумать, как это сделать вместе. В частности, параметры VALUE и TICKVALUEFORMAT, кажется, отключены, когда я использую параметр DISCRETE (я не вижу никакого обсуждения этого в документации).
Итак, у меня есть 2 вопроса:
(1) Есть ли способ решить это взаимодействие между опцией DISCRETE и VALUES / TICKVALUES?
(2) Есть ли лучший способ сделать то, что я пытаюсь сделать?
(ИДЕАЛЬНО было бы построить графики переменных X и Y и использовать третью переменную в качестве метки для оси X, но я не могу найти способ сделать это.)
Вот пример кода, который иллюстрирует это; если исключить выходные / праздничные дни, то код должен отображать прямую линию (я приложил графики, сгенерированные ниже):
*Create Dataset of Weekdays, dropping some holidays;
data weekdays (where=(weekday~=1 and weekday~=7 and date~="01JAN1960"d));
format date date9.;
do i=0 to 100;
date=i;
weekday=weekday(date);
year=year(date);
month=year*100+month(date);
output;
end;
drop i;
run;
*Create line and data label;
data weekdays;
set weekdays;
line=_n_;
format xlab $12.;
by month;
if first.month then xlab=put(date,monyy7.);
run;
Следующий график отображает даты как точки DISCRETE: он правильно отображает точки данных, но команды VALUES и TICKVALUEFORMAT не оказывают влияния:
*Plot dates as discrete -- correct points, VALUES and TICKVALUEFORMAT have no effect;
proc sgplot data=weekdays;
series x=date y=line;
scatter x=date y=line;
xaxis type=discrete DISCRETEORDER=DATA values=(3 31 60 91) TICKVALUEFORMAT=monyy7.;
run;
Вот первый график: правильные точки, неправильная ось
Следующий код такой же, но удаляет опцию DISCRETE, и поэтому он отображается в виде оси дат, которая, очевидно, включает выходные дни, но работают опции VALUE и TICKVALUEFORMAT:
*Plot all dates as dates -- incorrect points, but VALUE and TICKVALUEFORMAT work;
proc sgplot data=weekdays;
series x=date y=line;
scatter x=date y=line;
xaxis values=(3 31 60 91) TICKVALUEFORMAT=monyy7.;
run;
Вот второй график: неправильные точки, но рабочая ось
Любые предложения будут тепло приветствоваться! Спасибо!
1 ответ
Проблема здесь в том, что когда вы переходите к дискретному, SAS больше не думает о переменной как о чем-то ином, чем текст. Это можно увидеть, если использовать параметр TMPLOUT в двух примерах: в первом случае значения заключаются в кавычки, поскольку в основном они рассматриваются как символ.
Один из способов обойти это - использовать x2axis и вторичную переменную.
Здесь, на этапе создания, я добавляю счетчик, который будет считать линейно - что вы делаете. Итак 1,2,3,4,5.
*Create Dataset of Weekdays, dropping some holidays;
data weekdays ;
format date date9.;
do i=0 to 100;
date=i;
weekday=weekday(date);
year=year(date);
month=year*100+month(date);
if (weekday~=1 and weekday~=7 and date~="01JAN1960"d) then do;
counter+1;
output;
end;
end;
run;
*Create line and data label;
data weekdays;
set weekdays;
line=_n_;
format xlab $12.;
by month;
if first.month then xlab=put(date,monyy7.);
run;
Теперь я добавляю "фиктивный" график, который намеренно не отображается (белый и прозрачный), но говорит SAS, что использовать для XAxis. Я просто использую обычный FORMAT, чтобы получить правильные метки значений. Затем я говорю другим графикам использовать X2AXIS, что означает, что они могут составить свою собственную ось (и убрать DISPLAY=NONE, если вы хотите увидеть, как это будет выглядеть), но при этом выглядеть одинаково.
*Plot dates as discrete -- correct points, VALUES and TICKVALUEFORMAT have no effect;
proc sgplot data=weekdays tmplout="c:\temp\test_sgplot2.sas";
scatter x=date y=line/markeropts=(color=white) transparency=1;
format date monyy7.;
series x=counter y=line/x2axis;
scatter x=counter y=line/x2axis;
xaxis values=(3 31 60 91) type=discrete discreteorder=data TICKVALUEFORMAT=monyy7.;
x2axis display=none;
run;