Initializes factor/loadings pairs at values specified by init
. This
function has two primary uses: 1. One can initialize multiple
factor/loadings pairs at once using an SVD-like function and then optimize
them via function flash_backfit
. Sometimes this results in
a better fit than adding them one at a time via
flash_greedy
. 2. One can initialize factor/loadings pairs
and then fix the factor (or loadings) via function
flash_factors_fix
to incorporate "known" factors into a
flash
object. See below for examples of both use cases.
flash_factors_init(flash, init, ebnm_fn = ebnm_point_normal)
A flash
or flash_fit
object to which factors are
to be added.
An SVD-like object (specifically, a list containing fields
u
, d
, and v
), a flash
or flash_fit
object, or a list of matrices specifying the values at which factors
and loadings are to be initialized (for a data
matrix of size \(n \times p\), this should be a list of length two,
with the first element a matrix of size \(n \times k\) and the second
a matrix of size \(p \times k\)). If a flash fit is supplied, then it
will be used to initialize both the first and second moments of
posteriors on loadings and factors. Otherwise, the supplied values will
be used to initialize posterior means, with posterior second moments
initialized as the squared values of the first moments. Missing entries
are not allowed.
The function or functions used to solve the empirical Bayes
normal means (EBNM) subproblems. Most importantly, these functions specify
the families of distributions \(G_\ell^{(k)}\) and \(G_f^{(k)}\) to which the
priors on loadings and factors \(g_\ell^{(k)}\) and \(g_f^{(k)}\) are
assumed to belong. If the same function is to be used for both loadings
\(L\) and factors \(F\), then ebnm_fn
can be a single function.
If one function is to be used for loadings and a second for factors,
then ebnm_fn
should be a list of length two, with the first
element giving the function for loadings and the second the function
for factors. If different functions are to be used for different values of
\(k\), then factor/loadings pairs must be added successively using
multiple calls to either flash_greedy
or
flash_factors_init
.
Any EBNM function provided by package ebnm
can be
used as input. Non-default arguments to parameters can be supplied using
the helper function flash_ebnm
. Custom EBNM functions can
also be used: for details, see flash_ebnm
.
The flash
object from argument flash
, with
factors and loadings initialized as specified.
# Initialize several factors at once and backfit.
fl <- flash_init(gtex) |>
flash_factors_init(init = svd(gtex, nu = 5, nv = 5)) |>
flash_backfit()
#> Backfitting 5 factors (tolerance: 6.56e-04)...
#> Difference between iterations is within 1.0e+01...
#> Difference between iterations is within 1.0e+00...
#> Difference between iterations is within 1.0e-01...
#> Difference between iterations is within 1.0e-02...
#> Difference between iterations is within 1.0e-03...
#> Difference between iterations is within 1.0e-04...
#> Wrapping up...
#> Done.
# Add fixed loadings with \ell_i identically equal to one. This can be
# interpreted as giving a "mean" factor that accounts for different
# row-wise means.
ones <- matrix(1, nrow = nrow(gtex), ncol = 1)
# Initialize the factor at the least squares solution.
ls_soln <- t(solve(crossprod(ones), crossprod(ones, gtex)))
fl <- flash_init(gtex) |>
flash_factors_init(init = list(ones, ls_soln)) |>
flash_factors_fix(kset = 1, which_dim = "loadings") |>
flash_backfit() |>
flash_greedy(Kmax = 5L)
#> Backfitting 1 factors (tolerance: 6.56e-04)...
#> Wrapping up...
#> Done.
#> Adding factor 2 to flash object...
#> Adding factor 3 to flash object...
#> Adding factor 4 to flash object...
#> Adding factor 5 to flash object...
#> Adding factor 6 to flash object...
#> Wrapping up...
#> Done.