Thanks for the script.

BTW, if my C version of Genz's tvnl.m would be helpful for after the next release, just let me know and I can send it.


On Sat, Jul 19, 2014 at 12:57 AM, Riccardo (Jack) Lucchetti <r.lucchetti@univpm.it> wrote:
On Fri, 18 Jul 2014, David van Herick wrote:

Thanks.  I will look at the documentation on the GHK hansl function.  Would
you please send (or post) the example script for the trivariate probit
model?

Here you are. This uses numerical derivatives. It could also be done with analytical derivatives, but the script would be a bit longer.

<hansl>
function series trivp_ll(matrix param, series y1, series y2, series y3,
                         list X1, list X2, list X3, matrix *U)
#    printf "%8.3f", param'

    set warnings off

    k1 = nelem(X1)
    k2 = nelem(X2)
    k3 = nelem(X3)

    cf1 = param[1:k1]
    cf2 = param[k1+1:k1+k2]
    cf3 = param[k1+k2+1:k1+k2+k3]

    c = param[k1+k2+k3+1:k1+k2+k3+3]
    if maxc(abs(c)) > 1
        series ret = NA
        return ret
    endif

    S = zeros(3,3)
    S[2,1] = c[1]
    S[3,1] = c[2]
    S[3,2] = c[3]

    c = sumr(S.^2)
    if maxc(c) > 1
        series ret = NA
        return ret
    endif

    S[diag] = 1 - c

    loop foreach j 1 2 3 -q
        series ndx = -lincomb(X$j, cf$j)
        series t$j = y$j ? $huge : ndx
        series b$j = y$j ? ndx : -$huge
    endloop

    matrix A = {b1, b2, b3}
    matrix B = {t1, t2, t3}
    ret = ghk(S, A, B, U)

    return ln(ret)

end function

# --- main ----------------------------------------------

set echo off
set messages off
set skip_missing off
set seed 732237

# generate some artificial data

nulldata 1200

k1 = 1
k2 = 2
k3 = 3

C12 = 0.3
C13 = 0.5
C23 = 0.6

Sigma = {1; C12; C13; 1; C23; 1}
Sigma = unvech(Sigma)

print Sigma

list X = const
loop i=1..k1 -q
    x_$i = uniform()
    X += x_$i
endloop
b1 = mnormal(k1+1, 1)

list Z = const
loop i=1..k2 -q
    z_$i = uniform()
    Z += z_$i
endloop
b2 = mnormal(k2+1, 1)

list W = const
loop i=1..k3 -q
    w_$i = uniform()
    W += w_$i
endloop
b3 = mnormal(k3+1, 1)

matrix E = mnormal($nobs, 3) * cholesky(Sigma)'

series y1star = lincomb(X, b1)+E[,1]
y1 = (y1star>0)
series y2star = lincomb(Z, b2)+E[,2]
y2 = (y2star>0)
series y3star = lincomb(W, b3)+E[,3]
y3 = (y3star>0)

# store prova.csv y1 y2 y3 x* z* w* --csv

# --- proceed with estimation ------------------

rep = 100
U = muniform(3, rep)

# initialise the params by univariate probit models
probit y1 X -q
b1 = $coeff
probit y2 Z -q
b2 = $coeff
probit y3 W -q
b3 = $coeff

matrix theta = b1 | b2 | b3 | zeros(3,1)

# go with MLE
set stopwatch
mle ll = trivp_ll(theta, y1, y2, y3, X, Z, W, &U)
    params theta
end mle -v
t0 = $stopwatch
printf "Time = %g\n", t0
</hansl>

I know Limdep also uses a GHK simulator for its MPROBIT algorithm.
However, the problem is that even a simple trivariate model can take quite
a while to estimate with Limdep's default of 100 pts (on the order or 10-20
minutes for the *N*=750 test model I'm running).  Is gretl's GHK simulator
any faster, or are slow speeds just the nature of the GHK simulation?

Of course, that depends on the number of covariates you're using. Our GHK machine is quite good, if I may say so myself, both in speed and accuracy. Please let us know your impressions.

I think most of Genz's n>3 algorithms are simulation based also, but he has functions that estimate the special trivariate case much more quickly.  I think if those were implemented, the special case of the trivariate probit would run much faster than using GHK.  However, I'm sure someone must have thought of this before, so I'm a little wary that I'm missing something.

True. As I said, it'd be very nice to add Genz's algorithm for the trivariate normal to our rangen() weaponry. We're going to release a new version very soon, so we have all the time to work on this after release.

It's not GHK related, but is there a way run to run a simple (two-level)
FIML nested logit model in gretl?

Not natively, but a Hansl script shouldn't be hard to write. If I'm not mistaken, Claudia Pigini could already have something ready, but I may be wrong. Claudia?


-------------------------------------------------------
  Riccardo (Jack) Lucchetti
  Dipartimento di Scienze Economiche e Sociali (DiSES)

  Università Politecnica delle Marche
  (formerly known as Università di Ancona)

  r.lucchetti@univpm.it
  http://www2.econ.univpm.it/servizi/hpp/lucchetti
