https://github.com/cran/aster
Raw File
Tip revision: fa7795259e71bf245e06b2cf7c012e2f3322cd2f authored by Charles J. Geyer on 14 March 2008, 00:00:00 UTC
version 0.7-4
Tip revision: fa77952
astunco.c

#include "aster.h"
#include "raster.h"

void aster_mlogl_unco(int *nindin, int *nnodein, int *ncoefin, int *pred,
    int *fam, int *derivin, double *beta, double *root, double *x,
    double *origin,
    double *modmat, double *value, double *gradient, double *hessian)
{
    int nind = nindin[0];
    int nnode = nnodein[0];
    int ncoef = ncoefin[0];
    int deriv = derivin[0];
    int ndata = nind * nnode;
    int zero = 0;
    int one = 1;

    int i;
    double *phi, *theta, *xpred, *psi, *psi_prime, *tau, *gfull, *varx;

    aster_check_model_data(nindin, nnodein, pred, fam, x, root);

    phi = (double *) my_malloc(ndata * sizeof(double));
    theta = (double *) my_malloc(ndata * sizeof(double));
    xpred = (double *) my_malloc(ndata * sizeof(double));
    psi = (double *) my_malloc(ndata * sizeof(double));

    aster_mat_vec_mult(&ndata, &ncoef, modmat, beta, phi);
    for (i = 0; i < ndata; ++i)
        phi[i] += origin[i];
    aster_phi2theta(&nind, &nnode, pred, fam, phi, theta);
    aster_xpred(&nind, &nnode, pred, fam, x, root, xpred);
    aster_theta2whatsis(&nind, &nnode, pred, fam, &zero, theta, psi);

    value[0] = 0.0;
    for (i = 0; i < ndata; ++i)
        value[0] -= x[i] * theta[i] - xpred[i] * psi[i];

    if (my_is_na_or_nan(value[0]))
        value[0] = my_posinf();
    if (value[0] == my_neginf())
        die("calculated log likelihood + infinity, impossible");

    if (deriv >= 1 && value[0] < my_posinf()) {
        psi_prime = (double *) my_malloc(ndata * sizeof(double));
        tau = (double *) my_malloc(ndata * sizeof(double));
        gfull = (double *) my_malloc(ndata * sizeof(double));
        aster_theta2whatsis(&nind, &nnode, pred, fam, &one, theta, psi_prime);
        aster_ctau2tau(&nind, &nnode, pred, fam, root, psi_prime, tau);
        for (i = 0; i < ndata; ++i)
            gfull[i] = - (x[i] - tau[i]);
        aster_vec_mat_mult(&ndata, &ncoef, modmat, gfull, gradient);

        if (deriv >= 2) {
            varx = (double *) my_malloc(ndata * sizeof(double));
            aster_tt2var(&nind, &nnode, pred, fam, x, root, theta, tau, varx);
#ifdef ASTER_OLD_STUFF
            aster_unco_hess(&nind, &nnode, &ncoef, pred, fam,
                psi_prime, varx, modmat, hessian);
#else
            aster_a_delsqpsi_m(&nind, &nnode, &ncoef, &ncoef, pred, fam,
                psi_prime, varx, modmat, modmat, hessian);
#endif /* ASTER_OLD_STUFF */
            my_free(varx);
        }

        my_free(gfull);
        my_free(tau);
        my_free(psi_prime);
    }

    my_free(psi);
    my_free(xpred);
    my_free(theta);
    my_free(phi);
}

back to top