Opened 15 years ago
Last modified 11 years ago
#631 closed enhancement
Forecast: problemas con omitidos (no estimados) en el output — at Initial Version
| Reported by: | atorre | Owned by: | Pedro Gea |
|---|---|---|---|
| Priority: | critical | Milestone: | Development 1B |
| Component: | Forecast | Keywords: | Forecast, omitidos, output, OmitFilterTOL, ActRes |
| Cc: | cperez@… |
Description
Hola MMS,
en el objeto Forecast adjunto, podéis encontrar un ejemplo de la previsión de un modelo con un único submodelo que tiene un valor omitido, no estimado, en el output. Esto provoca que la previsión no se ejecute.
Esto puede ocurrir cuando se ejecuta la previsión de un modelo después de actualizar los datos y no se ha estimado (normalmente, por falta de tiempo). Es necesario adaptar el mecanismo de previsión para tener en cuenta esto y solucionarlo para poder ejecutar la previsión sin tener en cuenta esos datos desconocidos.
Una posible solución puede verse el código que sigue a continuación rescatado de SADD. La función Forecast ejecuta una previsión y utiliza las funciones ActRes y OmitFilterTOL.
//////////////////////////////////////////////////////////////////////////////
Serie InterRecur(Set impulsos, Serie resi, Polyn xpiw)
// PURPOSE: Reduce a cero los residuos correspondientes a las fechas de
// <impulsos> trasmitiendo el valor del residuo segun la funcion de
// respuesta <xpiw>
//////////////////////////////////////////////////////////////////////////////
{
Date iesima = impulsos[1];
Real valor = SerDat(resi, iesima);
Serie pulEx = xpiw:(valor * Pulse(iesima, Dating(resi)));
Serie res1 = resi - pulEx;
Set imp1 = impulsos - SetOfDate(iesima);
If(GT(Card(imp1),0), InterRecur(imp1,res1,xpiw), res1)
};
//////////////////////////////////////////////////////////////////////////////
Serie OmitFilterTOL(Ration piW, Serie res, Serie ind)
//////////////////////////////////////////////////////////////////////////////
{
Polyn xpiW = Expand(piW,CountS(ind));
Set pulsosF = Dates(SerTms(ind),First(ind),Last(ind));
Real cardpul = Card(pulsosF);
If(cardpul, InterRecur(pulsosF,res,xpiW), res)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"funcion que devuelve la serie de correccion de omitidos en la serie de
residuos actualizados.",
OmitFilterTOL);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Serie ActRes(Serie serRuido, Serie serRes, Real p, Real q, Ration piw)
//////////////////////////////////////////////////////////////////////////////
{
Date lastRui = Last(serRuido);
Date lastRes = Last(serRes);
Real lag = DateDif(Dating(serRuido), lastRes, lastRui);
Real m = p + lag;
Serie aIni = If(q,LastM(serRes,q),CalInd(W,Dating(serRuido)));
Serie noiseIni = LastM(serRuido,m);
If(q,DifEq(piw, noiseIni, aIni), Numerator(piw):noiseIni)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"funcion que actualiza los residuos, a partir de los ordenAR ultimos valores
del ruido y los ordenMA ultimos valores de los residuos. Sus argumentos son:
- serRuido, la serie de ruido del modelo estimado
- serRes, la serie de residuos que se desea actualizar.",
ActRes);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set Forecast (Serie original, // Serie original
Set boxCox, // Transformacion Box-Cox
Set arima, // Arima Estimado
Serie noise, // Noise Estimado
Serie filter, // Filtro Extendido
Serie filterVar, // SetSum(ForErr(Inputs Estoc)^2)
Serie residuals, // Residuos Estimados
Real numFor, // Numero fde previsiones
Date origen, // Origen de prevision (ultimo dato conocido)
Real alfa, // 2*(1-DistNormal(1))
Serie cierres) // Serie de cierres de la serie si los tiene
//////////////////////////////////////////////////////////////////////////////
{
Text dtnTxt = "TimeSet "+ DatingName(original) +"; ";
Polyn ARI = ARIMAGetARI(arima);
//arima[2]*arima[4];
Polyn MA = ARIMAGetMA (arima);//arima[3];//
Real degARI = Degree(ARI);
Real degMA = Degree(MA);
Ration piw = ARI/MA;
Ration psiw = MA/ARI;
Date fsFor = Succ(origen, Eval(dtnTxt), 1); // primera prevision
Date lsFor = Succ(origen, Eval(dtnTxt), numFor); // ultima prevision
Real isEst = Last(noise) == origen; // El origen de prevision coincide
// con el ultimo dato de estimacion
////////////////////////////////////////////////////////////////////////////
// Output y Noise extendido y Residuos actualizados
////////////////////////////////////////////////////////////////////////////
Serie outputOmit = BoxCoxTransf(original, boxCox);
Serie indOmi = // omitidos no estimados
If(isEst, CalInd(W,Eval(dtnTxt)),
SubSer(IsUnknown(outputOmit),
Succ(Last(noise),Eval(dtnTxt),1),
origen));
Serie output = IfSer(IsUnknown(outputOmit), 0, outputOmit);
Serie filter2For = SubSer(filter, fsFor, lsFor);
Serie noiseExt = noise >> (output - filter);
Date lastAvailable = Min(Last(noiseExt), origen); // ultimo noise
Date lastAvailableRes = Min(Last(residuals),origen); // ultimo residuo
Serie noiseNoFil = SubSer(noiseExt, First(noiseExt), lastAvailable);
Serie resEst = SubSer(residuals, First(residuals), lastAvailableRes);
Real doAct = Or((Last(noise) < lastAvailable),
Last(residuals) < lastAvailableRes);// Ojo con esto
Serie actRes = If(Not(doAct), resEst, // actualizacion de residuos
ActRes(noiseNoFil, resEst, degARI, degMA, piw));
////////////////////////////////////////////////////////////////////////////
// Residuos y Ruido Filtrado
////////////////////////////////////////////////////////////////////////////
Date lsDat = Last(noiseNoFil);
Serie filtRes = If(Not(doAct), actRes, OmitFilterTOL(piw, actRes, indOmi));
Serie resActF = actRes - filtRes;
Serie resActIni = SubSer(CalInd(W,Eval(dtnTxt)),
Succ(First(resActF), Eval(dtnTxt), -degMA),
Succ(First(resActF), Eval(dtnTxt), -1));
Serie filNoi = DifEq(psiw, resActIni<<resActF);
Serie cierre = SubSer(CalInd(W,Eval(dtnTxt)),
Succ(lsDat, Eval(dtnTxt), -degARI), lsDat)
<< filNoi;
Serie hisRes = If(degMA,
SubSer(filtRes, Succ(lsDat,Eval(dtnTxt),-degMA), lsDat),
CalInd(W,Dating(filtRes)));
Serie hisNoi = SubSer((noiseNoFil - cierre),
Succ(lsDat,Eval(dtnTxt),-degARI), lsDat);
////////////////////////////////////////////////////////////////////////////
// Prevision del noise
////////////////////////////////////////////////////////////////////////////
Serie zero = SubSer(CalInd(W, Eval(dtnTxt)), fsFor, lsFor);
Serie allRes = If(degMA,(hisRes>> zero),zero);
Serie prevNoise = SubSer(DifEq(psiw, allRes, hisNoi), fsFor, lsFor);
Serie prevTrans = filter2For + prevNoise;
////////////////////////////////////////////////////////////////////////////
// Error de Prevision
////////////////////////////////////////////////////////////////////////////
Real sigma = StDsS(hisRes);
Serie forErrOut = ErrorForecast(numFor, sigma, origen, psiw, Eval(dtnTxt));
// Set forErrorSet = SetOfSet(ErrorForecast2(numFor, sigma, origen, psiw, Eval(dtnTxt)));
Serie forErr = SubSer(SqRt(forErrOut^2 + filterVar), fsFor, lsFor);
////////////////////////////////////////////////////////////////////////////
// Bandas
////////////////////////////////////////////////////////////////////////////
Real numSig = DistNormalInv(1-(alfa/2));
Serie tSup = prevTrans + (numSig*forErr);
Serie tInf = prevTrans - (numSig*forErr);
////////////////////////////////////////////////////////////////////////////
// Salida de la funcion
////////////////////////////////////////////////////////////////////////////
Serie forecast = BoxCoxInvTransf(prevTrans, boxCox)*Not(cierres);
Serie viewForecast = original << forecast;
// Serie viewForecast =
// SubSer(original<<forecast, Last(original), Last(forecast));
Serie upperBand = BoxCoxInvTransf(tSup, boxCox);
Serie lowerBand = BoxCoxInvTransf(tInf, boxCox);
Set previsionResults =
[[ original, viewForecast, upperBand, forecast, lowerBand,
prevNoise, filter2For, prevTrans, forErr]];
Set realSet = SetOfReal(numFor);
Set aRIMASet = SetOfPolyn(ARI, MA);
Set dateSet = SetOfDate(origen, lsFor, lastAvailable, lastAvailableRes);
Set serieSet = SetOfSerie
(
outputOmit, indOmi, output, noiseExt, noiseNoFil, resEst,
actRes, zero, filtRes, resActF, resActIni, filNoi, cierre,
allRes, hisNoi, forErrOut, forErr, tSup,tInf
);
Set diagnosisSet = SetOfSet(aRIMASet, dateSet, serieSet, realSet);// forErrorSet
previsionResults << [[ diagnosisSet ]]
};
![(please configure the [header_logo] section in trac.ini)](/mms/chrome/site/logomms.png)