很抱歉标题令人困惑。
背景
数据如下所示
Area Date Ind LB UB
A 1mar 14 1 20
A 2mar 3 1 20
B 1mar 11 7 22
B 2mar 0 7 22
面积具有多个不同的值。对于每个区域,LB
和UB
在多个日期中是固定的,而Ind
则有所不同。 Date
总是从月初开始到每月的某一天。
目标
我的目标是为每个区域运行一个控制图,以查看Ind
是否超出(LB,UB)
的范围。
但是,如果我只绘制每个区域的原始数据,则默认情况下xaxis
不会在当月的最后一天结束(在前面的示例中,绘图将从 3 月 1 日到 3 月 2 日,而不是 3 月 31 日。我确实知道通过指定xmax
选项xaxis
该图将扩展到 3 月 31 日。但这只会扩展xaxis
,LB
和UB
仍然显示从 3 月 1 日到 3 月 2 日,使图表的右侧留空。
因此,我使用modify
添加一些日期记录。
我做了什么
data have;
modify have;
do i = 0 to intck('day',today(),intnx('month',today(),0,'E'));
Date = today()+i;
call missing(Ind);
output;
end;
stop;
run;
proc sgplot data=have missing;
series ... Ind ...;
series ... LB ...;
series ... UB ...;
run;
问题
但这仅适用于一个区域。我需要先修改每个区域,然后逐个绘制它们。我怎样才能相对高效地获得以下数据
Area Date Ind LB UB
A 1mar 14 1 20
A 2mar 3 1 20
A 3mar . 1 20
....
A 31mar. 1 20
B 1mar 11 7 22
B 2mar 0 7 22
B 3mar . 7 22
....
B 31mar. 7 22
或者proc sgplot
还有其他选择可以解决这个问题?
proc timeseries
与按组area
一起使用,以将其转换为所需的形式。end=
选项将允许您指定数据的结束日期。看起来您使用的是当前月份,因此我们将采用您的intnx
函数并将其放入一组解析为日期文本的宏函数中(由于某种原因,大多数 ETS 过程都需要日期文本)。
我们将使用两个var
语句:一个用于ind
,其中我们用.
填充未观察到的值,另一个用于LB
&UB
,以使用以前的有效值设置其未观察到的值。
请注意,我们假设你已将date
放入 SAS 日期。请确保在运行以下代码之前先执行此操作。
proc timeseries data=have
out=want;
by area;
id Date interval=day notsorted
accumulate=none
end="%sysfunc(intnx(month, %sysfunc(today() ), 0, E), date9.)"d;
var Ind / setmissing=missing;
var LB UB / setmissing=previous;
run;
最终数据集的外观将完全符合您的要求。