void getCRPerformance (uint mode, uint obsSize, double **responsePtr, double **conditionalMortality, uint *ensembleDenPtr, double *performanceVector) { uint mRecordSize; int **mpSign; uint *mRecordIndex; uint *meIndividualSize; uint **eIndividual; double concordanceIndex; uint j; if (!(RF_opt & OPT_COMP_RISK)) { Rprintf("\nRF-SRC: *** ERROR *** "); Rprintf("\nRF-SRC: Attempt at conditional performance updates in a non-CR analysis."); Rprintf("\nRF-SRC: Please Contact Technical Support."); error("\nRF-SRC: The application will now exit.\n"); } if (RF_mStatusSize > 0) { if (mode != RF_PRED) { mRecordSize = RF_mRecordSize; mpSign = RF_mpSign; mRecordIndex = RF_mRecordIndex; } else { mRecordSize = RF_fmRecordSize; mpSign = RF_fmpSign; mRecordIndex = RF_fmRecordIndex; } meIndividualSize = uivector(1, RF_eventTypeSize); eIndividual = (uint **) new_vvector(1, RF_eventTypeSize, NRUTIL_UPTR); for (j = 1; j <= RF_eventTypeSize; j++) { eIndividual[j] = uivector(1, RF_eIndividualSize[j] + RF_mStatusSize + 1); } updateEventTypeSubsets(responsePtr[RF_statusIndex], mRecordSize, mpSign, mRecordIndex, meIndividualSize, eIndividual); } else { meIndividualSize = RF_eIndividualSize; eIndividual = RF_eIndividualIn; } double *subsettedTime = dvector(1, obsSize); double *subsettedStatus = dvector(1, obsSize); double *subsettedMortality = dvector(1, obsSize); uint *subsettedEnsembleDen = uivector(1, obsSize); for (j = 1; j <= RF_eventTypeSize; j++) { getConditionalConcordanceArrays(j, responsePtr[RF_timeIndex], responsePtr[RF_statusIndex], conditionalMortality[j], ensembleDenPtr, meIndividualSize, eIndividual, subsettedTime, subsettedStatus, subsettedMortality, subsettedEnsembleDen); concordanceIndex = getConcordanceIndex(1, meIndividualSize[j], subsettedTime, subsettedStatus, subsettedMortality, subsettedEnsembleDen); if (ISNA(concordanceIndex)) { performanceVector[j] = NA_REAL; } else { performanceVector[j] = concordanceIndex; } } if (RF_mStatusSize > 0) { free_uivector(meIndividualSize, 1, RF_eventTypeSize); for (j = 1; j <= RF_eventTypeSize; j++) { free_uivector(eIndividual[j], 1, RF_eIndividualSize[j] + RF_mStatusSize + 1); } free_new_vvector(eIndividual, 1, RF_eventTypeSize, NRUTIL_UPTR); } free_dvector(subsettedTime, 1, obsSize); free_dvector(subsettedStatus, 1, obsSize); free_dvector(subsettedMortality, 1, obsSize); free_uivector(subsettedEnsembleDen, 1, obsSize); }
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); } }