首页 > 解决方案 > VARMAX 中的缺失值

问题描述

我有一个包含访客和天气变量的数据集。我正在尝试根据天气变量来预测访客。由于数据集仅包含季节的访客,因此每年都存在缺失值和差距。在 sas 中运行 proc reg 时一切正常,但是当我使用 proc VARMAX 时问题就来了。由于缺少值,我无法运行回归。我该如何解决这个问题?

proc varmax data=tivoli4 printall plots=forecast(all);
id obs interval=day;
model lvisitors = rain sunshine averagetemp
dfebruary dmarch dmay djune djuly daugust doctober dnovember ddecember
dwednesday dthursday dfriday dsaturday dsunday
d_24Dec2016 d_05Dec2013 d_24Dec2017 d_24Dec2014 d_24Dec2015 d_24Dec2019 
d_24Dec2018 d_24Sep2012 d_06Jul2015
d_08feb2019 d_16oct2014 d_15oct2019 d_20oct2016 d_15oct2015 d_22sep2017 d_08jul2015
d_20Sep2019 d_08jul2016 d_16oct2013 d_01aug2012 d_18oct2012 d_23dec2012 d_30nov2013 d_20sep2014 d_17oct2012 d_17jun2014
dFrock2012 dFrock2013 dFrock2014 dFrock2015 dFrock2016 dFrock2017 dFrock2018 dFrock2019
dYear2015 dYear2016 dYear2017
/p=7 q=2 Method=ml dftest;
garch p=1 q=1 form=ccc OUTHT=CONDITIONAL;
restrict
ar(3,1,1)=0, ar(4,1,1)=0, ar(5,1,1)=0,
XL(0,1,13)=0, XL(0,1,14)=0, XL(0,1,13)=0, XL(0,1,27)=0, XL(0,1,38)=0, XL(0,1,42)=0;
output lead=10 out=forecast;

跑;

标签: sasforecasting

解决方案


与任何预测一样,您首先需要准备时间序列。您应该首先遍历数据PROC TIMESERIES以填充或估算缺失值。最合适的估算选择取决于您的变量。下面的代码将:

  • 按天求和lvisitors并将缺失值设置为 0
  • 将缺失值设置 averagetemp为平均值
  • rain将、sunshine和变量的缺失值设置为从d0 开始(假设这些是指标)

代码:

proc timeseries data=have out=want;

    id obs interval   = day
           setmissing = 0
           notsorted
    ;

    var lvisitors / accumulate=total;
    crossvar averagetemp / accumulate=none setmissing=average;
    crossvar rain sunshine d: / accumulate=none;
run;

重要的时间间隔考虑

根据您的数据,这可能会影响您的错误率和估计,因为您总是知道淡季期间没有人会出现。如果淡季数据有很多缺失值,则需要删除这些行。

由于 PROC VARMAX 不支持自定义时间间隔,因此您可以创建一个简单的时间标识符。您也可以将其转换为格式proc format并在最后进行转换time_id

data want;
    set have;

    time_id+1;
run;

proc varmax data=want;
    id time_id interval=day;
    ...
    output lead=10 out=myforecast;
run;

data myforecast;
    merge myforecast
          want(keep=time_id date)
    ;

    by time_id;
run;

或者,如果您制作了格式:

data myforecast;
    set myforecast;

    date = put(time_id, timeid.);
    drop time_id;
run;

推荐阅读