close Warning: Can't synchronize with repository "(default)" (/var/svn/mms does not appear to be a Subversion repository.). Look in the Trac log for more information.

Ticket #904: _decision.tol

File _decision.tol, 6.2 KB (added by lmperez, 13 years ago)
Line 
1//////////////////////////////////////////////////////////////////////////////
2// FILE    : _decision.tol
3// AUTHOR : Luis Miguel Pérez Liberal (lmperez@bayesinf.com)
4// PURPOSE : Standard functions for diagnosis procedures
5//////////////////////////////////////////////////////////////////////////////
6
7
8//////////////////////////////////////////////////////////////////////////////
9Serie ErrorForecast.Clasico(Real lengthFor, Serie residuals, Ratio psiw)
10//////////////////////////////////////////////////////////////////////////////
11{
12  TimeSet dtn = Dating(residuals);
13  Date origen = Last(residuals);
14  Real sigma  = StDsS(residuals);
15
16  Real  sigma2  = sigma^2;
17  Date  fsFor   = Succ(origen, dtn, 1);
18  Date  lsFor   = Succ(origen, dtn, lengthFor+1);
19  Polyn psi     = Expand(psiw, lengthFor);
20  Serie zero    = CalInd(W,dtn);
21  Serie psiSer  = SubSer(psi:(zero + Pulse(origen,dtn)), origen, lsFor);
22  Serie psiSer2 = psiSer^2;
23  Serie error2  = sigma2 * DifEq(1/(1-B), psiSer2, 0);
24
25  Serie error   = SqRt(error2)
26};
27//////////////////////////////////////////////////////////////////////////////
28PutDescription("Devuelve la sigma en prevision de una serie de residuos.
29Ejemplo:
30
31Serie ErrorForecast.Clasico(
32  90,
33  GenResiduals.Heteroscedastic(500),
34  Ratio (1-0.75*B^7)/((1-B^7)*(1-0.10*B))
35);
36",
37ErrorForecast.Clasico);
38//////////////////////////////////////////////////////////////////////////////
39
40
41//////////////////////////////////////////////////////////////////////////////
42Serie ErrorForecast.Het.Luis(Real lengthFor, Serie residuals, Ratio psiw)
43//////////////////////////////////////////////////////////////////////////////
44{
45  TimeSet dtn = Dating(residuals);
46
47  Set sTms = {For(1,7,Text (Real k){
48    Text If(CountS(DatCh(residuals,WD(k),FirstS)),"WD("+IntText(k)+")","")
49  }) - [[ "" ]]};
50
51  Date origen   = Last(residuals);
52  Date  fsFor   = Succ(origen, dtn, 1);
53  Date  lsFor   = Succ(origen, dtn, lengthFor+1);
54  Polyn psi     = Expand(psiw, lengthFor);
55  Serie zero    = CalInd(W,dtn);
56  Serie psiSer  = SubSer(psi:(zero + Pulse(origen,dtn)), origen, lsFor);
57  Serie psiSer2 = psiSer^2;
58  Serie difEQ   = DifEq(1/(1-B), psiSer2, 0);
59
60  Serie error2  = SetSumC(EvalSet(sTms,Serie (Text tms)
61  {
62    TimeSet tms_WD   = Eval(tms);
63    Real  sigma_WD   = StDsS(DatCh(residuals,tms_WD,FirstS));
64    Real  sigma2_WD  = sigma_WD^2;
65    Serie psiSer2_WD = difEQ*sigma2_WD*CalInd(tms_WD,dtn);
66    Serie psiSer2_WD
67  }));
68
69  Serie DatCh(SqRt(SubSer(error2,fsFor,lsFor)),Dating(residuals),FirstS)
70};
71//////////////////////////////////////////////////////////////////////////////
72PutDescription("Devuelve la sigma en prevision de una serie de residuos en
73fechado Diario considerando la heterocedasticidad de los mismos.
74Esta función falla para modelos con parámetros arima regulares grandes.
75Ejemplo:
76
77Serie ErrorForecast.Het.Luis(
78  90,
79  GenResiduals.Heteroscedastic(500),
80  Ratio (1-0.75*B^7)/((1-B^7)*(1-0.10*B))
81);",
82ErrorForecast.Het.Luis);
83//////////////////////////////////////////////////////////////////////////////
84
85
86//////////////////////////////////////////////////////////////////////////////
87Serie ErrorForecast.Het.Pepe(Real lengthFor, Serie residuals, Serie noise,
88  Set arima)
89//////////////////////////////////////////////////////////////////////////////
90{
91  TimeSet dtn = Dating(residuals);
92  Date origen = Last(residuals);
93  Date  fsFor = Succ(origen, dtn, 1);
94  Date  lsFor = Succ(origen, dtn, lengthFor+1);
95
96  Set   sAr   = arima[2];
97  Set   sMa   = arima[3];
98  Polyn dif   = SetProd(arima[4]);
99  Ratio psiw  = ma/(dif*ar);
100  Real maDeg  = Degree(SetProd(sMa));
101  Real ariDeg = Degree(SetProd(sAr)*dif);
102
103  Set sTms = {For(1,7,Text (Real k){
104    Text If(CountS(DatCh(residuals,WD(k),FirstS)),"WD("+IntText(k)+")","")
105  }) - [[ "" ]]};
106
107  Serie sigmaK = SetSumC(EvalSet(sTms,Serie (Text tms){
108    Serie CalInd(Eval(tms),dtn)*StDsS(DatCh(residuals,Eval(tms),FirstS))
109  }));
110
111  Real noDegree = If(GT(maDeg+ariDeg,CountS(noise)),1,0);
112
113  Serie Case(
114    EQ(MaxS(sigmaK),0), ErrorForecast.Clasico(lengthFor,residuals,psiw),
115    EQ(noDegree,1),     ErrorForecast.Het.Luis(lengthFor,residuals,psiw),
116    True,
117    {
118      Real Show(False,"ALL",True);
119      Set estimate = Estimate(
120        ModelDef(
121          noise/(sigmaK+Not(sigmaK)),
122          1,
123          0,
124          SetMax(arima[1]),
125          0,
126          dif,
127          sAr,
128          sMa,
129          Empty,
130          Empty
131        )
132      );
133      Real Show(True,"ALL");
134   
135      Polyn p.ar   = SetProd(estimate::Definition::AR);
136      Polyn p.ma   = SetProd(estimate::Definition::MA);
137      Polyn p.dif  = estimate::Definition::Dif;
138      Ratio r.psiw = p.ma/(p.dif*p.ar);
139      Serie error  = estimate::Series::Residuals;
140 
141      Serie error.Prevision = ErrorForecast.Clasico(
142        lengthFor,
143        error,
144        r.psiw
145      )/(StDsS(error)+Not(StDsS(error)));
146   
147      Serie DatCh(
148        SubSer(error.Prevision*sigmaK,fsFor,lsFor),
149        Dating(residuals),
150        FirstS
151      )
152    }
153  )
154};
155//////////////////////////////////////////////////////////////////////////////
156PutDescription("Devuelve la sigma en prevision de una serie de residuos en
157fechado Diario considerando la heterocedasticidad de los mismos.
158Esta función es capaz de controlar la heterocedasticidad de cualquier modelo
159arima; sin embargo, puede darnos problemas si tenemos pocos grados de libertad
160y es mucho más costosa computacionalmente.
161Ejemplo:
162
163Set sArima  = GetArimaFromLabel(\"P1_7DIF0_1AR1_0MA0_7\");
164Polyn p.AR  = SetProd(Traspose(sArima)[2]);
165Polyn p.MA  = SetProd(Traspose(sArima)[3]);
166Polyn p.DIF = SetProd(Traspose(sArima)[4]);
167Polyn ar    = GetRandomPolyn(p.AR);
168Polyn ma    = GetRandomPolyn(p.MA);
169Ratio psi   = ma/(p.DIF*ar);
170
171Serie residuals = GenResiduals.Heteroscedastic(500);
172Serie noise     = DifEq(psi,residuals,100);
173 
174Serie ErrorForecast.Het.Pepe(
175  90,
176  residuals,
177  noise,
178  Traspose(sArima)
179);",
180ErrorForecast.Het.Pepe);
181//////////////////////////////////////////////////////////////////////////////
182
183
184//////////////////////////////////////////////////////////////////////////////
185// END
186//////////////////////////////////////////////////////////////////////////////