b34sexec options ginclude('b34sdata.mac') member(fwheat); b34srun; b34sexec matrix; call loaddata; /; call load(movebj); subroutine movebj(series,iseas,ibegin,actual,fore,obs,nout,iprint); /; /; Does within sample moving forecasts /; /; series => Series to forecast /; seasonal => seasonal period (must be ge 0) /; ibegin => Seriod to start forecast /; actual => Actual Data /; fore => nout step ahead moving forecast /; obs => Observation Number /; nout => # of period ahead forecast /; iprint => =0 => no printing, =1 => print models /; /; /; To be safe this setup forces differencing iend=norows(series)-nout; if(ibegin.gt.iend)then; call epprint('ERROR: Call to movebj has ibegin > series length'); go to endit; endif; actual=array(iend-ibegin+2-nout:); fore=actual; obs =actual; idone=0; do i=ibegin,iend; j=integers(1,i); series2=series(j); if(iprint.ne.0)then; call autobj(series2 :autobuild :print :rdif :seasonal iseas :forecast index(nout,norows(series2))); endif; if(iprint.eq.0)then; call autobj(series2 :autobuild :rdif :seasonal iseas :forecast index(nout,norows(series2))); endif; idone=idone+1; fore(idone) =%fcast(nout); obs(idone) =%foreobs(nout); actual(idone) =series(i+nout); enddo; endit continue; return; end; call print(movebj); call echooff; nout=1; iseas=0; ibegin=20; iprint=1; call movebj(bushels,iseas,ibegin,actual,fore,obs,nout,iprint); call tabulate(obs,actual,fore); call tabulate(obs,actual,fore); call graph(obs fore,actual :plottype xyplot :nolabel :heading '1 step ahead moving forecast'); /;nout=3; /; call movebj(buslels,iseas,ibegin,actual,fore,obs,nout,iprint); /; call tabulate(obs,actual,fore); /; call graph(obs fore,actual :plottype xyplot /; :nolabel /; :heading '3 step ahead moving forecast'); b34srun;