cv.missoNet {missoNet} | R Documentation |
Cross-validation for missoNet
Description
This function performs k-fold cross-validation for ‘missoNet
’. The regularization path is computed
for all possible combinations of values given in the two regularization parameter sequences, namely \lambda_B
and \lambda_\Theta
.
‘cv.missoNet
’ will select the most suitable model among all cross-validated fits along the path.
See the details of ‘missoNet
’ for the model definition.
To help users, the ‘cv.missoNet
’ function is designed to automatically determine the likely ranges
of the regularization parameters over which the cross-validation searches.
Usage
cv.missoNet(
X,
Y,
kfold = 5,
rho = NULL,
lambda.Beta = NULL,
lambda.Theta = NULL,
lamBeta.min.ratio = NULL,
lamTheta.min.ratio = NULL,
n.lamBeta = NULL,
n.lamTheta = NULL,
lamBeta.scale.factor = 1,
lamTheta.scale.factor = 1,
Beta.maxit = 1000,
Beta.thr = 1e-04,
eta = 0.8,
Theta.maxit = 1000,
Theta.thr = 1e-04,
eps = 1e-08,
penalize.diagonal = TRUE,
diag.penalty.factor = NULL,
standardize = TRUE,
standardize.response = TRUE,
fit.1se = FALSE,
fit.relax = FALSE,
permute = TRUE,
with.seed = NULL,
parallel = FALSE,
cl = NULL,
verbose = 1
)
Arguments
X |
Numeric predictor matrix ( |
Y |
Numeric response matrix ( |
kfold |
Number of folds for cross-validation – the default is |
rho |
(Optional) A scalar or a numeric vector of length |
lambda.Beta |
(Optional) Numeric vector: a user-supplied sequence of non-negative values for { |
lambda.Theta |
(Optional) Numeric vector: a user-supplied sequence of non-negative values for { |
lamBeta.min.ratio |
The smallest value of |
lamTheta.min.ratio |
The smallest value of |
n.lamBeta |
The number of |
n.lamTheta |
The number of |
lamBeta.scale.factor |
A positive multiplication factor for scaling the entire |
lamTheta.scale.factor |
A positive multiplication factor for scaling the entire |
Beta.maxit |
The maximum number of iterations of the fast iterative shrinkage-thresholding algorithm (FISTA) for updating |
Beta.thr |
The convergence threshold of the FISTA algorithm for updating |
eta |
The backtracking line search shrinkage factor; the default is |
Theta.maxit |
The maximum number of iterations of the ‘ |
Theta.thr |
The convergence threshold of the ‘ |
eps |
A numeric tolerance level for the L1 projection of the empirical covariance matrix; the default is |
penalize.diagonal |
Logical: should the diagonal elements of |
diag.penalty.factor |
Numeric: a separate penalty multiplication factor for the diagonal elements of |
standardize |
Logical: should the columns of |
standardize.response |
Logical: should the columns of |
fit.1se |
Logical: the default is |
fit.relax |
Logical: the default is |
permute |
Logical: should the subject indices for the cross-validation be permuted? The default is |
with.seed |
A random number seed for the permutation. |
parallel |
Logical: the default is |
cl |
A cluster object created by ‘ |
verbose |
Value of |
Details
The ‘cv.missoNet
’ function fits ‘missoNet
’ models ('kfold'
*
'n.lamBeta'
*
'n.lamTheta'
)
times in the whole cross-validation process. That is, for the k
th-fold (k=1,...,K
) computation, the models are fitted at each of
the all ('n.lamBeta'
*
'n.lamTheta'
) possible combinations of the regularization parameters (\lambda_B
, \lambda_\Theta
), with the k
th
fold of the training data omitted. The errors are accumulated, and the averaged errors as well as the standard deviations are computed over all folds.
Note that the results of ‘cv.missoNet
’ are random, since the samples are randomly split into k-folds. Users can eliminate this randomness
by setting 'permute = FALSE'
, or by explicitly assigning a seed to the permutation of samples.
A user-supplied sequence for {\lambda_B
} and/or {\lambda_\Theta
} is permitted,
otherwise the program computes an appropriate range of values for the regularization parameters using other control arguments.
Note that ‘cv.missoNet
’ standardizes 'X'
and 'Y'
to have unit variances before computing its \lambda
sequences (and then unstandardizes the resulting coefficients); if you wish to reproduce/compare results with those of other softwares,
it is best to supply pre-standardized 'X'
and 'Y'
. If the algorithm is running slowly, track its progress with 'verbose = 2'
.
In most cases, choosing a sparser grid for the regularization parameters (e.g. smaller 'n.lamBeta'
and/or 'n.lamTheta'
) or setting 'Beta.thr = 1.0E-3'
(or even bigger)
allows the algorithm to make faster progress.
After cross-validation, the regression coefficient matrix \mathbf{B}
and the precision matrix \mathbf{\Theta}
can be
estimated at three special \lambda
pairs, by reapplying ‘missoNet
’ to the entire training dataset:
"
lambda.min
" := ({\lambda_B}_\mathrm{min}, {\lambda_\Theta}_\mathrm{min}
), at which the minimum mean cross-validated error is achieved;"
lambda.1se.Beta
" := ({\lambda_B}_\mathrm{1se}, {\lambda_\Theta}_\mathrm{min}
), where{\lambda_B}_\mathrm{1se}
is the largest\lambda_B
at which the mean cross-validated error is within one standard error of the minimum;"
lambda.1se.Theta
" := ({\lambda_B}_\mathrm{min}, {\lambda_\Theta}_\mathrm{1se}
), where{\lambda_\Theta}_\mathrm{1se}
is the largest\lambda_\Theta
at which the mean cross-validated error is within one standard error of the minimum.
The corresponding estimates, along with the \lambda
values, are stored in three separate lists inside the returned object:
'est.min'
, 'est.1se.B'
and 'est.1se.Tht'
('est.1se.B'
and 'est.1se.Tht'
are 'NULL'
unless the argument 'fit.1se = TRUE'
when calling ‘cv.missoNet
’).
The ‘cv.missoNet
’ function returns an R object of S3 class 'cv.missoNet'
for which there are a set of accessory functions available.
The plotting function ‘plot.cv.missoNet
’ can be used to graphically identify the optimal pair of the regularization parameters,
and the prediction function ‘predict.cv.missoNet
’ can be used to make predictions of response values given new input 'X'
.
See the vignette for examples.
Value
This function returns a 'cv.missoNet'
object containing a named 'list'
with all the ingredients of the cross-validated fit:
est.min |
A
|
est.1se.B |
A |
est.1se.Tht |
A |
rho |
A vector of length |
fold.index |
The subject indices identifying which fold each observation is in. |
lambda.Beta.vec |
A flattened vector of length ( |
lambda.Theta.vec |
A flattened vector of length ( |
cvm |
A flattened vector of length ( |
cvup |
Upper cross-validated errors. |
cvlo |
Lower cross-validated errors. |
penalize.diagonal |
Logical: whether the diagonal elements of |
diag.penalty.factor |
The additional penalty multiplication factor for the diagonal elements of |
Author(s)
Yixiao Zeng yixiao.zeng@mail.mcgill.ca, Celia M.T. Greenwood and Archer Yi Yang.
Examples
## Simulate a dataset with response values missing completely at random (MCAR),
## the overall missing rate is around 10%.
set.seed(123) # reproducibility
sim.dat <- generateData(n = 300, p = 50, q = 20, rho = 0.1, missing.type = "MCAR")
tr <- 1:240 # training set indices
tst <- 241:300 # test set indices
X.tr <- sim.dat$X[tr, ] # predictor matrix
Y.tr <- sim.dat$Z[tr, ] # corrupted response matrix
## Perform a five-fold cross-validation WITH specified 'lambda.Beta' and 'lambda.Theta'.
## 'standardize' and 'standardize.response' are 'TRUE' by default.
lamB.vec <- 10^(seq(from = 0, to = -1, length.out = 5))
lamTht.vec <- 10^(seq(from = 0, to = -1, length.out = 5))
cvfit <- cv.missoNet(X = X.tr, Y = Y.tr, kfold = 5,
lambda.Beta = lamB.vec, lambda.Theta = lamTht.vec)
## Perform a five-fold cross-validation WITHOUT specified 'lambda.Beta' and 'lambda.Theta'.
## In this case, a grid of 'lambda.Beta' and 'lambda.Theta' values in a (hopefully) reasonable
## range will be computed and used by the program.
##
## < This simplest command should be a good start for most analyses. >
cvfit <- cv.missoNet(X = X.tr, Y = Y.tr, kfold = 5)
## Alternatively, compute the cross-validation folds in parallel on a cluster with 2 cores.
##
## 'fit.1se = TRUE' tells the program to make additional estimations of the parameters at the
## largest value of 'lambda.Beta' / 'lambda.Theta' that gives the most regularized model such
## that the cross-validated error is within one standard error of the minimum.
cl <- parallel::makeCluster(min(parallel::detectCores()-1, 2))
cvfit <- cv.missoNet(X = X.tr, Y = Y.tr, kfold = 5, fit.1se = TRUE,
parallel = TRUE, cl = cl,
permute = TRUE, with.seed = 486) # permute with seed for reproducibility
parallel::stopCluster(cl)
## Use PRE-STANDARDIZED training data if you wish to compare the results with other softwares.
X.tr.std <- scale(X.tr, center = TRUE, scale = TRUE)
Y.tr.std <- scale(Y.tr, center = TRUE, scale = TRUE)
cvfit.std <- cv.missoNet(X = X.tr.std, Y = Y.tr.std, kfold = 5,
standardize = FALSE, standardize.response = FALSE)
## Plot the (standardized) mean cross-validated errors in a heatmap.
plot(cvfit, type = "cv.heatmap")
## Plot the (standardized) mean cross-validated errors in a 3D scatterplot.
plot(cvfit, type = "cv.scatter", plt.surf = TRUE)
## Extract the estimates at "lambda.min".
Beta.hat1 <- cvfit$est.min$Beta
Theta.hat1 <- cvfit$est.min$Theta
## Extract the estimates at "lambda.1se.Beta" (if 'fit.1se' = TRUE).
Beta.hat2 <- cvfit$est.1se.B$Beta
Theta.hat2 <- cvfit$est.1se.B$Theta
## Extract the estimates at "lambda.1se.Theta" (if 'fit.1se' = TRUE).
Beta.hat3 <- cvfit$est.1se.Tht$Beta
Theta.hat3 <- cvfit$est.1se.Tht$Theta
## Make predictions of response values on the test set.
newy1 <- predict(cvfit, newx = sim.dat$X[tst, ], s = "lambda.min")
newy2 <- predict(cvfit, newx = sim.dat$X[tst, ], s = "lambda.1se.Beta") # 'fit.1se' = TRUE
newy3 <- predict(cvfit, newx = sim.dat$X[tst, ], s = "lambda.1se.Theta") # 'fit.1se' = TRUE