DESCRIPTION now lists the project page (URL) and the issue tracker
(BugReports), so bug reports can be filed from the CRAN page.nnmaxheap_C(), the projection onto non-negative, non-increasing vectors,
returned wrong values in the 0.1.0 release (#12, reported by @D4EM3ON). Any
single-element block overwrote the first value of the next block, and a
negative final value was not clipped at 0. For example,
nnmaxheap_C(c(5, 3, 3, 1)) returned 5 5 5 1 instead of 5 3 3 1, and
nnmaxheap_C(c(3, 1, 2, -1)) returned 3 3 3 -1 instead of 3 1.5 1.5 0.
The output was still non-increasing, but its values were inflated, so this
changes numerical results wherever the projection is applied:
predict() on survival fits (survival = TRUE) and the scores used by
cv_orthoMTL(survival = TRUE), hence its model selection. Regression and
classification fits are not affected. Results produced with 0.1.0 on
survival data should be recomputed. The projection used in the earlier
internal versions of the code behind the published analyses was correct and
is not affected. The function is now tested against an isotonic-regression
oracle (stats::isoreg).This release represents a major refactor and scope expansion of the
orthopen package (https://github.com/kevinVervier/orthopen).
survival and censored.mat arguments
in orthoMTL() enable censored time-to-event data.alpha mixing parameter in [0, 1] blending
the orthogonality penalty (alpha = 0) with L1/Lasso (alpha = 1).create_longitudinal_labels(),
create_indicator_matrix(), create_constraint_matrix().cv_orthoMTL() with parallel grid search over
lambda, step size, diagonal value, and elastic-net mixing.bootstrap_orthoMTL() compares real
coefficient variability against null-model permutations.cindex_mtl() for multi-task concordance index.plot_heatmap(), plot_correlation(),
plot_prediction(), plot_bootstrap().orthopen() → orthoMTL().$W → $B.disjoint changed from TRUE to FALSE.alpha mixing parameter in
[0, 1] (replacing the enet/lambda1 pair). The penalty is
lambda * [(1-alpha)/2 * Omega_K(W)^2 + alpha * ||W||_1], ported from
orthopen v1.1.0. This fixes the previous inconsistent mixing
(L2 ≈ 0.25lambda vs L1 = 0.5lambda1).Iso package dependency removed; replaced by internal
nnmaxheap_C().T (masking base::TRUE) renamed to numTasks.X, Y, lambda, alpha.max_iter is reached without convergence.y = -1.max(-z,0) + log1p(exp(-|z|)) and exponent clipping in the gradient.testthat runner,
inst/CITATION, GitHub Actions CI.The solver already supported regression (logistic = FALSE,
survival = FALSE) and classification (logistic = TRUE); these are now
first-class end-to-end with matching evaluation, tuning, and simulation
scaffolding (previously survival-only):
rmse_mtl(), r2_mtl() (regression) and
accuracy_mtl(), auc_mtl() (classification), complementing the
survival cindex_mtl() (unchanged).cv_orthoMTL() gains logistic and
metric arguments. The scoring metric now defaults by mode — cindex
for survival, auc for logistic, rmse otherwise — and selection
honours each metric's optimisation direction.predict() type argument: "link" (default, unchanged),
"response" (sigmoid probabilities for logistic fits), and "class"
(predicted {-1, +1} labels for logistic fits).simulate_mtl(mode = ...) now generates
"regression" and "classification" responses in addition to
"survival" (the default).schedule argument to orthoMTL()).
The previously hardcoded sqrt(i) decay is now schedule = "sqrt" (the
default, reproducing prior results exactly); "log", "const", and
"linear" are also available. An A/B study
(validation/ab_s02_gradient_schedule.R) found "log"/"const" reach the
same optimum ~12--17x faster than "sqrt", while "linear" can stall.
Changing the schedule changes the optimisation path and the exact
coefficients, so the default is unchanged. cv_orthoMTL() and
bootstrap_orthoMTL() gained a matching schedule argument (passed to every
fit), so grid search and bootstrap can use the faster schedules too.cv_orthoMTL(survival = FALSE) previously scored every fold with the
survival C-index regardless of the data; it now defaults to RMSE for
plain regression (and AUC when logistic = TRUE). Pass metric = "cindex" to restore the old scoring.