The R Project SVN R-packages

Rev

Rev 6391 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/*
 *  rescale an Survival time so that it is essentially exponential
 *   each interval between deaths has the same number of person-years
 *
 *  n   number of observations
 *  y   survival object, sorted by death times
 *  wt      vector of weights, sorted
 * output
 *      newy    rescaled time vector
 * scratch
 *      wtemp(n)
 */
#include "rpart.h"

void
rpartexp(int *n2, double *y, double *wt, double *newy, double *wtemp)
{
    int n;
    double *stop, *event;
    int i, j;
    double tsum, dsum;          /* weighted sums of times and deaths */
    double time, ltime, rtime;
    double temp;
    double psum, scale;
    int last;

    n = *n2;
    stop = y;
    event = y + n;

    temp = 0;
    for (i = n - 1; i >= 0; i--) {
    temp += wt[i];
    wtemp[i] = temp;        /* sum of weights */
    }

    last = 0;
    ltime = 0;                  /* last event time */
    rtime = 0;                  /* rescaled time, cumulative */
    while (last < n) {
       /*
    * look ahead to find the next death
    */
    psum = 0;
    for (i = last; i < n && event[i] == 0; i++)
        psum += wt[i] * (stop[i] - ltime);  /* partial intervals */

       /*
    * Found it (or the end of the data)
    */
    if (i > n) {            /* no more deaths */
        for (i = last; i < n; i++)
        newy[i] = rtime;
        last = n;
    } else {                /* rescale this interval */
       /*
        * count up the sum of the weighted deaths
        */
        dsum = 0;
        time = stop[i];
        for (; i < n && event[i] == 1 && stop[i] == time; i++)
        dsum += wt[i];  /* tied deaths */

        tsum = (wtemp[i] + dsum) * (time - ltime) + psum;
        scale = dsum / tsum;        /* scaling factor */

        for (j = last; j < i; j++)
        newy[j] = rtime + (stop[j] - ltime) * scale;
        rtime += (time - ltime) * scale;
        last = i;
        ltime = time;
    }
    }
}