MathGroup Archive 2001

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Q: Solving econometric models

  • To: mathgroup at smc.vnet.net
  • Subject: [mg30984] Re: [mg30859] Q: Solving econometric models
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Sat, 29 Sep 2001 04:19:03 -0400 (EDT)
  • References: <200109200752.DAA16383@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

"Mark S. Coleman" wrote:
> 
> Greetings:
> 
> I apologize in advance for the rather vague nature of this question,
> but I am hoping that MathGroup members might be able to point me in
> the right direction.
> 
> I am working with a number of small econometric models that I have
> estimated (using Regress) in Mathematica v4.0. The models support a number of
> out-of-sample economic forecasting applications. As part of the
> research I am conducting, I need to 'solve' these equations -- that
> is, generate projections of future economic activity. This type of
> functionality is generally a standard part of "conventional"
> statistical/econometric packages, and I am seeking to replicate this
> functionality in Mathematica.
> 
> To illustrate the problem, consider the following very simple
> two-equation model (note that I am not using Mathematica notation here):
> 
> y(t) = a + b*y(t-1) + c*x(t)
> z(t) = d + e*z(t-1) + f*y(t-1)
> 
> where t denotes time, y,z, and x are variables, and {a...f} are=
>  real
> numbers (say estimated using Regress). Assume that
> t=1,...,n,n+1,n+2,...,T.
> 
> Assume that the models were estimated using the sample of data from
> 1,...,n. The objective is to solve or forecast this model over the
> future periods n+1, n+2,...,T. Also assume that x(t) is known over
> the future periods.
> 
> In my attempts to solve this problem in Mathematica, I've created a list of
> rules (taken from the BestFit option in Regress) and then 'looped'
> over the list of future periods, one period at a time, and used the
> ReplaceAll function.
> 
> This raises a couple of questions. First, to use prior solved values,
> I've had to create a new equation to define each of the lagged
> values, y(t-1) and z(t-1). Is there a better way to handle this?
> 
> Second, can the model be written in Mathematica notation to solve over the
> entire set of future time periods without the use of an explicit
> loop?
> 
> Any help would be greatly appreciated.
> 
> -Mark

You have a system of linear recurrences and this can be solved with the
RSolve standard add-on package as below.

In[1]:= <<DiscreteMath`RSolve`

In[2]:= eqns = {y[t] == a + b*y[t-1] + c*x[t], z[t] == d + e*z[t-1] +
f*y[t-1]};

In[3]:= InputForm[RSolve[eqns, {y[t],z[t]}, t]]

Out[3]//InputForm= 
{{y[t] -> Sum[-((C[1]*If[K[1] == 0, 1, 0])/(-1 + b)) + 
     (b^(2 + t - K[1])*C[1]*If[K[1] == 0, 1, 0])/(-1 + b) - 
     If[K[1] == 1, a - C[1], 0]/(-1 + b) + 
     (b^(2 + t - K[1])*If[K[1] == 1, a - C[1], 0])/(-1 + b) + 
     (c*x[-2 + K[1]])/(-1 + b) - (b^(2 + t - K[1])*c*x[-2 + K[1]])/(-1 +
b) - 
     (c*x[-1 + K[1]])/(-1 + b) + (b^(2 + t - K[1])*c*x[-1 + K[1]])/(-1 +
b), 
    {K[1], 0, 1 + t}], 
  z[t] -> Sum[-((C[2]*If[K[1] == 0, 1, 0])/((-1 + b)*(1 - e))) - 
     (b^(3 + t - K[1])*C[2]*If[K[1] == 0, 1, 0])/((-1 + b)*(-b + e)) + 
     (e^(3 + t - K[1])*C[2]*If[K[1] == 0, 1, 0])/((-1 + e)*(-b + e)) + 
     If[K[1] == 1, -d - f*C[1] + (1 + b)*C[2], 0]/((-1 + b)*(1 - e)) + 
     (b^(3 + t - K[1])*If[K[1] == 1, -d - f*C[1] + (1 + b)*C[2], 0])/
      ((-1 + b)*(-b + e)) - (e^(3 + t - K[1])*If[K[1] == 1, 
        -d - f*C[1] + (1 + b)*C[2], 0])/((-1 + e)*(-b + e)) + 
     If[K[1] == 2, f*(-a + C[1]) + b*(d - C[2]), 0]/((-1 + b)*(1 - e)) + 
     (b^(3 + t - K[1])*If[K[1] == 2, f*(-a + C[1]) + b*(d - C[2]), 0])/
      ((-1 + b)*(-b + e)) - (e^(3 + t - K[1])*If[K[1] == 2, 
        f*(-a + C[1]) + b*(d - C[2]), 0])/((-1 + e)*(-b + e)) + 
     (c*f*x[-3 + K[1]])/((-1 + b)*(1 - e)) + 
     (b^(3 + t - K[1])*c*f*x[-3 + K[1]])/((-1 + b)*(-b + e)) - 
     (c*e^(3 + t - K[1])*f*x[-3 + K[1]])/((-1 + e)*(-b + e)) - 
     (c*f*x[-2 + K[1]])/((-1 + b)*(1 - e)) - 
     (b^(3 + t - K[1])*c*f*x[-2 + K[1]])/((-1 + b)*(-b + e)) + 
     (c*e^(3 + t - K[1])*f*x[-2 + K[1]])/((-1 + e)*(-b + e)), 
    {K[1], 0, 1 + t}]}}

