orthopen to orthoMTLThis 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().orthopenorthopen() →
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.