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); }
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); } }