-------------------------------------------------------



On Sat, Jul 19, 2014 at 12:57 AM, Riccardo (Jack) Lucchetti <r.lucchetti@univpm.it> wrote:
On Fri, 18 Jul 2014, David van Herick wrote:

Thanks.  I will look at the documentation on the GHK hansl function.  Would
you please send (or post) the example script for the trivariate probit
model?

Here you are. This uses numerical derivatives. It could also be done with analytical derivatives, but the script would be a bit longer.

<hansl>
function series trivp_ll(matrix param, series y1, series y2, series y3,
                         list X1, list X2, list X3, matrix *U)
#    printf "%8.3f", param'

    set warnings off

    k1 = nelem(X1)
    k2 = nelem(X2)
    k3 = nelem(X3)

    cf1 = param[1:k1]
    cf2 = param[k1+1:k1+k2]
    cf3 = param[k1+k2+1:k1+k2+k3]

    c = param[k1+k2+k3+1:k1+k2+k3+3]
    if maxc(abs(c)) > 1
        series ret = NA
        return ret
    endif

    S = zeros(3,3)
    S[2,1] = c[1]
    S[3,1] = c[2]
    S[3,2] = c[3]

    c = sumr(S.^2)
    if maxc(c) > 1
        series ret = NA
        return ret
    endif

    S[diag] = 1 - c

    loop foreach j 1 2 3 -q
        series ndx = -lincomb(X$j, cf$j)
        series t$j = y$j ? $huge : ndx
        series b$j = y$j ? ndx : -$huge
    endloop

    matrix A = {b1, b2, b3}
    matrix B = {t1, t2, t3}
    ret = ghk(S, A, B, U)

    return ln(ret)

end function

# --- main ----------------------------------------------

set echo off
set messages off
set skip_missing off
set seed 732237

# generate some artificial data

nulldata 1200

k1 = 1
k2 = 2
k3 = 3

C12 = 0.3
C13 = 0.5
C23 = 0.6

Sigma = {1; C12; C13; 1; C23; 1}
Sigma = unvech(Sigma)

print Sigma

list X = const
loop i=1..k1 -q
    x_$i = uniform()
    X += x_$i
endloop
b1 = mnormal(k1+1, 1)

list Z = const
loop i=1..k2 -q
    z_$i = uniform()
    Z += z_$i
endloop
b2 = mnormal(k2+1, 1)

list W = const
loop i=1..k3 -q
    w_$i = uniform()
    W += w_$i
endloop
b3 = mnormal(k3+1, 1)

matrix E = mnormal($nobs, 3) * cholesky(Sigma)'

series y1star = lincomb(X, b1)+E[,1]
y1 = (y1star>0)
series y2star = lincomb(Z, b2)+E[,2]
y2 = (y2star>0)
series y3star = lincomb(W, b3)+E[,3]
y3 = (y3star>0)

# store prova.csv y1 y2 y3 x* z* w* --csv

# --- proceed with estimation ------------------

rep = 100
U = muniform(3, rep)

# initialise the params by univariate probit models
probit y1 X -q
b1 = $coeff
probit y2 Z -q
b2 = $coeff
probit y3 W -q
b3 = $coeff

matrix theta = b1 | b2 | b3 | zeros(3,1)

# go with MLE
set stopwatch
mle ll = trivp_ll(theta, y1, y2, y3, X, Z, W, &U)
    params theta
end mle -v
t0 = $stopwatch
printf "Time = %g\n", t0
</hansl>

I know Limdep also uses a GHK simulator for its MPROBIT algorithm.
However, the problem is that even a simple trivariate model can take quite
a while to estimate with Limdep's default of 100 pts (on the order or 10-20
minutes for the *N*=750 test model I'm running).  Is gretl's GHK simulator
any faster, or are slow speeds just the nature of the GHK simulation?

Of course, that depends on the number of covariates you're using. Our GHK machine is quite good, if I may say so myself, both in speed and accuracy. Please let us know your impressions.

I think most of Genz's n>3 algorithms are simulation based also, but he has functions that estimate the special trivariate case much more quickly.  I think if those were implemented, the special case of the trivariate probit would run much faster than using GHK.  However, I'm sure someone must have thought of this before, so I'm a little wary that I'm missing something.

True. As I said, it'd be very nice to add Genz's algorithm for the trivariate normal to our rangen() weaponry. We're going to release a new version very soon, so we have all the time to work on this after release.

It's not GHK related, but is there a way run to run a simple (two-level)
FIML nested logit model in gretl?

Not natively, but a Hansl script shouldn't be hard to write. If I'm not mistaken, Claudia Pigini could already have something ready, but I may be wrong. Claudia?


-------------------------------------------------------
  Riccardo (Jack) Lucchetti
  Dipartimento di Scienze Economiche e Sociali (DiSES)

  Università Politecnica delle Marche
  (formerly known as Università di Ancona)

  r.lucchetti@univpm.it
  http://www2.econ.univpm.it/servizi/hpp/lucchetti
-------------------------------------------------------