protected void calcCounts(CoxPHModel model, final CoxPHTask coxMR) { CoxPHModel.CoxPHParameters p = model._parms; CoxPHModel.CoxPHOutput o = model._output; o.n_missing = o.n - coxMR.n; o.n = coxMR.n; for (int j = 0; j < o.x_mean_cat.length; j++) o.x_mean_cat[j] = coxMR.sumWeightedCatX[j] / coxMR.sumWeights; for (int j = 0; j < o.x_mean_num.length; j++) o.x_mean_num[j] = coxMR.dinfo()._normSub[j] + coxMR.sumWeightedNumX[j] / coxMR.sumWeights; System.arraycopy( coxMR.dinfo()._normSub, o.x_mean_num.length, o.mean_offset, 0, o.mean_offset.length); int nz = 0; for (int t = 0; t < coxMR.countEvents.length; ++t) { o.total_event += coxMR.countEvents[t]; if (coxMR.sizeEvents[t] > 0 || coxMR.sizeCensored[t] > 0) { o.time[nz] = o.min_time + t; o.n_risk[nz] = coxMR.sizeRiskSet[t]; o.n_event[nz] = coxMR.sizeEvents[t]; o.n_censor[nz] = coxMR.sizeCensored[t]; nz++; } } if (p.start_column == null) for (int t = o.n_risk.length - 2; t >= 0; --t) o.n_risk[t] += o.n_risk[t + 1]; }
protected void calcModelStats( CoxPHModel model, final double[] newCoef, final double newLoglik) { CoxPHModel.CoxPHParameters p = model._parms; CoxPHModel.CoxPHOutput o = model._output; final int n_coef = o.coef.length; final Matrix inv_hessian = new Matrix(o.hessian).inverse(); for (int j = 0; j < n_coef; ++j) { for (int k = 0; k <= j; ++k) { final double elem = -inv_hessian.get(j, k); o.var_coef[j][k] = elem; o.var_coef[k][j] = elem; } } for (int j = 0; j < n_coef; ++j) { o.coef[j] = newCoef[j]; o.exp_coef[j] = Math.exp(o.coef[j]); o.exp_neg_coef[j] = Math.exp(-o.coef[j]); o.se_coef[j] = Math.sqrt(o.var_coef[j][j]); o.z_coef[j] = o.coef[j] / o.se_coef[j]; } if (o.iter == 0) { o.null_loglik = newLoglik; o.maxrsq = 1 - Math.exp(2 * o.null_loglik / o.n); o.score_test = 0; for (int j = 0; j < n_coef; ++j) { double sum = 0; for (int k = 0; k < n_coef; ++k) sum += o.var_coef[j][k] * o.gradient[k]; o.score_test += o.gradient[j] * sum; } } o.loglik = newLoglik; o.loglik_test = -2 * (o.null_loglik - o.loglik); o.rsq = 1 - Math.exp(-o.loglik_test / o.n); o.wald_test = 0; for (int j = 0; j < n_coef; ++j) { double sum = 0; for (int k = 0; k < n_coef; ++k) sum -= o.hessian[j][k] * (o.coef[k] - p.init); o.wald_test += (o.coef[j] - p.init) * sum; } }
protected void initStats(final CoxPHModel model, final DataInfo dinfo) { CoxPHModel.CoxPHParameters p = model._parms; CoxPHModel.CoxPHOutput o = model._output; o.n = p.stop_column.length(); o.data_info = dinfo; final int n_offsets = (p.offset_columns == null) ? 0 : p.offset_columns.length; final int n_coef = o.data_info.fullN() - n_offsets; final String[] coefNames = o.data_info.coefNames(); o.coef_names = new String[n_coef]; System.arraycopy(coefNames, 0, o.coef_names, 0, n_coef); o.coef = MemoryManager.malloc8d(n_coef); o.exp_coef = MemoryManager.malloc8d(n_coef); o.exp_neg_coef = MemoryManager.malloc8d(n_coef); o.se_coef = MemoryManager.malloc8d(n_coef); o.z_coef = MemoryManager.malloc8d(n_coef); o.gradient = MemoryManager.malloc8d(n_coef); o.hessian = malloc2DArray(n_coef, n_coef); o.var_coef = malloc2DArray(n_coef, n_coef); o.x_mean_cat = MemoryManager.malloc8d(n_coef - (o.data_info._nums - n_offsets)); o.x_mean_num = MemoryManager.malloc8d(o.data_info._nums - n_offsets); o.mean_offset = MemoryManager.malloc8d(n_offsets); o.offset_names = new String[n_offsets]; System.arraycopy(coefNames, n_coef, o.offset_names, 0, n_offsets); final Vec start_column = p.start_column; final Vec stop_column = p.stop_column; o.min_time = p.start_column == null ? (long) stop_column.min() : (long) start_column.min() + 1; o.max_time = (long) stop_column.max(); final int n_time = new Vec.CollectDomain().doAll(stop_column).domain().length; o.time = MemoryManager.malloc8(n_time); o.n_risk = MemoryManager.malloc8d(n_time); o.n_event = MemoryManager.malloc8d(n_time); o.n_censor = MemoryManager.malloc8d(n_time); o.cumhaz_0 = MemoryManager.malloc8d(n_time); o.var_cumhaz_1 = MemoryManager.malloc8d(n_time); o.var_cumhaz_2 = malloc2DArray(n_time, n_coef); }