In[4]:= x[t_] := Sin[t] + t;

In[5]:= a = 3; b = 7; c = 4; d = 2; e = 5; f = 8;

Using specific values for x[t] and the parameters we get something
nicer.

In[6]:= InputForm[RSolve[eqns, {y[t],z[t]}, t]]
Out[6]//InputForm= 
{{y[t] -> If[t >= -1, (252*I - (36*I)*E^I + (36*I)*E^(I + (2*I)*t) - 
      (252*I)*E^((2*I)*(1 + t)) + 7*E^(I*t)*(-23 + (77 - 36*I)*7^t -
12*t + 
        18*7^(1 + t)*C[1]) + 7*E^(I*(2 + t))*(-23 + (77 + 36*I)*7^t -
12*t + 
        18*7^(1 + t)*C[1]) - 50*E^(I*(1 + t))*(-23 + 11*7^(1 + t) - 12*t
+ 
        18*7^(1 + t)*C[1]))/(18*(7 - 50*E^I + 7*E^(2*I))*E^(I*t)), 0], 
  z[t] -> If[t >= -1, ((10080*I)*E^I - (3456*I)*E^(2*I) +
(288*I)*E^(3*I) - 
      (288*I)*E^(I + (2*I)*t) - (10080*I)*E^(3*I + (2*I)*t) + 
      (3456*I)*E^((2*I)*(1 + t)) + 144*E^(I*(3 + t))*
       (-129 + (189 + 50*I)*5^(1 + t) - (132 + 26*I)*7^(1 + t) - 72*t + 
        216*(5^(1 + t) - 7^(1 + t))*C[1] - 54*5^(1 + t)*C[2]) + 
      144*E^(I*(1 + t))*(-129 + (189 - 50*I)*5^(1 + t) - 
        (132 - 26*I)*7^(1 + t) - 72*t + 216*(5^(1 + t) - 7^(1 + t))*C[1]
- 
        54*5^(1 + t)*C[2]) - 35*E^(I*(4 + t))*(-43 + (315 + 144*I)*5^t - 
        (308 + 144*I)*7^t - 24*t + 72*(5^(1 + t) - 7^(1 + t))*C[1] - 
        18*5^(1 + t)*C[2]) - 35*E^(I*t)*(-43 + (315 - 144*I)*5^t - 
        (308 - 144*I)*7^t - 24*t + 72*(5^(1 + t) - 7^(1 + t))*C[1] - 
        18*5^(1 + t)*C[2]) - 1370*E^(I*(2 + t))*(-43 + 63*5^(1 + t) - 
        44*7^(1 + t) - 24*t + 72*(5^(1 + t) - 7^(1 + t))*C[1] - 
        18*5^(1 + t)*C[2]))/(18*(-7 + E^I)*(-5 + E^I)*(-1 + 5*E^I)*
      (-1 + 7*E^I)*E^(I*t)), 0]}}

You can also specify initial conditions in your equations list.

In[11]:= InputForm[RSolve[Join[eqns, {y[0]==2,z[0]==1}], {y[t],z[t]},
t]]
Out[11]//InputForm= 
{{y[t] -> If[t >= 0, (252*I - (36*I)*E^I + (36*I)*E^(I + (2*I)*t) - 
      (252*I)*E^((2*I)*(1 + t)) - 50*E^(I*(1 + t))*(-23 + 59*7^t - 12*t)
+ 
      7*E^(I*t)*(-23 + (59 - 36*I)*7^t - 12*t) + 7*E^(I*(2 + t))*
       (-23 + (59 + 36*I)*7^t - 12*t))/(18*(7 - 50*E^I +
7*E^(2*I))*E^(I*t)), 
    0], z[t] -> If[t >= 0, ((10080*I)*E^I - (3456*I)*E^(2*I) + 
      (288*I)*E^(3*I) - (288*I)*E^(I + (2*I)*t) - 
      (10080*I)*E^(3*I + (2*I)*t) + (3456*I)*E^((2*I)*(1 + t)) + 
      144*E^(I*(3 + t))*(-129 + (783 + 250*I)*5^t - (708 + 182*I)*7^t - 
        72*t) - 1370*E^(I*(2 + t))*(-43 + 261*5^t - 236*7^t - 24*t) - 
      35*E^(I*(4 + t))*(-43 + (261 + 144*I)*5^t - (236 + 144*I)*7^t -
24*t) - 
      (144*I)*E^(I*(1 + t))*(-129*I + (250 + 783*I)*5^t - (182 +
708*I)*7^t - 
        (72*I)*t) + 35*E^(I*t)*(43 - (261 - 144*I)*5^t + (236 -
144*I)*7^t + 
        24*t))/(18*(-7 + E^I)*(-5 + E^I)*(-1 + 5*E^I)*(-1 +
7*E^I)*E^(I*t)), 
    0]}}


Daniel Lichtblau
Wolfram Research


  • Prev by Date: Using NonlinearRegress with Dif. Equations
  • Next by Date: Legend in ParametricPlot
  • Previous by thread: Q: Solving econometric models
  • Next by thread: Re: Q: Solving econometric models