% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/nmfkc.R
\name{nmfkc.ecv}
\alias{nmfkc.ecv}
\title{Perform Element-wise Cross-Validation (Wold's CV)}
\usage{
nmfkc.ecv(Y, A = NULL, rank = 1:3, data, ...)
}
\arguments{
\item{Y}{Observation matrix, or a formula (see \code{\link{nmfkc}} for Formula Mode).}

\item{A}{Covariate matrix. Ignored when \code{Y} is a formula.}

\item{rank}{Vector of ranks to evaluate (e.g., 1:5). For backward compatibility,
\code{Q} is accepted via \code{...}.}

\item{data}{A data frame (required when \code{Y} is a formula with column names).}

\item{...}{Additional arguments passed to \code{\link{nmfkc}} (e.g., \code{method="EU"}).
Also accepts: \code{nfolds} (number of folds, default 5; \code{div} also accepted),
\code{seed} (integer seed, default 123).}
}
\value{
A list with components:
\item{objfunc}{Numeric vector containing the Mean Squared Error (MSE) for each Q.}
\item{sigma}{Numeric vector containing the Residual Standard Error (RMSE) for each Q. Only available if method="EU".}
\item{objfunc.fold}{List of length equal to Q vector. Each element contains the MSE values for the k folds.}
\item{folds}{A list of length \code{div}, containing the linear indices of held-out elements for each fold (shared across all Q).}
}
\description{
\code{nmfkc.ecv} performs k-fold cross-validation by randomly holding out
individual elements of the data matrix (element-wise), assigning them a
weight of 0 via \code{Y.weights}, and evaluating the reconstruction error on
those held-out elements.

This method (also known as Wold's CV) is theoretically robust for determining
the optimal rank (Q) in NMF. This function supports vector input for \code{Q},
allowing simultaneous evaluation of multiple ranks on the same folds.

When \code{Y.symmetric = "bi"} or \code{"tri"} is passed via \code{...},
fold creation uses only the upper triangle (including the diagonal) to
prevent information leakage through the symmetric entries \eqn{Y_{ij} = Y_{ji}}.
}
\examples{
# Element-wise CV to select rank
Y <- t(iris[1:30, 1:4])
res <- nmfkc.ecv(Y, rank = 1:2, nfolds = 3)
res$objfunc

}
\seealso{
\code{\link{nmfkc}}, \code{\link{nmfkc.cv}}
}
