Findminimum computation time (ignore my previous posting)
- To: mathgroup at smc.vnet.net
- Subject: [mg24024] Findminimum computation time (ignore my previous posting)
- From: Benoit_Carmichael <benoit at ecn.ulaval.ca>
- Date: Tue, 20 Jun 2000 03:07:37 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
I would like to use FINDMINIMUM to estimate Ferson (Journal of finance
1992) beta pricing model with Hansen (Econometrica 1982) generalized
method of moments (GMM). I have already a FORTRAN program that does the
estimation in matter of minutes (if not seconds!). So far, my
implementation of GMM with MATHEMATICA 4.0 is too slow to make it useful
in practice. Before giving it all up, I want to make sure that my
programming style is not at fault.
The objective function to minimize as the form of a sum of squares (i.e.
e.v.e). The main part of my code is listed below. Here are my questions:
1) From your experience, is FINDMINIMUM useful to minimize a function of
a large number of variables (say 40 or 50 parameters) in a reasonable
lapse of time?
My fobj[b] function takes about 0,2 second to compute on a PII 400 with
128 mg of ram. FINDMINIMUM has yet to return something after hours of
computations! Something must be wrong. The code works. I have estimated
successfully a small model with 3 asset returns, 25 observations and 2
parameters.
2) Would supplying the gradient myself speed things up? (Findminimum
seems to build the function analytically before replacing the parameters
with the starting values. This seems to be the part that takes too much
time.)
3) My objective function is built in 4 steps (ortho, ez, m and fobj).
Would there be efficiency gains to merge these steps?
I am more familiar with procedural style of programming (FORTRAN), my
mathematica code could probably be improved. I tried, to the best of my
knowledge, to program my objective function "functionaly".
4) Have I succeeded or could you see obvious improvement?
I would greatly appreciate any suggestions.
Many thanks in advance.
Benoit Carmichael
Professeur
Departement d'Economique
Pavillon J.-A. de S=E8ve
Cit=E9 Universitaire
Ste-Foy (Quebec)
Canada, G1K 7P4
Tel.: (418) 656-2131 #5442
Here is the main part of my code:
BUILDING THE OBJECTIVE FUNCTION:
ortho[{y_, r_, x_, z_}] := Module[{f, eR, eT}, (* nf is the number of
factors, nr is the number of assets considered, x and z are data *)
f = y - \[Gamma].x;
eR = r[[Range[nf]]] - \[Delta].x - \[Beta]R.f;
eT = r[[Range[nf + 1, nr]]] - \[Beta]T.\[Beta]Ri.\[Delta].x -
\[Beta]T.f;
Flatten[{Outer[Times, f, z],
Outer[Times, Flatten[{eR, eT}], Flatten[{f, z}]]}]
]
ez[b_] := ( (* nf, nxf, nxr and np are constant terms determining the
number of factors, of explanatory variables and of parameter to estimate
*)
\[Gamma] = Partition[b[[Range[nf nxf]]], nxf];
\[Delta] = Partition[b[[Range[nf nxf + 1, nf (nxf + nxr)]]], nxr];
\[Beta] = Partition[b[[Range[nf (nxf + nxr) + 1, np]]], nf];
\[Beta]R = \[Beta][[Range[nf]]];
\[Beta]Ri = Inverse[\[Beta]R];
\[Beta]T = \[Beta][[Range[nf + 1, nr]]];
Map[ortho, lst]
)
m[b_] := (Apply[Plus, Transpose[ez[b]], 1]);
fobj[b_] := Module[{mm}, mm = m[b]; f = mm.v.mm; Print[f]; f]
DATA:
lst = Transpose[{F, re, x, z}];
PARAMETER VECTOR:
bb = Table[ToExpression["b" <> ToString[i]], {i, np}] ;
b0 = STARTING VALUES
bb0 = Flatten[{Transpose[{Flatten[bb], Flatten[b0]}]}, 1]
ESTIMATION:
v=Identity matrix (*for the time being *)
FindMinimum[fobj[bb], Evaluate[Sequence @@ bb0], MaxIterations -> 100]
In typical application, I have :
10 asset returns (nr=10),
2 factors (nf=2)
10 explanatory variables (nxf=nxr=10),
200+ observations for each variables
40 to 50 parameters to estimate