Пример #1
0
void free_dmatrix4(double ****v, unsigned long n4l, unsigned long n4h, unsigned long n3l, unsigned long n3h, unsigned long nrl, unsigned long nrh, unsigned long ncl, unsigned long nch) {
  for(unsigned long i = n4l; i <= n4h; i++) {
    free_dmatrix3(v[i], n3l, n3h, nrl, nrh, ncl, nch);
  }
  free_new_vvector(v, n4l, n4h, NRUTIL_DPTR3);
}
Пример #2
0
void finalizeVariableImportance(uint       mode,
                                uint       rejectedTreeCount, 
                                char     **dmRecordBootFlag,
                                double  ***dmvImputation) {
  uint      obsSize = 0;
  uint      varCount = 0;
  double   *statusPtr = NULL;
  double   *timePtr = NULL;
  uint     *ensembleDenPtr = NULL;
  double    concordanceIndex;
  int       concordancePolarity;
  char      concordanceImputeFlag;  
  double   *crPerformanceVector;
  double ***crVimpMortality;
  double    value;
  uint     *denominatorCount;
  uint i, j, k, p;
  if (!(rejectedTreeCount < _forestSize)) {
    Rprintf("\nRSF:  *** WARNING *** ");
    Rprintf("\nRSF:  Insufficient trees for VIMP analysis.  \n");
    return;
  }
  if (!(_opt & OPT_VIMP)) {
    Rprintf("\nRSF:  *** WARNING *** ");
    Rprintf("\nRSF:  VIMP analysis requested while OPT bit not set.  \n");
    return;
  }
  crPerformanceVector = NULL;  
  crVimpMortality     = NULL;  
  if (_opt & (OPT_POUT_TYPE)) {
    concordancePolarity = -1;
  }
  else {
    concordancePolarity = 1;
  }
  concordanceImputeFlag = FALSE;
  switch (mode) {
  case RSF_GROW:
    obsSize = _observationSize;
    varCount = _xSize;
    statusPtr = _status;
    timePtr = _time;
    ensembleDenPtr = _oobEnsembleDen;
    if (_mRecordSize > 0) {
      concordanceImputeFlag = TRUE;
    }
    break;
  case RSF_PRED:
    obsSize = _fobservationSize;
    varCount = _xSize;
    statusPtr = _fstatus;
    timePtr = rsf_ftime;
    ensembleDenPtr = _fullEnsembleDen;
    if (_fmRecordSize > 0) {
      concordanceImputeFlag = TRUE;
    }
    break;
  case RSF_INTR:
    obsSize = _fobservationSize;
    if (_opt & (~OPT_VIMP) & OPT_VIMP_JOIN) {
      varCount = 1;
    }
    else {
      varCount = _intrPredictorSize;
    }
    statusPtr = _fstatus;
    timePtr = rsf_ftime;
    ensembleDenPtr = _oobEnsembleDen;
    if (_fmRecordSize > 0) {
      concordanceImputeFlag = TRUE;
    }
    break;
  default:
    Rprintf("\nRSF:  *** ERROR *** ");
    Rprintf("\nRSF:  Unknown case in switch encountered. ");
    Rprintf("\nRSF:  Please Contact Technical Support.");
    error("\nRSF:  The application will now exit.\n");
    break;
  }
  if (_opt & OPT_VOUT_TYPE) {
    denominatorCount = uivector(1, obsSize);
  }
  else {
    denominatorCount = ensembleDenPtr;
  }
  if (_eventTypeSize > 1) {
    crVimpMortality = dmatrix3(1, varCount, 1, _eventTypeSize, 1, obsSize);
    crPerformanceVector = dvector(1, _eventTypeSize);
    for (p=1; p <= varCount; p++) {
      for (i = 1; i <= obsSize; i++) {
        for (j = 1; j <= _eventTypeSize; j++) {
          for (k = 1; k <= _sortedTimeInterestSize; k++) {
            if(_crVimpEnsemble[p][j][k][i] > 0) {
              if (_crVimpPOE[p][j][i] > 0) {
                value = _crVimpEnsemble[p][j][k][i] / _crVimpPOE[p][j][i];
                value = (value <= 1.0) ? value : 1.0;
                _crVimpEnsemble[p][j][k][i] = - log (value);
              }
              else {
                value = _crVimpEnsemble[p][j][k][i] / 1.0;
                value = (value <= 1.0) ? value : 1.0;
                _crVimpEnsemble[p][j][k][i] = - log (value);
              }
            }
            else {
              if (_crVimpPOE[p][j][i] > 0) {
                if (k > 1) {
                  _crVimpEnsemble[p][j][k][i] = _crVimpEnsemble[p][j][k-1][i];
                }
                else {
                  _crVimpEnsemble[p][j][k][i] = 0.0;
                }
              }
              else {
                _crVimpEnsemble[p][j][k][i] = 1.0;
              }
            }
          }
        }
      }  
    }  
    for (p = 1; p <= varCount; p++) {
      for (j = 1; j <= _eventTypeSize; j++) {
        for (i = 1; i <= obsSize; i++) {
          crVimpMortality[p][j][i] = 0.0;
            for (k = 1; k <= _sortedTimeInterestSize; k++) {            
              crVimpMortality[p][j][i] += _crVimpEnsemble[p][j][k][i];
            }
        }
      }
    }
  }  
  if (concordanceImputeFlag == TRUE) {
    imputeConcordance(mode,
                      _forestSize,
                      dmRecordBootFlag,
                      dmvImputation,
                      statusPtr,
                      timePtr);
  }
  for (p=1; p <= varCount; p++) {
    for (i = 1; i <= obsSize; i++) {
      if (_opt & OPT_VOUT_TYPE) {
        denominatorCount[i] = ensembleDenPtr[i] - _oobVimpInvalidDen[p][i];
      }
      if (denominatorCount[i] != 0) {
        _vimpMortality[p][i] = _vimpMortality[p][i] / denominatorCount[i];
      }
    }
    concordanceIndex = getConcordanceIndex(concordancePolarity,
                                           obsSize, 
                                           statusPtr,
                                           timePtr,
                                           _vimpMortality[p], 
                                           denominatorCount);
    if (ISNA(concordanceIndex)) {
      _importancePtr[1][p] = NA_REAL;
    }
    else {
      _importancePtr[1][p] = 1 - concordanceIndex;
    }
    if (_eventTypeSize > 1) {
      getConditionalPerformance(mode,
                                concordancePolarity, 
                                obsSize, 
                                statusPtr,
                                timePtr,
                                crVimpMortality[p], 
                                denominatorCount,
                                crPerformanceVector);
      for (j=1; j <=_eventTypeSize; j++) {
        _importancePtr[1+j][p] = crPerformanceVector[j];
      }
    }  
  }  
  if (_eventTypeSize > 1) {
    free_dvector(crPerformanceVector, 1, _eventTypeSize);
    free_dmatrix3(crVimpMortality, 1, varCount, 1, _eventTypeSize, 1, obsSize);
  }
  if (_opt & OPT_VOUT_TYPE) {
    free_uivector(denominatorCount, 1, obsSize);
  }
}