Skip to content

Increase robustness of sim1.m by handling the case when A\res contains nan or inf

Tom Holden requested to merge tholden:master into master

sim1.m calls lin_solve to perform A\res after this change. lin_solve_robust.m is provided as an even more robust alternative which perhaps could be enabled later via an option.

See the below multi-country irreversible investment model for an example of why this helps:

@#define NumberOfCountries = 2
@#define Deterministic = 1

var log_kappa;
@#for Country in 1:NumberOfCountries
    var mu@{Country}, logit_l@{Country}, k@{Country}, a@{Country};
@#endfor

parameters alpha beta varrho delta theta rhoA sigmaA;

alpha = 0.3;
beta = 0.99;
varrho = 1.5;
delta = 0.025;
theta = 0.9;
rhoA = 0.95;
sigmaA = 0.05;

@#for Country in 1:NumberOfCountries
    varexo epsilonA@{Country};
@#endfor

model;

    #kappa = exp( log_kappa );
    #LEAD_kappa = exp( log_kappa(+1) );

    #min_A = theta ^ ( 1/alpha );
    #mean_a = log( 1 - min_A );

    @#for Country in 1:NumberOfCountries

        #K@{Country}        = exp( k@{Country} );
        #LAG_K@{Country}    = exp( k@{Country}(-1) );
        #LEAD_A@{Country}   = min_A + exp( a@{Country}(+1) );
        #A@{Country}        = min_A + exp( a@{Country} );
        #LAG_A@{Country}    = min_A + exp( a@{Country}(-1) );
        #L@{Country}        = 1 / ( 1 + exp( -logit_l@{Country} ) );
        #LEAD_L@{Country}   = 1 / ( 1 + exp( -logit_l@{Country}(+1) ) );

        #C@{Country} = kappa ^ ( -1/varrho ) - theta / ( 1-alpha ) * ( A@{Country}*(1-L@{Country}) ) ^ ( 1-alpha );
        #LEAD_phi@{Country} = ( 1 - theta * ( LEAD_A@{Country}*(1-LEAD_L@{Country}) ) ^ ( -alpha ) ) * LEAD_kappa;
        #I@{Country} = K@{Country} - ( 1-delta ) * LAG_K@{Country};

    @#endfor

    @#for Country in 1:NumberOfCountries

        ( a@{Country} - mean_a ) = rhoA * ( a@{Country}(-1) - mean_a ) - sigmaA * epsilonA@{Country};
        L@{Country} = min( LAG_K@{Country} / A@{Country}, 1 - theta ^ ( 1/alpha ) / A@{Country} );
        kappa - mu@{Country} = beta * ( ( 1-delta ) * ( LEAD_kappa - mu@{Country}(+1) ) + LEAD_phi@{Country} );
        kappa = max( beta * ( ( 1-delta ) * ( LEAD_kappa - mu@{Country}(+1) ) + LEAD_phi@{Country} ), ( theta / ( 1-alpha ) * ( A@{Country}*(1-L@{Country}) ) ^ ( 1-alpha )
        @#for OtherCountry in 1:NumberOfCountries
            + A@{OtherCountry} * L@{OtherCountry}
            @#if OtherCountry != Country
                - C@{OtherCountry} - I@{OtherCountry}
            @#endif
        @#endfor
        ) ^ ( -varrho ) );

    @#endfor

    0 = 0
    @#for OtherCountry in 1:NumberOfCountries
        + A@{OtherCountry} * L@{OtherCountry}
        - C@{OtherCountry} - I@{OtherCountry}
    @#endfor
    ;

end;

steady_state_model;

    a = log( 1 - theta ^ ( 1/alpha ) );
    mu = 0;
    L = 1 - ( 1/theta * ( 2 - 1/beta - delta ) ) ^ ( -1/alpha );
    K = L;
    I = delta * K;
    C = ( 1 - delta ) * L;

    kappa_ = ( C + theta / ( 1-alpha ) * ( 1-L ) ^ ( 1-alpha ) ) ^ ( -varrho );

    log_kappa = log( kappa_ );

    @#for Country in 1:NumberOfCountries

        mu@{Country} = mu;
        logit_l@{Country} = log( L / ( 1 - L ) );
        k@{Country} = log( K );
        a@{Country} = a;

    @#endfor

end;

steady;
check;

shocks;

    @#if Deterministic
        var epsilonA1; periods 1; values 2;
        @#for Country in 2:NumberOfCountries
            var epsilonA@{Country}; periods 1; values 0;    
        @#endfor
    @#else
        @#for Country in 1:NumberOfCountries
            var epsilonA@{Country} = 1; 
        @#endfor
    @#endif

end;

@#if Deterministic
    simul( periods = 400 );
@#else
    stoch_simul( order = 3, irf = 200 );
@#endif

Merge request reports