| Title: | Solving Mixed Model Equations in R |
|---|---|
| Description: | Structural multivariate-univariate linear mixed model solver for estimation of multiple random effects with unknown variance-covariance structures (e.g., unstructured, diagonal, autoregressive, factor analytic, reduced rank, among others) and known covariance among levels of random effects (e.g., pedigree and genomic relationship matrices) (Covarrubias-Pazaran, 2016 <doi:10.1371/journal.pone.0156744>; Maier et al., 2015 <doi:10.1016/j.ajhg.2014.12.006>; Jensen et al., 1997). REML estimates can be obtained using the Direct-Inversion Newton-Raphson and Direct-Inversion Average Information algorithms for the problems r x r (r being the number of records) or using the Henderson-based average information algorithm for the problem c x c (c being the number of coefficients to estimate). |
| Authors: | Giovanny Covarrubias-Pazaran [aut, cre] (ORCID: <https://orcid.org/0000-0002-7194-3837>) |
| Maintainer: | Giovanny Covarrubias-Pazaran <[email protected]> |
| License: | GPL-3 |
| Version: | 4.4.97 |
| Built: | 2026-10-17 17:32:03 UTC |
| Source: | https://github.com/covaruber/sommer |
Sommer is a structural univariate and multivariate linear mixed-model package for fitting models with multiple random effects and flexible covariance structures. Variance parameters are estimated by restricted maximum likelihood (REML). The package provides two complementary numerical formulations.
mmes uses Henderson's mixed model equations with an Average
Information REML algorithm. The mixed-model coefficient matrix is represented
as a sparse system and factorized with Eigen/Armadillo routines. Sparse LDLT
factorizations are reused throughout the REML calculations. Selected inverse
elements required for likelihood derivatives and prediction error variances can
be obtained with Takahashi sparse-inverse recursions, so a complete dense
coefficient-matrix inverse is not routinely formed.
mmer provides the marginal-covariance MNR formulation. Its REML
calculations are organized around the covariance matrix of the observations and
the corresponding REML projection matrix, with Newton-Raphson/Fisher-scoring
and Average Information updates for variance parameters.
Both formulations support multiple random effects and structured covariance
models. Through vsm, covariance structures can be composed from
an arbitrary number of covariance factors, including identity, diagonal,
unstructured, autoregressive, moving-average, Toeplitz, factor-analytic,
reduced-rank, antedependence, correlation and spatial structures, as well as
user-defined covariance functions.
The marginal formulation in mmer performs its principal REML
calculations in observation space, whereas mmes performs them through
the sparse mixed-model coefficient system. Their relative computational
performance therefore depends on the number of observations, the number of
mixed-model coefficients, sparsity, and the covariance structures in the
fitted model.
The numerical algorithms are coded primarily in C++ using Armadillo and Eigen. Sommer returns REML variance-covariance estimates, BLUEs, BLUPs, residuals, fitted values, information matrices and, when requested, prediction error variance information.
The package provides kernels to estimate additive (A.mat), dominance
(D.mat), epistatic (E.mat), single-step (H.mat)
relationship matrices for diploid and polyploid organisms. It also provides flexibility
to fit other genetic models such as full and half diallel models and random regression models.
A good converter from letter code to numeric format is implemented in the function
atcg1234, which supports higher ploidy levels than diploid.
Additional functions for genetic analysis have been included such as build a
genotypic hybrid marker matrix (build.HMM), plot of genetic maps
(map.plot), creation of manhattan plots (manhattan).
If you need to use pedigree you need to convert your pedigree into a relationship
matrix (use the 'getA' function from the pedigreemm package).
The vpredict function can be used to estimate standard errors for linear combinations of variance components (e.g. ratios like h2). The r2 function calculates reliability. S3 methods are available for some parameter extraction such as:
Recently, spatial modeling has been added added to sommer using the two-dimensional
spline (spl2Dc).
The sommer package is updated on CRAN every 4-months due to CRAN policies but you can find the latest source at https://github.com/covaruber/sommer. This can be easily installed typing the following in the R console:
library(devtools)
install_github("covaruber/sommer")
This is recommended if you reported a bug, was fixed and was immediately pushed to GitHub but not in CRAN until the next update.
For tutorials on how to perform different analysis with sommer please look at the vignettes by typing in the terminal:
vignette("sommer.qg")
vignette("sommer.gxe")
vignette("sommer.vs.lme4")
vignette("sommer.spatial")
The package has been equiped with several datasets to learn how to use the sommer package (and almost to learn all sort of quantitative genetic analysis):
* DT_halfdiallel, DT_fulldiallel and DT_mohring datasets have examples to fit half and full diallel designs.
* DT_h2 to calculate heritability
* DT_cornhybrids and DT_technow datasets to perform genomic prediction in hybrid single crosses
* DT_wheat dataset to do genomic prediction in single crosses in species displaying only additive effects.
* DT_cpdata dataset to fit genomic prediction models within a biparental population coming from 2 highly heterozygous parents including additive, dominance and epistatic effects.
* DT_polyploid to fit genomic prediction and GWAS analysis in polyploids.
* DT_gryphon data contains an example of an animal model including pedigree information.
* DT_btdata dataset contains an animal (birds) model.
* DT_legendre simulated dataset for random regression model.
* DT_sleepstudy dataset to know how to translate lme4 models to sommer models.
Since version 4.4.1, I have unified the use of the two different solving algorithms
into the mmes function by just using the new argument henderson which by default
is set to FALSE. Other than that the rest is the same with the addition that now
the identity terms needs to be encapsulated in the ism function. In
addition, now the multi-trait models need to be fitted in the long format. This are
few but major changes to the way sommer models are fitted.
Since version 4.1.7 I have introduced the mmes-based average information function 'mmec' which is much faster when dealing with the r > c problem (more records than coefficients to estimate). This introduces its own covariance structure functons such as vsc(), usc(), dsc(), atc(), csc(). Please give it a try, although is in early phase of development.
Since version 3.7 I have completly redefined the specification of the variance-covariance structures to provide more flexibility to the user. This has particularly helped the residual covariance structures and the easier combination of custom random effects and overlay models. I think that although this will bring some uncomfortable situations at the beggining, in the long term this will help users to fit better models. In esence, I have abandoned the asreml formulation (not the structures available) given it's limitations to combine some of the sommer structures but all covariance structures can now be fitted using the 'vsm' functions.
Since version 3.0 I have decided to focus in developing the multivariate solver and for doing this I have decided to remove the M argument (for GWAS analysis) from the mmes function and move it to it's own function GWAS.
Before the mmes solver had implemented the usm(trait), diag(trait), at(trait) asreml formulation for multivariate models that allow to specify the structure of the trait in multivariate models. Therefore the MVM argument was no longer needed. After version 3.7 now the multi-trait structures can be specified in the Gt and Gtc arguments of the vsm function.
The Average Information algorithm had been removed in the past from the package because of its instability to deal with very complex models without good initial values. Now after 3.7 I have brought it back after I noticed that starting with NR the first three iterations gives enough flexibility to the AI algorithm.
Keep in mind that sommer uses direct inversion (DI) algorithm which can be very slow for datasets with many observations (big 'n'). The package is focused in problems of the type p > n (more random effect(s) levels than observations) and models with dense covariance structures. For example, for experiment with dense covariance structures with low-replication (i.e. 2000 records from 1000 individuals replicated twice with a covariance structure of 1000x1000) sommer will be faster than MME-based software. Also for genomic problems with large number of random effect levels, i.e. 300 individuals (n) with 100,000 genetic markers (p). On the other hand, for highly replicated trials with small covariance structures or n > p (i.e. 2000 records from 200 individuals replicated 10 times with covariance structure of 200x200) asreml or other MME-based algorithms will be much faster and I recommend you to use that software.
General linear mixed model
Both numerical engines fit the Gaussian linear mixed-model family
with
and therefore
For several independent random terms this becomes
Here is the response vector, and are design matrices,
contains fixed effects, contains random effects, and
contains residual effects. The same representation covers univariate
and multivariate models after the corresponding responses, design matrices and
covariance structures are assembled.
Covariance models specified through vsm use a product-level
variance scale and an arbitrary number of covariance-shaping factors:
For a random effect with known relationship covariance ,
The CovarianceFactor interface separates evaluation of each , its
derivatives, parameter reporting and trust limits from the REML solver. New
covariance structures can therefore be added without changing the core
mmes optimization algorithm.
Marginal MNR formulation in mmer
The MNR engine used by mmer organizes the REML calculations
around the marginal covariance . Define the REML projection matrix
Apart from constants independent of the variance parameters, the Gaussian REML log-likelihood is
For variance parameter , let
For covariance models linear in the fitted variance parameters, the REML score has the standard form
The MNR C++ implementation forms the projected covariance derivatives
. Its Average Information matrix is
while its Newton-Raphson/Fisher-scoring path uses trace products of the projected covariance derivatives. The resulting information system determines the variance-parameter search direction, and the implementation can blend the information calculation with an EM-type diagonal stabilization during early iterations.
This formulation is referred to as marginal because its principal
covariance calculations are carried out in observation space through
and . This describes the numerical formulation more accurately than
naming it after a particular matrix operation.
Sparse Henderson Average Information formulation in mmes
The mmes engine uses Henderson's mixed model equations. With
, the coefficient system is
and the right-hand side is
The BLUE and BLUP solutions satisfy
The current C++ implementation stores sparsely and uses an Eigen
SimplicialLDLT factorization. Symbolic factorization information is
reused when the sparsity pattern remains unchanged. Random-effect precision
contributions are inserted blockwise. Structured residual covariance models
use optimized diagonal or repeated-block/Kronecker paths when applicable and a
generic sparse residual-factorization path otherwise.
The REML criterion is evaluated from determinant contributions for the random
covariance structures, residual covariance and mixed-model coefficient matrix,
together with the quadratic term . This is a
mixed-model-equation representation of the same REML objective optimized by
the marginal formulation.
For covariance parameter , the generic covariance engine supplies
For
a parameter belonging to factor has derivative
For the working scale ,
The score trace terms use selected elements associated with the sparse
coefficient system. These are obtained from the LDLT factors with Takahashi
sparse-inverse recursions; a complete is not required during REML
iterations.
Average Information is calculated by analytically differentiating the factorized mixed-model equations. Differentiating
with respect to gives
where
The sensitivity systems therefore reuse the same sparse factorization of
. For covariance with precision
and derivative
,
This factor-differentiation formulation avoids constructing an observation-space working variate for every random covariance parameter. Residual/residual and random/residual Average Information terms use the corresponding mixed-model/Schur-complement identities.
Covariance constructors may provide analytic derivatives in C++ or R. If a
constructor uses numerical differentiation, only its small covariance factor
is differentiated by central finite differences; the REML
likelihood and downstream score and Average Information calculations are not
numerically differentiated.
Sparse inverse subsets and prediction error variances
During optimization, mmes does not routinely materialize the complete
. Takahashi recursions provide the selected inverse subset required
for REML trace calculations. After convergence, computeCi=1 obtains the
diagonal information needed for prediction error variances through the sparse
inverse subset, whereas computeCi=2 requests the complete
coefficient-matrix inverse.
Parameter updates and numerical safeguards
Covariance parameters are optimized in working coordinates chosen to respect their parameter spaces, such as logarithms for positive scales and hyperbolic-tangent or bounded-logit mappings for correlations. Each CovarianceFactor descriptor supplies its natural-scale reporting transformation and parameter-specific trust limit.
The information system determines a proposed REML update. In the current
mmes implementation, the proposal is limited in working-coordinate
space and then checked against the exact REML likelihood. If the proposed
global step decreases the accepted likelihood beyond numerical tolerance, the
step is geometrically reduced and reevaluated. A likelihood decrease is
therefore not interpreted as convergence. Boundary handling and robust
information solves are retained for difficult or weakly identified variance
components.
Choosing between the two formulations
Both engines estimate the same class of linear mixed models but organize the
numerical work differently. mmer uses the marginal covariance
representation and is attractive when observation-space calculations are
moderate in size. mmes uses the sparse Henderson coefficient system and
is particularly attractive when the mixed-model equations are sparse and
their factorization can be reused efficiently. The best choice depends on the
dimensions, sparsity and covariance structures of the fitted model rather than
on a universal rule based only on the number of records or coefficients.
See mmes, mmer, and vsm for the
interfaces and available covariance structures.
If you have any questions or suggestions please post it in https://stackoverflow.com or https://stats.stackexchange.com
I'll be glad to help or answer any question. I have spent a valuable amount of time developing this package. Please cite this package in your publication. Type 'citation("sommer")' to know how to cite it.
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G. 2016. Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
Covarrubias-Pazaran G. 2018. Software update: Moving the R package sommer to multivariate mixed models for genome-assisted prediction. doi: https://doi.org/10.1101/354639
Sanderson, C., & Curtin, R. (2025). Armadillo: An Efficient Framework for Numerical Linear Algebra. arXiv preprint arXiv:2502.03000.
Bernardo Rex. 2010. Breeding for quantitative traits in plants. Second edition. Stemma Press. 390 pp.
Gilmour et al. 1995. Average Information REML: An efficient algorithm for variance parameter estimation in linear mixed models. Biometrics 51(4):1440-1450.
Henderson C.R. 1975. Best Linear Unbiased Estimation and Prediction under a Selection Model. Biometrics vol. 31(2):423-447.
Kang et al. 2008. Efficient control of population structure in model organism association mapping. Genetics 178:1709-1723.
Lee et al. 2015. MTG2: An efficient algorithm for multivariate linear mixed model analysis based on genomic information. Cold Spring Harbor. doi: http://dx.doi.org/10.1101/027201.
Maier et al. 2015. Joint analysis of psychiatric disorders increases accuracy of risk prediction for schizophrenia, bipolar disorder, and major depressive disorder. Am J Hum Genet; 96(2):283-294.
Searle. 1993. Applying the EM algorithm to calculating ML and REML estimates of variance components. Paper invited for the 1993 American Statistical Association Meeting, San Francisco.
Yu et al. 2006. A unified mixed-model method for association mapping that accounts for multiple levels of relatedness. Genetics 38:203-208.
Tunnicliffe W. 1989. On the use of marginal likelihood in time series model estimation. JRSS 51(1):15-27.
####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples ####=========================================#### ####=========================================#### #### EXAMPLES #### Different models with sommer ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example DT=DT[with(DT, order(Env)), ] head(DT) ####=========================================#### #### Univariate homogeneous variance models #### ####=========================================#### ## Compound simmetry (CS) model ans1 <- mmes(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT) summary(ans1) ####===========================================#### #### Univariate heterogeneous variance models #### ####===========================================#### ## Compound simmetry (CS) + Diagonal (DIAG) model ans3 <- mmes(Yield~Env, random= ~Name + vsm(dsm(Env),ism(Name)), rcov= ~ vsm(dsm(Env),ism(units)), data=DT) summary(ans3)####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples ####=========================================#### ####=========================================#### #### EXAMPLES #### Different models with sommer ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example DT=DT[with(DT, order(Env)), ] head(DT) ####=========================================#### #### Univariate homogeneous variance models #### ####=========================================#### ## Compound simmetry (CS) model ans1 <- mmes(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT) summary(ans1) ####===========================================#### #### Univariate heterogeneous variance models #### ####===========================================#### ## Compound simmetry (CS) + Diagonal (DIAG) model ans3 <- mmes(Yield~Env, random= ~Name + vsm(dsm(Env),ism(Name)), rcov= ~ vsm(dsm(Env),ism(units)), data=DT) summary(ans3)
Calculates the realized additive relationship matrix. Currently is the C++ implementation of van Raden (2008).
A.mat(X,min.MAF=0,return.imputed=FALSE)A.mat(X,min.MAF=0,return.imputed=FALSE)
X |
Matrix ( |
min.MAF |
Minimum minor allele frequency. The A matrix is not sensitive to rare alleles, so by default only monomorphic markers are removed. |
return.imputed |
When TRUE, the imputed marker matrix is returned. |
For vanraden method: the marker matrix is centered by subtracting column means where ms is the coumn means. Then , where , the mean value of the diagonal values of the portion.
If return.imputed = FALSE, the additive relationship matrix is returned.
If return.imputed = TRUE, the function returns a list containing
the A matrix
the imputed marker matrix
Endelman, J.B., and J.-L. Jannink. 2012. Shrinkage estimation of the realized relationship matrix. G3:Genes, Genomes, Genetics. 2:1405-1413. doi: 10.1534/g3.112.004259
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
####=========================================#### #### random population of 200 lines with 1000 markers ####=========================================#### X <- matrix(rep(0,200*1000),200,1000) for (i in 1:200) { X[i,] <- ifelse(runif(1000)<0.5,-1,1) } A <- A.mat(X) ####=========================================#### #### take a look at the Genomic relationship matrix #### (just a small part) ####=========================================#### # colfunc <- colorRampPalette(c("steelblue4","springgreen","yellow")) # hv <- heatmap(A[1:15,1:15], col = colfunc(100),Colv = "Rowv") # str(hv)####=========================================#### #### random population of 200 lines with 1000 markers ####=========================================#### X <- matrix(rep(0,200*1000),200,1000) for (i in 1:200) { X[i,] <- ifelse(runif(1000)<0.5,-1,1) } A <- A.mat(X) ####=========================================#### #### take a look at the Genomic relationship matrix #### (just a small part) ####=========================================#### # colfunc <- colorRampPalette(c("steelblue4","springgreen","yellow")) # hv <- heatmap(A[1:15,1:15], col = colfunc(100),Colv = "Rowv") # str(hv)
Identifies problem configurations (factors, levels, dimensions) where experimental solver paths provide speedups over baseline methods, fitting empirical crossover conditions.
analyze_mme_crossovers( benchmark, baseline_engine = NULL, candidate_engine = NULL )analyze_mme_crossovers( benchmark, baseline_engine = NULL, candidate_engine = NULL )
benchmark |
An object of class |
baseline_engine |
Name of the reference baseline engine. Default is the first engine tested. |
candidate_engine |
Name of the experimental engine to evaluate. |
An object of class "sommer_mme_crossover".
anova method for class "mmes".
## S3 method for class 'mmes' anova(object, object2=NULL, ...)## S3 method for class 'mmes' anova(object, object2=NULL, ...)
object |
an object of class |
object2 |
an object of class |
... |
Further arguments passed to |
vector of anova
Giovanny Covarrubias
Antedependence covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
antem(x, order = 1L, beta = NULL, innovations = NULL, fixed = NULL)antem(x, order = 1L, beta = NULL, innovations = NULL, fixed = NULL)
x |
Ordered variable defining q covariance levels. |
order |
Antedependence order, 1 <= order < q. |
beta |
Optional starting regression coefficients for allowed subdiagonals. |
innovations |
Optional q positive innovation variances. |
fixed |
Logical vector controlling all beta coefficients and q-1 innovation-variance ratios. |
The modified-Cholesky representation is
The matrix is unit lower triangular, with nonzero regression coefficients only within the requested number of preceding levels. The first innovation variance is the scale reference; the remaining innovation variances are positive ratios.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(antem(time, order=2), ism(id)) ## End(Not run)## Not run: vsm(antem(time, order=2), ism(id)) ## End(Not run)
Constructs the Algorithm for Proven and Young (APY) approximation for a
positive-definite relationship matrix and a user-specified core set. In the
genomic evaluation literature, the input is the genomic relationship matrix
for genotyped animals, usually calculated from SNP marker data. The
core and non-core partition is within that genotyped set; it is not a
pedigree-versus-genomic partition. The non-core conditional covariance is
approximated by its diagonal. The returned matrix is a sparse precision matrix
suitable for the Gu argument of mmes() in a genomic BLUP model.
APY(G, core, tol = 1e-10, return.details = FALSE)APY(G, core, tol = 1e-10, return.details = FALSE)
G |
A finite, symmetric, positive-definite numeric relationship matrix.
For the standard APY genetic evaluation use, this is the genomic relationship
matrix among genotyped animals, commonly obtained from marker genotypes with
|
core |
Unique one-based row indices or row names selecting the core individuals. |
tol |
Positive tolerance below one, used for symmetry validation and the minimum acceptable conditional variance relative to the relationship scale. Small or non-positive conditional variances cause an error; they are not silently regularized. |
return.details |
If |
Partition into core and non-core blocks. With
and
, APY uses the precision
. It preserves the core block and core-to-non-core
relationships while replacing non-core conditional correlations with zero.
Thus APY is exact when the non-core conditional covariance is diagonal;
otherwise it is an approximation to the supplied relationship model.
APY was developed to provide a computationally economical approximation to the inverse genomic relationship matrix for large genomic evaluations (Misztal, 2016; Fragomeni et al., 2015). The algorithm partitions genotyped animals into core and non-core individuals. The core contains the relationships that are modeled jointly; each non-core animal is regressed on the core, with its remaining conditional variance treated as independent of other non-core animals. Thus non-core animals are not independent of the core: their core-to-non-core relationships are retained.
Pedigree relationships are a distinct input. For pedigree-only models, the
pedigree relationship matrix and its sparse inverse are
normally used directly; APY is not required. In single-step genomic BLUP,
pedigree and genomic information are combined, conventionally through
,
where genotyped animals are ordered last and is their pedigree
relationship block. APY approximates the genomic term in that
correction; it does not replace the pedigree term or construct .
This function returns only the APY genomic precision. Do not use it as the
complete single-step precision for a population that also contains
non-genotyped animals.
This function constructs APY from an already available relationship matrix. It does not avoid the cost of constructing a full dense relationship matrix from markers, and it does not change the solver algorithm. Marker-based block construction and single-step matrix assembly are not implemented here.
A sparse symmetric APY precision matrix with individual dimnames and
attr(x, "inverse") = TRUE, ready for Gu. Metadata describing
the core and conditional variances is stored in attr(x, "APY"). If
return.details = TRUE, returns the diagnostic list described above.
Misztal I (2016). Inexpensive Computation of the Inverse of the Genomic Relationship Matrix in Populations with Small Effective Population Size. Genetics, 202(2), 401–409. doi:10.1534/genetics.115.182089.
Fragomeni BO, Lourenco DA, Tsuruta S, Masuda Y, Aguilar I, Legarra A, Lawlor TJ, Misztal I (2015). Use of genomic recursions and algorithm for proven and young animals for single-step genomic BLUP analyses–a simulation study. Journal of Animal Breeding and Genetics, 132(5), 340–345. doi:10.1111/jbg.12161.
## Marker-derived GBLUP for genotyped animals. set.seed(2) ids <- paste0("animal", seq_len(12)) markers <- matrix(sample(c(-1, 0, 1), 12 * 80, replace = TRUE), nrow = 12, dimnames = list(ids, NULL)) G <- A.mat(markers) ## Blend slightly with the identity so this small illustrative G is positive ## definite, then construct APY precision for a six-animal core. G <- 0.95 * G + 0.05 * diag(nrow(G)) dimnames(G) <- list(ids, ids) Ginv.apy <- APY(G, core = ids[seq_len(6)]) phenotypes <- data.frame( id = factor(rep(ids, each = 3), levels = ids), y = rnorm(length(ids) * 3) ) fit <- mmes(y ~ 1, random = ~vsm(ism(id), Gu = Ginv.apy), rcov = ~units, data = phenotypes, verbose = FALSE) ## In a single-step evaluation, this APY approximation supplies G^{-1} for ## the genotyped block correction; it is not itself the complete H^{-1}.## Marker-derived GBLUP for genotyped animals. set.seed(2) ids <- paste0("animal", seq_len(12)) markers <- matrix(sample(c(-1, 0, 1), 12 * 80, replace = TRUE), nrow = 12, dimnames = list(ids, NULL)) G <- A.mat(markers) ## Blend slightly with the identity so this small illustrative G is positive ## definite, then construct APY precision for a six-animal core. G <- 0.95 * G + 0.05 * diag(nrow(G)) dimnames(G) <- list(ids, ids) Ginv.apy <- APY(G, core = ids[seq_len(6)]) phenotypes <- data.frame( id = factor(rep(ids, each = 3), levels = ids), y = rnorm(length(ids) * 3) ) fit <- mmes(y ~ 1, random = ~vsm(ism(id), Gu = Ginv.apy), rcov = ~units, data = phenotypes, verbose = FALSE) ## In a single-step evaluation, this APY approximation supplies G^{-1} for ## the genotyped block correction; it is not itself the complete H^{-1}.
First-order autoregressive covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
ar1m(x, rho = 0.30, fixed = FALSE, variance = c("homogeneous", "heterogeneous"), values = NULL)ar1m(x, rho = 0.30, fixed = FALSE, variance = c("homogeneous", "heterogeneous"), values = NULL)
x |
Ordered factor or design defining q ordered covariance levels. |
rho |
Starting AR(1) correlation in (-1,1). |
fixed |
For homogeneous variance, a logical indicating whether rho is fixed. For heterogeneous variance, a logical vector of length q: rho followed by q-1 variance-ratio parameters. |
variance |
Whether the AR correlation has homogeneous or heterogeneous marginal variances. |
values |
Optional q positive starting variances when |
The homogeneous AR(1) shape is
Heterogeneous mode uses
with the first variance fixed as the relative-scale reference. The working correlation coordinate is , ensuring .
Factor levels define the lag order, so numeric-looking levels must be in increasing numeric order; ar1m() warns otherwise. Inside vsm() one correlation is shared by every level of the other Kronecker factors. For a separate correlation per trial, wrap the vsm() term in dsumm.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
ar2m, ar3m, toeplitzm, vsm,
dsumm.
## Not run: vsm(ar1m(time), ism(id)) # Separable row-by-range residual shared across trials: # rcov = ~ vsm(dsm(trial), ar1m(range), ar1m(row), ism(units)) # Trial-specific correlations and variances: # rcov = ~ dsumm(vsm(ar1m(range), ar1m(row), ism(units)), by=trial) ## End(Not run)## Not run: vsm(ar1m(time), ism(id)) # Separable row-by-range residual shared across trials: # rcov = ~ vsm(dsm(trial), ar1m(range), ar1m(row), ism(units)) # Trial-specific correlations and variances: # rcov = ~ dsumm(vsm(ar1m(range), ar1m(row), ism(units)), by=trial) ## End(Not run)
Second-order autoregressive covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
ar2m(x, pacf = c(0.20, 0.10), fixed = NULL, variance = c("homogeneous", "heterogeneous"), values = NULL)ar2m(x, pacf = c(0.20, 0.10), fixed = NULL, variance = c("homogeneous", "heterogeneous"), values = NULL)
x |
Ordered factor defining covariance levels. |
pacf |
Length-two vector of starting partial autocorrelations, each strictly between -1 and 1. |
fixed |
For homogeneous variance, a logical vector of length two. For heterogeneous variance, a logical vector of length q+1: two PACFs followed by q-1 variance-ratio parameters. |
variance |
Whether the AR correlation has homogeneous or heterogeneous marginal variances. |
values |
Optional q positive starting variances when |
A stationary AR(2) covariance is parameterized through reflection coefficients / partial autocorrelations. Each PACF is mapped from an unconstrained working coordinate by tanh, then converted to stable AR coefficients by the Levinson/Durbin recursion. Heterogeneous mode uses
and estimates q-1 positive variance ratios in addition to the PACFs.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(ar2m(time), ism(id)) ## End(Not run)## Not run: vsm(ar2m(time), ism(id)) ## End(Not run)
Third-order autoregressive covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
ar3m(x, pacf = c(0.20, 0.10, 0.05), fixed = NULL, variance = c("homogeneous", "heterogeneous"), values = NULL)ar3m(x, pacf = c(0.20, 0.10, 0.05), fixed = NULL, variance = c("homogeneous", "heterogeneous"), values = NULL)
x |
Ordered factor defining covariance levels. |
pacf |
Length-three vector of starting partial autocorrelations, each strictly between -1 and 1. |
fixed |
For homogeneous variance, a logical vector of length three. For heterogeneous variance, a logical vector of length q+2: three PACFs followed by q-1 variance-ratio parameters. |
variance |
Whether the AR correlation has homogeneous or heterogeneous marginal variances. |
values |
Optional q positive starting variances when |
A stationary AR(3) covariance is parameterized through three partial autocorrelations. The PACF parameterization guarantees stationarity while allowing unconstrained working coordinates. Heterogeneous mode uses
and estimates q-1 positive variance ratios in addition to the PACFs.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(ar3m(time), ism(id)) ## End(Not run)## Not run: vsm(ar3m(time), ism(id)) ## End(Not run)
Selected-level diagonal covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
atm(x, levs, values = NULL, fixed = NULL)atm(x, levs, values = NULL, fixed = NULL)
x |
Variable defining all available levels. |
levs |
Character names or numeric positions of the levels retained in this covariance factor. |
values |
Optional positive starting variances for the selected levels. |
fixed |
Logical vector of length length(levs)-1 controlling the selected variance ratios. |
atm is a selected-level version of dsm. The design is restricted to levs; observations outside those levels receive zeros for this factor. The first selected level is the scale reference and the remaining selected levels are positive variance ratios. This representation is most naturally used for random effects; residual factors must still assign exactly one covariance-product coordinate to every observation.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(atm(environment, c("E1","E3")), ism(genotype)) ## End(Not run)## Not run: vsm(atm(environment, c("E1","E3")), ism(genotype)) ## End(Not run)
mmer and vsr
Creates a diagonal covariance-component selector for specified columns or levels of a covariance dimension. It is intended for the mmer covariance-model interface, typically inside vsr.
atr(x, levs)atr(x, levs)
x |
A factor, character vector, numeric vector, or design/incidence matrix defining the covariance dimension. Factor and character inputs are expanded to incidence columns. A matrix is used directly. |
levs |
Character vector identifying the columns or levels whose diagonal entries are selected. If omitted, all available column names are selected. |
atr() constructs a design matrix together with a diagonal thetaC selector. Let be the number of columns of , and define
The returned constraint matrix is
Thus atr() is useful when a covariance component is to be associated only with a specified subset of levels or design columns. Levels not selected in levs receive zero on the corresponding diagonal of thetaC.
This function belongs to the mmer/vsr covariance-structure interface. The related atm function belongs to the newer mmes/vsm CovarianceFactor interface and uses a different parameterization.
For a matrix input, its column names define the available levels. For factor or character input, the incidence-matrix column names define the levels. If levs is missing, all available columns are selected.
A list with components:
Z: the design/incidence representation of x.
thetaC: a diagonal zero/one matrix selecting the levels specified by levs.
# Select levels B and C A <- atr(factor(c("A","B","A","C")), levs = c("B","C")) A$Z A$thetaC# Select levels B and C A <- atr(factor(c("A","B","A","C")), levs = c("B","C")) A$Z A$thetaC
Builds a single proportion response for binomial mmes fits from
counts of successes and failures (or trials). The number of trials travels with
the proportion as an attribute and is used as the binomial prior weight, so the
single-response interface of mmes is preserved.
binm(successes, failures = NULL, trials = NULL)binm(successes, failures = NULL, trials = NULL)
successes |
Numeric vector of successes. |
failures |
Numeric vector of failures. Provide either |
trials |
Numeric vector with the number of trials. |
The result is successes/trials with class "binm" and attribute
"trials". Subsetting keeps the trials aligned, so the vector can be stored
as a data-frame column. Missing counts give a missing response, handled by the
naMethodY rules of mmes. Fitting a proportion without binm
treats every value as one trial, which is wrong unless all trials equal one.
A numeric vector of proportions of class "binm".
set.seed(1) d <- data.frame(x = rnorm(60), g = factor(rep(1:12, each = 5))) d$n <- sample(5:10, 60, TRUE) d$s <- rbinom(60, d$n, plogis(0.3 * d$x)) fit <- mmes(binm(s, trials = n) ~ x, random = ~ g, data = d, family = binomial(), blendWeight = 0, verbose = FALSE) fit$bset.seed(1) d <- data.frame(x = rnorm(60), g = factor(rep(1:12, each = 5))) d$n <- sample(5:10, 60, TRUE) d$s <- rbinom(60, d$n, plogis(0.3 * d$x)) fit <- mmes(binm(s, trials = n) ~ x, random = ~ g, data = d, family = binomial(), blendWeight = 0, verbose = FALSE) fit$b
Proper conditional autoregressive spatial covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
car(x, W, rho = 0.10, fixed = FALSE)car(x, W, rho = 0.10, fixed = FALSE)
x |
Factor or design defining q spatial levels. |
W |
Symmetric nonnegative adjacency/weights matrix with zero diagonal, aligned to the levels of x. |
rho |
Starting proper-CAR dependence parameter. |
fixed |
Logical indicating whether rho is fixed. |
Let . The proper CAR precision and covariance are
The constructor requires positive row sums, so isolated levels are not allowed. The admissible open interval for rho is obtained from the eigenvalues of and is enforced through a bounded-logit working coordinate. This is a proper, nonsingular CAR model; an intrinsic singular CAR is not used by the current precision-based Henderson implementation. The covariance derivative is analytic.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(car(location, W), ism(genotype)) ## End(Not run)## Not run: vsm(car(location, W), ism(genotype)) ## End(Not run)
coef method for class "mmes".
## S3 method for class 'mmes' coef(object, ...)## S3 method for class 'mmes' coef(object, ...)
object |
an object of class |
... |
Further arguments to be passed |
vector of coef
Giovanny Covarrubias
General positive-definite correlation structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
corgm(x, theta = NULL, fixed = NULL, variance = c("homogeneous", "heterogeneous"), values = NULL)corgm(x, theta = NULL, fixed = NULL, variance = c("homogeneous", "heterogeneous"), values = NULL)
x |
Variable defining q covariance levels. |
theta |
Optional positive-definite q by q starting covariance or correlation matrix.
With |
fixed |
Logical vector flagging parameters held at their starting value: length q(q-1)/2 (correlations) for the homogeneous mode and q(q-1)/2 + q-1 (correlations, then variance ratios of levels 2..q) for the heterogeneous mode. |
variance |
|
values |
Optional positive starting variances (length q) for the
heterogeneous mode. Only their ratios to the first level matter; the first
level's variance is the |
An unrestricted SPD correlation matrix is represented using a unit-diagonal lower factor . The intermediate matrix is standardized to correlation scale,
The unrestricted working parameters are the strict lower-triangular entries of .
With variance="heterogeneous" the shape is with
, where
are variance ratios relative to
the first level; the vsm scale is . The model is the
same as usm but parameterized as correlations and variances,
which allows individual variances to be fixed. This is what mixed-family
multi-trait models (familym) need: the residual variance of a
binomial or Poisson trait is fixed to one while the correlations and the
variances of Gaussian traits are estimated. Reported parameters
(covparams_mmes) are the correlations and the variances of each
level.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
csm, usm, vsm,
covmatrix_mmes, familym.
data(DT_example, package = "enhancer") DT <- DT_example # genetic correlations between environments with a homogeneous variance m1 <- mmes(Yield ~ Env, random = ~ vsm(corgm(Env), ism(Name)), rcov = ~ units, data = DT, verbose = FALSE) covparams_mmes(m1, 1) # heterogeneous variances (equivalent to usm, parameterized as corr/var) m2 <- mmes(Yield ~ Env, random = ~ vsm(corgm(Env, variance = "heterogeneous"), ism(Name)), rcov = ~ units, data = DT, verbose = FALSE) covparams_mmes(m2, 1) covmatrix_mmes(m2, 1)$correlationdata(DT_example, package = "enhancer") DT <- DT_example # genetic correlations between environments with a homogeneous variance m1 <- mmes(Yield ~ Env, random = ~ vsm(corgm(Env), ism(Name)), rcov = ~ units, data = DT, verbose = FALSE) covparams_mmes(m1, 1) # heterogeneous variances (equivalent to usm, parameterized as corr/var) m2 <- mmes(Yield ~ Env, random = ~ vsm(corgm(Env, variance = "heterogeneous"), ism(Name)), rcov = ~ units, data = DT, verbose = FALSE) covparams_mmes(m2, 1) covmatrix_mmes(m2, 1)$correlation
corImputation imputes missing data based on the correlation that exists between row levels.
corImputation(wide, Gu=NULL, nearest=10, roundR=FALSE)corImputation(wide, Gu=NULL, nearest=10, roundR=FALSE)
wide |
numeric matrix with individuals in rows and time variable in columns (e.g., environments, genetic markers, etc.). |
Gu |
optional correlation matrix between the individuals or row levels. If NULL it will be computed as the correlation of t(wide). |
nearest |
integer value describing how many nearest neighbours (the ones showing the highest correlation) should be used to average and return the imputed value. |
roundR |
a TRUE/FALSE statement describing if the average result should be rounded or not. This may be specifically useful for categorical data in the form of numbers (e.g., -1,0,1). |
a list with the imputed matrix and the original matrix.
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
#################################### ### imputing genotype data example #################################### # data(DT_cpdata, package="enhancer") # X <- GT_cpdata # # add missing data # v <- sample(1:length(X), 500) # Xna <- X # Xna[v]<- NA # ## impute (can take some time) # Y <- corImputation(wide=Xna, Gu=NULL, nearest=20, roundR=TRUE) # cm <- table(Y$imputed[v],X[v]) # ## calculate accuracy # sum(diag(cm))/length(v) #################################### ### imputing phenotypic data example #################################### # data(DT_h2, package="enhancer") # X <- reshape(DT_h2[,c("Name","Env","y")], direction = "wide", idvar = "Name", # timevar = "Env", v.names = "y", sep= "_") # rownames(X) <- X$Name # X <- as.matrix(X[,-1]) # head(X) # # add missing data # v <- sample(1:length(X), 50) # Xna <- X # Xna[v]<- NA # ## impute # Y <- corImputation(wide=Xna, Gu=NULL, nearest=20, roundR=TRUE) # plot(y=Y$imputed[v],x=X[v], xlab="true",ylab="predicted") # cor(Y$imputed[v],X[v], use = "complete.obs")#################################### ### imputing genotype data example #################################### # data(DT_cpdata, package="enhancer") # X <- GT_cpdata # # add missing data # v <- sample(1:length(X), 500) # Xna <- X # Xna[v]<- NA # ## impute (can take some time) # Y <- corImputation(wide=Xna, Gu=NULL, nearest=20, roundR=TRUE) # cm <- table(Y$imputed[v],X[v]) # ## calculate accuracy # sum(diag(cm))/length(v) #################################### ### imputing phenotypic data example #################################### # data(DT_h2, package="enhancer") # X <- reshape(DT_h2[,c("Name","Env","y")], direction = "wide", idvar = "Name", # timevar = "Env", v.names = "y", sep= "_") # rownames(X) <- X$Name # X <- as.matrix(X[,-1]) # head(X) # # add missing data # v <- sample(1:length(X), 50) # Xna <- X # Xna[v]<- NA # ## impute # Y <- corImputation(wide=Xna, Gu=NULL, nearest=20, roundR=TRUE) # plot(y=Y$imputed[v],x=X[v], xlab="true",ylab="predicted") # cor(Y$imputed[v],X[v], use = "complete.obs")
covm combines two random-effect structures created with
vsm into a single correlated random-effect structure.
It fits an unstructured covariance matrix between the
two random effects while allowing them to have different incidence
matrices. The two effects must act on the same coefficient space and
use the same relationship or precision matrix. The resulting structure
can be fitted with the mmes solver.
covm(ran1, ran2, thetaC = NULL, theta = NULL, fixed = NULL, fixedSigma2 = FALSE, labels = c("ran1", "ran2"), tol = 1e-10)covm(ran1, ran2, thetaC = NULL, theta = NULL, fixed = NULL, fixedSigma2 = FALSE, labels = c("ran1", "ran2"), tol = 1e-10)
ran1 |
A random-effect structure returned by |
ran2 |
A random-effect structure returned by |
thetaC |
Deprecated and not supported by the current CovarianceFactor
parameterization. The former cell-wise constraint matrix cannot in
general be translated exactly into the normalized-Cholesky
parameterization used by |
theta |
An optional symmetric “' The diagonal elements define the initial variances of the two random effects and the off-diagonal element defines their initial covariance. If ``` diag(2) * 0.15 + matrix(0.015, 2, 2) “' giving initial variances of 0.165 and an initial covariance of 0.015. “' |
fixed |
An optional logical vector of length two indicating whether the two
normalized-Cholesky coordinates describing the covariance structure
should be fixed at their starting values. The coordinates correspond
to the off-diagonal Cholesky element and the second diagonal Cholesky
element, respectively. The default is |
fixedSigma2 |
Logical value indicating whether the variance scale associated with
the first random effect should be fixed at its starting value.
The default is |
labels |
Character vector of length two giving labels for the two random
effects in the covariance descriptor. The default is
|
tol |
Numerical tolerance used when checking positive definiteness and
whether the relationship/precision matrices supplied by the two
random effects are equal. The default is |
covm is intended for models in which two distinct random effects
are expected to be correlated. A common example is the joint modeling
of direct and indirect genetic effects.
If the coefficient vector for the first random effect is and
that for the second is , covm represents their covariance
structure as
where represents the covariance structure associated with the
coefficient levels, and is a
unstructured covariance shape describing the
relationship between the two random effects.
Internally, covm uses the same CovarianceFactor interface as
vsm. The effect covariance is represented
using a normalized-Cholesky parameterization. This guarantees a
positive-definite covariance matrix during optimization.
The variance of the first random effect is represented by the overall
scale parameter sigma2. The remaining variance ratio and
covariance are represented through the normalized-Cholesky factor.
The two random effects may have different incidence matrices. However, they must refer to identical coefficient levels in the same order and must use the same relationship/precision matrix.
When a relationship matrix is supplied through Gu, the
Henderson solver requires it to be an inverse/precision matrix with
attr(Gu, "inverse") = TRUE. For example:
attr(Ai, "inverse") <- TRUE covm( vsm(ism(focal), Gu = Ai), vsm(ism(neighbour), Gu = Ai) )
The current implementation combines simple vsm random effects
only. Each input must contain one covariance-product coordinate. More
complex covariance-factor products should therefore not currently be
supplied independently inside ran1 and ran2.
A list describing a correlated random-effect structure compatible with
the CovarianceFactor-v2 interface used by vsm and
mmes. The main elements are:
“'
ZA list containing the two incidence matrices, one for each random effect.
GuThe common sparse relationship precision matrix associated with
the coefficient levels. It is stored with
attr(Gu, "inverse") = TRUE for use by the Henderson solver.
covStructA CovarianceFactor-v2 descriptor containing the overall variance
scale and the normalized-Cholesky representation of the
unstructured covariance between the two random
effects.
residualLocalIndexNULL, since covm describes a random-effect structure
rather than a residual covariance structure.
productDesignNULL for the current implementation.
partitionsRNULL for the current implementation.
covmLogical value equal to TRUE, identifying the object as one
constructed by covm.
covm_labelsThe two labels used for the correlated random effects.
“'
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G (2016). Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6). doi:10.1371/journal.pone.0156744
Bijma, P. (2014). The quantitative genetics of indirect genetic effects: a selective review of modelling issues. Heredity, 112(1), 61–69.
vsm for constructing random-effect covariance structures
and mmes for fitting mixed models using the Henderson
solver.
data(DT_ige, package = "enhancer") DT <- DT_ige ## Correlate two random effects with identity relationship matrices covRes <- with( DT, covm( vsm(ism(focal)), vsm(ism(neighbour)) ) ) str(covRes) ## Custom initial variance-covariance matrix covRes2 <- with( DT, covm( vsm(ism(focal)), vsm(ism(neighbour)), theta = matrix( c(0.5, 0.1, 0.1, 0.3), 2, 2 ) ) ) ## Relationship precision matrix ## Ai must have matching row and column names and be marked as inverse. ## ## attr(Ai, "inverse") <- TRUE ## ## covRes3 <- with( ## DT, ## covm( ## vsm(ism(focal), Gu = Ai), ## vsm(ism(neighbour), Gu = Ai) ## ) ## ) ## See the DT_ige help page for a complete model-fitting example.data(DT_ige, package = "enhancer") DT <- DT_ige ## Correlate two random effects with identity relationship matrices covRes <- with( DT, covm( vsm(ism(focal)), vsm(ism(neighbour)) ) ) str(covRes) ## Custom initial variance-covariance matrix covRes2 <- with( DT, covm( vsm(ism(focal)), vsm(ism(neighbour)), theta = matrix( c(0.5, 0.1, 0.1, 0.3), 2, 2 ) ) ) ## Relationship precision matrix ## Ai must have matching row and column names and be marked as inverse. ## ## attr(Ai, "inverse") <- TRUE ## ## covRes3 <- with( ## DT, ## covm( ## vsm(ism(focal), Gu = Ai), ## vsm(ism(neighbour), Gu = Ai) ## ) ## ) ## See the DT_ige help page for a complete model-fitting example.
Returns the full covariance matrix of a random or residual term of a fitted
mmes model over its covariance coordinates (for example the
genetic trait-by-trait covariance matrix of a multi-trait model), together
with the implied correlation matrix and delta-method standard errors of every
element.
covmatrix_mmes(object, term, se = TRUE, max.dim = 500L, rel_step = 1e-5)covmatrix_mmes(object, term, se = TRUE, max.dim = 500L, rel_step = 1e-5)
object |
A fitted |
term |
Name (as in |
se |
If |
max.dim |
Refuse terms whose covariance coordinate space is larger than this (the matrices are dense). |
rel_step |
Relative step of the central differences used for the Jacobian. |
The matrix is built from all the
covariance factors of the vsm term (the relationship matrix
Gu is not included), so for vsm(usm(trait), ism(id)) it is the
trait covariance matrix, and for vsm(dsm(env), usm(trait), ism(id)) the
environment-by-trait matrix. Row and column names are the coordinate levels.
Standard errors use the delta method,
, where is
object$theta_se (the covariance of the reported parameters, as used by
covparams_mmes_se) and the Jacobian of each element with
respect to the reported parameters. Fixed parameters contribute no variance.
Diagonal standard errors of the correlation matrix are zero. Terms split by
dsumm sections are not supported.
A list with covariance and correlation and, if
se=TRUE, covariance.se and correlation.se.
covparams_mmes, covparams_mmes_se,
vpredict, stackTraits
set.seed(17) n <- 60 DT <- data.frame(id = factor(rep(seq_len(n), each = 3))) u <- matrix(rnorm(n * 2), n) DT$trait_a <- u[DT$id, 1] + rnorm(nrow(DT), sd = 0.7) DT$trait_b <- u[DT$id, 2] + rnorm(nrow(DT), sd = 1) DTL <- stackTraits(DT, traits = c("trait_a", "trait_b"), keep = "id") fit <- mmes(value ~ trait, random = ~ vsm(usm(trait), ism(id)), rcov = ~ vsm(usm(trait), ism(record)), data = DTL, verbose = FALSE) G <- covmatrix_mmes(fit, 1) # genetic G$covariance G$correlation G$correlation.se R <- covmatrix_mmes(fit, 2) # residual R$correlationset.seed(17) n <- 60 DT <- data.frame(id = factor(rep(seq_len(n), each = 3))) u <- matrix(rnorm(n * 2), n) DT$trait_a <- u[DT$id, 1] + rnorm(nrow(DT), sd = 0.7) DT$trait_b <- u[DT$id, 2] + rnorm(nrow(DT), sd = 1) DTL <- stackTraits(DT, traits = c("trait_a", "trait_b"), keep = "id") fit <- mmes(value ~ trait, random = ~ vsm(usm(trait), ism(id)), rcov = ~ vsm(usm(trait), ism(record)), data = DTL, verbose = FALSE) G <- covmatrix_mmes(fit, 1) # genetic G$covariance G$correlation G$correlation.se R <- covmatrix_mmes(fit, 2) # residual R$correlation
Returns covariance parameters in the native, model-facing scale defined by each CovarianceFactor descriptor, rather than the unconstrained working coordinates or normalized variance ratios used internally by the optimizer.
covparams_mmes(object, term = NULL)covparams_mmes(object, term = NULL)
object |
A fitted object of class |
term |
Optional covariance-term name or numeric index. By default, all random and residual covariance terms are returned. |
Every CovarianceFactor descriptor carries a native reporting callback. Built-in
structures use it to report meaningful quantities such as level-specific
variances for dsm(), variances and covariances for usm(), and
variance-correlation parameters for correlation structures. Structural zeros
and internal coordinates such as log standard deviations, normalized Cholesky
coefficients, and variance ratios are not returned where the covariance model
provides a more direct native representation.
All built-in CovarianceFactor families provide native reporters, including identity, diagonal, unstructured, AR(1–3), compound-symmetry, moving-average, general-correlation, factor-analytic, antedependence, reduced-rank, Matern, Toeplitz, SAR, and CAR structures. Heterogeneous AR and compound-symmetry models report their dependence parameter together with level-specific variances rather than an overall variance plus variance ratios.
Both fixed and estimated covariance parameters are included. For an arbitrary Kronecker product, the product-level variance scale is absorbed by the first covariance-shaping factor. Subsequent factors are necessarily reported on their normalized relative scale because the product has only one identifiable overall scale.
User-defined ownm() structures can supply a native_report
callback. If none is supplied, their overall variance and naturally transformed
parameter values are returned.
Use covparams_mmes_se() when native-scale delta-method standard errors
are also required.
A data frame with columns term, factor, section,
parameter, and estimate. section identifies the
dsumm section a parameter belongs to and is NA otherwise.
covparams_mmes_se, mmes, vsm,
ownm
## Not run: fit <- mmes(Yield ~ Env, random = ~ vsm(dsm(Env), ism(Name)), rcov = ~ units, data = DT_example) covparams_mmes(fit) fit$covParNative ## End(Not run)## Not run: fit <- mmes(Yield ~ Env, random = ~ vsm(dsm(Env), ism(Name)), rcov = ~ units, data = DT_example) covparams_mmes(fit) fit$covParNative ## End(Not run)
Returns descriptor-defined native covariance parameters with delta-method standard errors computed from the fitted covariance-parameter uncertainty matrix.
covparams_mmes_se(object, term = NULL, rel_step = 1e-6)covparams_mmes_se(object, term = NULL, rel_step = 1e-6)
object |
A fitted object of class |
term |
Optional covariance-term name or numeric index. By default, all random and residual covariance terms are returned. |
rel_step |
Positive relative step used to numerically differentiate each CovarianceFactor native reporting callback. |
The fitted theta_se matrix describes uncertainty in the reported
covPar coordinates. For each covariance structure,
covparams_mmes_se numerically evaluates the Jacobian of its descriptor's
native reporting callback and applies the multivariate delta method,
Consequently, coupled transformations use the complete covariance information.
For example, the standard error of a dsm() level variance accounts for
uncertainty and covariance in both the overall variance and its variance ratio.
Likewise, usm() standard errors account for all relevant normalized
Cholesky parameters.
The transformation is available for every built-in CovarianceFactor family
supported by covparams_mmes(); user-defined ownm() structures
use their descriptor-provided native_report callback.
Parameters marked fixed in the covariance descriptor contribute no independent
sampling uncertainty: their rows and columns in theta_se are excluded
before transformation. A native quantity involving both fixed and free
parameters can still have a nonzero standard error through its free parameters.
Both fixed and estimated native quantities are returned.
The same table is stored automatically in object$covParNativeSE by
mmes().
A data frame containing term, factor, parameter,
estimate, StdError, and Zratio. A zero standard error is
reported for a fully fixed native quantity, with Zratio=NA.
## Not run: fit <- mmes(Yield ~ Env, random = ~ vsm(dsm(Env), ism(Name)), rcov = ~ units, data = DT_example) covparams_mmes_se(fit) fit$covParNativeSE ## End(Not run)## Not run: fit <- mmes(Yield ~ Env, random = ~ vsm(dsm(Env), ism(Name)), rcov = ~ units, data = DT_example) covparams_mmes_se(fit) fit$covParNativeSE ## End(Not run)
Compound-symmetry covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
csm(x, rho = 0.10, fixed = FALSE, variance = c("homogeneous", "heterogeneous"), values = NULL)csm(x, rho = 0.10, fixed = FALSE, variance = c("homogeneous", "heterogeneous"), values = NULL)
x |
Variable defining q covariance levels. |
rho |
Starting common off-diagonal correlation. |
fixed |
For homogeneous variance, a logical indicating whether rho is fixed. For heterogeneous variance, a logical vector of length q: rho followed by q-1 variance-ratio parameters. |
variance |
Whether the correlation has homogeneous or heterogeneous marginal variances. |
values |
Optional q positive starting variances when |
With variance = "homogeneous", csm uses unit diagonal and a common off-diagonal correlation,
With variance = "heterogeneous", it uses
where the first variance is the reference and the remaining q-1 variances are estimated as positive ratios. Positive definiteness requires . The product-level variance remains owned by vsm.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(csm(environment), ism(genotype)) ## End(Not run)## Not run: vsm(csm(environment), ism(genotype)) ## End(Not run)
mmer and vsr
Combines a design/incidence representation with a user-supplied covariance-component constraint matrix for use by the mmer covariance-model interface, typically inside vsr.
csr(x, mm)csr(x, mm)
x |
A factor, character vector, numeric vector, or design/incidence matrix defining the covariance dimension. Factor and character inputs are expanded to incidence columns. A matrix is used directly. |
mm |
A square covariance-component constraint matrix. Its dimensions must correspond to the columns of the design matrix generated from |
csr() provides the general constraint-matrix interface underlying custom covariance patterns for mmer/vsr. Unlike dsr and usr, it does not construct a predefined diagonal or unstructured pattern. Instead, the supplied matrix mm determines the covariance-component structure through thetaC.
Conceptually, thetaC identifies which elements of the covariance matrix are associated with estimated variance-covariance components and which constraints are shared among elements. The interpretation of the entries therefore follows the thetaC convention used by vsr.
When x is a matrix it is used directly as . Otherwise, factors and character vectors are converted to incidence matrices, while numeric non-factor inputs are treated as a single design column.
The function assigns the column names of to both dimensions of mm; therefore mm should be conformable with the number of columns of the resulting design matrix.
A list with components:
Z: the design/incidence matrix associated with the covariance dimension.
thetaC: the user-supplied covariance-component constraint matrix, with dimensions named according to Z.
# A custom two-level covariance-component pattern x <- factor(c("A","B","A","B")) mm <- matrix(c(1, 2, 2, 1), 2, 2, byrow = TRUE) C <- csr(x, mm) C$Z C$thetaC# A custom two-level covariance-component pattern x <- factor(c("A","B","A","B")) mm <- matrix(c(1, 2, 2, 1), 2, 2, byrow = TRUE) C <- csr(x, mm) C$Z C$thetaC
C++ implementation of the dominance matrix. Calculates the realized dominance relationship matrix. Can help to increase the prediction accuracy when 2 conditions are met; 1) The trait has intermediate to high heritability, 2) The population contains a big number of individuals that are half or full sibs (HS & FS).
D.mat(X,nishio=TRUE,min.MAF=0,return.imputed=FALSE)D.mat(X,nishio=TRUE,min.MAF=0,return.imputed=FALSE)
X |
Matrix ( |
nishio |
If TRUE, Nishio and Satoh (2014), which uses the orthogonal parameterization of Vitezica et al. (2013). Otherwise Su et al. (2012). See Details and references. |
min.MAF |
Minimum minor allele frequency. The D matrix is not sensitive to rare alleles, so by default only monomorphic markers are removed. |
return.imputed |
When TRUE, the imputed marker matrix is returned. |
Missing values are replaced by the column (marker) mean before the matrix is computed. Markers with minor allele frequency less than or equal to min.MAF (and therefore all monomorphic markers) are removed. For each marker , is the frequency of the allele counted by the code 1, estimated as the column mean of , and .
For the nishio method (Nishio and Satoh, 2014; Vitezica et al., 2013): genotypes are coded as for , for and for , computed as . Fractional values are passed through the same formula; note that a mean-imputed value receives the heterozygote code . Then , where . Under Hardy-Weinberg equilibrium this coding is orthogonal to the additive coding.
For the Su method (Su et al., 2012): heterozygosity is coded as and centered as . Then , where .
Versions of sommer earlier than 4.4.9 used a different formula for nishio=TRUE: centered by its column mean and divided by . That was not the Nishio and Satoh (2014) method, so results from those versions will differ.
If return.imputed = FALSE, the dominance relationship matrix is returned.
If return.imputed = TRUE, the function returns a list containing
the D matrix
the imputed marker matrix
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
Nishio M and Satoh M. 2014. Including Dominance Effects in the Genomic BLUP Method for Genomic Evaluation. Plos One 9(1), doi:10.1371/journal.pone.0085792
Vitezica ZG, Varona L, Legarra A. 2013. On the Additive and Dominant Variance and Covariance of Individuals Within the Genomic Selection Scope. Genetics 195(4): 1223-1230. doi:10.1534/genetics.113.155176
Su G, Christensen OF, Ostersen T, Henryon M, Lund MS. 2012. Estimating Additive and Non-Additive Genetic Variances and Predicting Genetic Merits Using Genome-Wide Dense Single Nucleotide Polymorphism Markers. PLoS ONE 7(9): e45293. doi:10.1371/journal.pone.0045293
####=========================================#### #### EXAMPLE 1 ####=========================================#### ####random population of 200 lines with 1000 markers X <- matrix(rep(0,200*1000),200,1000) for (i in 1:200) { X[i,] <- sample(c(-1,0,0,1), size=1000, replace=TRUE) } D <- D.mat(X)####=========================================#### #### EXAMPLE 1 ####=========================================#### ####random population of 200 lines with 1000 markers X <- matrix(rep(0,200*1000),200,1000) for (i in 1:200) { X[i,] <- sample(c(-1,0,0,1), size=1000, replace=TRUE) } D <- D.mat(X)
This function takes a matrix that is in data frame format and transforms it into a matrix. Other packages that allows you to obtain an additive relationship matrix from a pedigree is the 'pedigreemm' package.
dfToMatrix(x, row="Row",column="Column", value="Ainverse", returnInverse=FALSE, bend=1e-6)dfToMatrix(x, row="Row",column="Column", value="Ainverse", returnInverse=FALSE, bend=1e-6)
x |
ginv element, output from the Ainverse function. |
row |
name of the column in x that indicates the row in the original relationship matrix. |
column |
name of the column in x that indicates the column in the original relationship matrix. |
value |
name of the column in x that indicates the value for a given row and column in the original relationship matrix. |
returnInverse |
a TRUE/FALSE value indicating if the inverse of the x matrix should be computed once the data frame x is converted into a matrix. |
bend |
a numeric value to add to the diagonal matrix in case matrix is singular for inversion. |
K |
pedigree transformed in a relationship matrix. |
Kinv |
inverse of the pedigree transformed in a relationship matrix. |
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
library(Matrix) m <- matrix(1:9,3,3) m <- tcrossprod(m) mdf <- as.data.frame(as.table(m)) mdf dfToMatrix(mdf, row = "Var1", column = "Var2", value = "Freq",returnInverse=FALSE )library(Matrix) m <- matrix(1:9,3,3) m <- tcrossprod(m) mdf <- as.data.frame(as.table(m)) mdf dfToMatrix(mdf, row = "Var1", column = "Var2", value = "Freq",returnInverse=FALSE )
Diagonal heterogeneous covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
dsm(x, values = NULL, fixed = NULL, theta = NULL)dsm(x, values = NULL, fixed = NULL, theta = NULL)
x |
Variable or design defining the covariance levels. |
values |
Optional positive starting variances, one per level. |
fixed |
Logical vector of length q-1 indicating which variance-ratio parameters are fixed. |
theta |
Optional q by q diagonal starting covariance matrix; if supplied, its diagonal replaces values. |
For levels, dsm uses the first variance as the internal scale reference and estimates positive variance ratios,
The ratios are optimized on log scales and reported on their natural positive scale.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(dsm(environment), ism(genotype)) ## End(Not run)## Not run: vsm(dsm(environment), ism(genotype)) ## End(Not run)
mmer and vsr
Creates a diagonal variance-component structure for use by the mmer covariance-model interface, typically inside vsr. Each column or level represented by x receives its own diagonal variance component, while all off-diagonal covariance components are constrained to zero.
dsr(x)dsr(x)
x |
A factor, character vector, numeric vector, or design/incidence matrix defining the covariance dimension. Factor and character inputs are expanded to incidence columns. A matrix is used directly. |
dsr() is part of the covariance-structure interface used by mmer/vsr; it is distinct from dsm, which belongs to the newer mmes/vsm CovarianceFactor interface.
The function returns a design matrix and a covariance-parameter constraint matrix thetaC. If columns or levels are represented by x, then
Consequently, the associated covariance matrix has the form
so that the variances are estimated separately and all covariances are fixed to zero.
For a factor or character vector, missing observations are retained through the construction of the incidence matrix. If only one non-missing level is present, a one-column incidence matrix is constructed explicitly.
For a numeric non-factor input, x is treated as a single design column rather than expanded into factor levels.
A list with components:
Z: the design/incidence matrix associated with the covariance dimension.
thetaC: a diagonal matrix defining the diagonal covariance-component pattern used by vsr.
# Diagonal covariance structure across levels D <- dsr(factor(c("A","B","A","C"))) D$Z D$thetaC# Diagonal covariance structure across levels D <- dsr(factor(c("A","B","A","C"))) D$Z D$thetaC
dsumm replicates a residual vsm structure independently for
every level (section) of a grouping variable, such as a trial, location, or
experiment. Each section receives its own variance and its own copy of every
covariance parameter of the inner structure.
dsumm(x, by, levels = NULL)dsumm(x, by, levels = NULL)
x |
A residual |
by |
Observation-level grouping variable defining the sections. Missing
values of |
levels |
Optional character vector of |
Direct sum versus Kronecker product. A vsm() term is a Kronecker
product with a single overall variance. Including a diagonal section factor,
gives each section its own variance, but a single correlation shared by all
sections, because each factor of a Kronecker product appears only once. In
contrast, dsumm builds the block-diagonal direct sum
so every section has its own variance and its own correlations. Sections are mutually independent, so their parameters are estimated only from their own observations; with section-specific fixed effects the joint fit reproduces separate per-section fits.
Choosing between the two. Use the vsm() form when trials are
small or similar and a common spatial correlation is adequate (fewer
parameters). Use dsumm when correlations are expected to differ between
trials. With sections and inner covariance parameters,
dsumm estimates residual parameters.
Unlisted levels. Levels omitted from levels are modelled as
. Their observations are retained even when the variables of
the inner structure (for example row or range) are missing, so trials without
spatial coordinates can be analysed together with spatially designed trials.
Computation. Each section is embedded in the rectangle spanned by its
observed levels of the inner factors. Covariance applications use the small
factor inverses, and missing cells (e.g. plots with a missing response) are
absorbed exactly by a Schur complement, so the dense observation-level
covariance matrix is never formed. This requires sections that are close to
complete rectangles and no W weights.
Reporting. covparams_mmes returns one row per parameter
and section, with the section in the section column. The variance rows
belong to the by factor; correlation rows are labelled by their inner
factor, e.g. ar1m(range).
A residual covariance structure, in the same form as a residual vsm()
term, for use in the rcov argument of mmes.
dsumm is currently available only for residual (rcov) structures,
without W weights, and cannot be nested.
vsm, ar1m, dsm, mmes,
covparams_mmes.
## Not run: mix <- mmes(yield ~ trial, rcov = ~ dsumm(vsm(ar1m(range), ar1m(row), ism(units)), by = trial), data = dat) covparams_mmes(mix) # Spatial structure only for two trials; remaining trials are iid. mix2 <- mmes(yield ~ trial, rcov = ~ dsumm(vsm(ar1m(range), ar1m(row), ism(units)), by = trial, levels = c("T1", "T2")), data = dat) # Site-specific unstructured covariance among environments. mix3 <- mmes(y ~ site, rcov = ~ dsumm(vsm(usm(env), ism(units)), by = site), data = dat2) ## End(Not run)## Not run: mix <- mmes(yield ~ trial, rcov = ~ dsumm(vsm(ar1m(range), ar1m(row), ism(units)), by = trial), data = dat) covparams_mmes(mix) # Spatial structure only for two trials; remaining trials are iid. mix2 <- mmes(yield ~ trial, rcov = ~ dsumm(vsm(ar1m(range), ar1m(row), ism(units)), by = trial, levels = c("T1", "T2")), data = dat) # Site-specific unstructured covariance among environments. mix3 <- mmes(y ~ site, rcov = ~ dsumm(vsm(usm(env), ism(units)), by = site), data = dat2) ## End(Not run)
Calculates the realized epistatic relationship matrix of second order (additive x additive, additive x dominance, or dominance x dominance) using hadamard products with the C++ Armadillo library.
E.mat(X,nishio=TRUE,type="A#A",min.MAF=0.02)E.mat(X,nishio=TRUE,type="A#A",min.MAF=0.02)
X |
Matrix ( |
nishio |
If TRUE, Nishio and Satoh (2014) (orthogonal parameterization of Vitezica et al. 2013), otherwise Su et al. (2012) (see Details in the D.mat help page). |
type |
An argument specifying the type of epistatic relationship matrix desired. The default is the second order epistasis (additive x additive) type="A#A". Other options are additive x dominant (type="A#D"), or dominant by dominant (type="D#D"). |
min.MAF |
Minimum minor allele frequency. The A matrix is not sensitive to rare alleles, so by default only monomorphic markers are removed. |
it is computed as the Hadamard product of the epistatic relationship matrix; E=A#A, E=A#D, E=D#D.
The epistatic relationship matrix is returned.
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
Endelman, J.B., and J.-L. Jannink. 2012. Shrinkage estimation of the realized relationship matrix. G3:Genes, Genomes, Genetics. 2:1405-1413. doi: 10.1534/g3.112.004259
Nishio M and Satoh M. 2014. Including Dominance Effects in the Genomic BLUP Method for Genomic Evaluation. Plos One 9(1), doi:10.1371/journal.pone.0085792
Su G, Christensen OF, Ostersen T, Henryon M, Lund MS. 2012. Estimating Additive and Non-Additive Genetic Variances and Predicting Genetic Merits Using Genome-Wide Dense Single Nucleotide Polymorphism Markers. PLoS ONE 7(9): e45293. doi:10.1371/journal.pone.0045293
####=========================================#### ####random population of 200 lines with 1000 markers ####=========================================#### X <- matrix(rep(0,200*1000),200,1000) for (i in 1:200) { X[i,] <- sample(c(-1,0,0,1), size=1000, replace=TRUE) } E <- E.mat(X, type="A#A") # if heterozygote markers are present can be used "A#D" or "D#D"####=========================================#### ####random population of 200 lines with 1000 markers ####=========================================#### X <- matrix(rep(0,200*1000),200,1000) for (i in 1:200) { X[i,] <- sample(c(-1,0,0,1), size=1000, replace=TRUE) } E <- E.mat(X, type="A#A") # if heterozygote markers are present can be used "A#D" or "D#D"
Factor-analytic covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
fam(x, k = 1L, loadings = NULL, specific = NULL, fixed = NULL, variance = c("heterogeneous", "homogeneous"))fam(x, k = 1L, loadings = NULL, specific = NULL, fixed = NULL, variance = c("heterogeneous", "homogeneous"))
x |
Variable defining q covariance levels. |
k |
Factor-analytic rank, satisfying 1 <= k < q. |
loadings |
Optional finite q by k starting loading matrix. |
specific |
Optional q positive starting specific variances. With
|
fixed |
Logical vector controlling all loading and specific-variance-ratio parameters. |
variance |
Whether to estimate separate specific variances for each level
( |
The factor-analytic shape is based on
where is diagonal positive, followed by . For rotational identification, the leading loading block is lower triangular and its diagonal loadings are positive. The first specific variance is an internal reference; remaining specific variances are positive ratios. This removes the otherwise redundant internal scale because vsm supplies the overall .
With variance="heterogeneous", fixed has length
: triangular loadings followed by q-1 specific-variance
ratios. With variance="homogeneous", all specific ratios are one,
internally, and fixed has length .
The common specific variance on the fitted scale is estimated, not fixed
at one, and is reported as common_specific_variance. This homogeneous
model reproduces the covariance family previously fitted by rrm().
For a genuine reduced-rank model with all specific variances fixed at zero,
use rrm.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(fam(environment, k=2), ism(genotype)) vsm(fam(environment, k=2, variance="homogeneous"), ism(genotype)) ## End(Not run)## Not run: vsm(fam(environment, k=2), ism(genotype)) vsm(fam(environment, k=2, variance="homogeneous"), ism(genotype)) ## End(Not run)
Assigns a stats::family() object to each trait of a long-format
multi-trait mmes model, e.g. a binary disease score together
with a Gaussian yield, so that their genetic and residual correlations can be
estimated jointly by penalized quasi-likelihood (PQL).
familym(by, ...)familym(by, ...)
by |
Name (character string) of the column of |
... |
Family objects named by the levels of the |
The object is passed as the family argument of mmes. Each PQL
iteration builds the working response and working weights of every row with
the family of its trait, and fits a weighted Gaussian multi-trait model.
The residual variance of binomial, Poisson and negative binomial traits is not
a free parameter (their dispersion is one), while that of Gaussian and other
families is estimated. The residual structure must therefore allow individual
trait variances to be fixed: use
rcov = ~ vsm(corgm(trait, variance = "heterogeneous"), ism(record))
(trait correlations and heterogeneous variances, see corgm) or
rcov = ~ vsm(dsm(trait), ism(units)) (uncorrelated residuals).
The first level of the trait factor must be a fixed-dispersion trait,
because its variance is the vsm scale; reorder the levels
otherwise. mmes then fixes the residual variance of every
fixed-dispersion trait to one and estimates the rest.
As for single-family PQL fits, the likelihood, AIC and BIC are
NA. The fitted object has a named dispersion vector (one per
trait: one for fixed-dispersion traits, the REML residual variance for the
others), and fitted() and residuals() apply the inverse link and
variance function of each trait to its rows. Random-effect variances are on
the link scale of each trait.
An object of class "sommer_familym".
mmes, corgm, stackTraits,
covmatrix_mmes
set.seed(12) ng <- 100; nr <- 4 G <- matrix(c(1, 0.4, 0.4, 0.8), 2) u <- matrix(rnorm(ng * 2), ng) %*% chol(G) d <- data.frame(id = factor(rep(paste0("g", 1:ng), each = nr))) d$disease <- rbinom(nrow(d), 1, plogis(-0.5 + u[as.integer(d$id), 1])) d$yield <- 10 + u[as.integer(d$id), 2] + rnorm(nrow(d)) L <- stackTraits(d, traits = c("disease", "yield")) fit <- mmes(value ~ trait, random = ~ vsm(usm(trait), ism(id)), rcov = ~ vsm(corgm(trait, variance = "heterogeneous"), ism(record)), family = familym("trait", disease = binomial(), yield = gaussian()), data = L, verbose = FALSE) fit$dispersion covmatrix_mmes(fit, 1)$correlation # genetic correlation (link scale) head(fitted(fit)) # probabilities for disease rowsset.seed(12) ng <- 100; nr <- 4 G <- matrix(c(1, 0.4, 0.4, 0.8), 2) u <- matrix(rnorm(ng * 2), ng) %*% chol(G) d <- data.frame(id = factor(rep(paste0("g", 1:ng), each = nr))) d$disease <- rbinom(nrow(d), 1, plogis(-0.5 + u[as.integer(d$id), 1])) d$yield <- 10 + u[as.integer(d$id), 2] + rnorm(nrow(d)) L <- stackTraits(d, traits = c("disease", "yield")) fit <- mmes(value ~ trait, random = ~ vsm(usm(trait), ism(id)), rcov = ~ vsm(corgm(trait, variance = "heterogeneous"), ism(record)), family = familym("trait", disease = binomial(), yield = gaussian()), data = L, verbose = FALSE) fit$dispersion covmatrix_mmes(fit, 1)$correlation # genetic correlation (link scale) head(fitted(fit)) # probabilities for disease rows
fitted method for class "mmes".
## S3 method for class 'mmes' fitted(object, type=c("response", "link"), ...)## S3 method for class 'mmes' fitted(object, type=c("response", "link"), ...)
object |
an object of class |
type |
For a non-Gaussian PQL fit, return fitted means on the response scale (default) or linear predictors on the link scale. |
... |
Further arguments to be passed to the mmes function |
For Gaussian fits, fitted values of the form y.hat = Xb + Zu. For non-Gaussian
PQL fits, response-scale conditional means by default, or Xb + Zu with
type="link".
Giovanny Covarrubias
# data(DT_cpdata, package="enhancer") # DT <- DT_cpdata # GT <- GT_cpdata # MP <- MP_cpdata # #### create the variance-covariance matrix # A <- A.mat(GT) # additive relationship matrix # #### look at the data and fit the model # head(DT) # mix1 <- mmes(Yield~1, # random=~vsm(ism(id),Gu=A) # + Rowf + Colf + spl2Dc(Row,Col), # rcov=~units, # data=DT) # # ff=fitted(mix1) # # colfunc <- colorRampPalette(c("steelblue4","springgreen","yellow")) # lattice::wireframe(`u:Row.fitted`~Row*Col, data=ff$dataWithFitted, # aspect=c(61/87,0.4), drape=TRUE,# col.regions = colfunc, # light.source=c(10,0,10)) # lattice::levelplot(`u:Row.fitted`~Row*Col, data=ff$dataWithFitted, col.regions = colfunc)# data(DT_cpdata, package="enhancer") # DT <- DT_cpdata # GT <- GT_cpdata # MP <- MP_cpdata # #### create the variance-covariance matrix # A <- A.mat(GT) # additive relationship matrix # #### look at the data and fit the model # head(DT) # mix1 <- mmes(Yield~1, # random=~vsm(ism(id),Gu=A) # + Rowf + Colf + spl2Dc(Row,Col), # rcov=~units, # data=DT) # # ff=fitted(mix1) # # colfunc <- colorRampPalette(c("steelblue4","springgreen","yellow")) # lattice::wireframe(`u:Row.fitted`~Row*Col, data=ff$dataWithFitted, # aspect=c(61/87,0.4), drape=TRUE,# col.regions = colfunc, # light.source=c(10,0,10)) # lattice::levelplot(`u:Row.fitted`~Row*Col, data=ff$dataWithFitted, col.regions = colfunc)
fixm creates a square matrix with 3's in the diagnals and off-diagonals to quickly specify a fixed constraint in the Gtc argument of the vsm function.
fixm(x, reps=NULL)fixm(x, reps=NULL)
x |
integer specifying the number of traits to be fitted for a given random effect. |
reps |
integer specifying the number of times the matrix should be repeated in a list format to provide easily the constraints in complex models that use the ds(), us() or cs() structures. |
a matrix or a list of matrices with the constraints to be provided in the Gtc argument of the vsm function.
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
fixm(4) fixm(4,2)fixm(4) fixm(4,2)
Instantiates reproducible synthetic mixed model datasets and formulas spanning factor dimensions, covariance structures, relationship densities, and tasks.
generate_mme_workload(name = NULL, n_ind = 60L, n_levels = 5L, structure = c("ar1", "ar2", "us", "diag", "fa", "rr", "spatial", "sar", "car"), relationship = c("none", "dense", "sparse"), missing_rate = 0.0, reml = TRUE, computeCi = 0L, seed = 42L)generate_mme_workload(name = NULL, n_ind = 60L, n_levels = 5L, structure = c("ar1", "ar2", "us", "diag", "fa", "rr", "spatial", "sar", "car"), relationship = c("none", "dense", "sparse"), missing_rate = 0.0, reml = TRUE, computeCi = 0L, seed = 42L)
name |
Descriptive label for the workload. |
n_ind |
Number of unique individuals / genotypes. Default is 60. |
n_levels |
Number of factor levels (e.g. environments, timepoints, or sites). Default is 5. |
structure |
Covariance structure type. Supported: |
relationship |
Individual relationship matrix: |
missing_rate |
Fraction of missing response values (0.0 to 0.5). Default is 0.0. |
reml |
Logical; whether to fit by REML (TRUE) or ML (FALSE). Default is TRUE. |
computeCi |
Final inverse demand: 0 (none), 1 (Takahashi selected inverse), 2 (full inverse). |
seed |
Random seed for reproducible dataset simulation. |
A list of class "mme_workload" containing data, formulas, REML and
computeCi settings, and workload metadata.
# Generate a small 1D autoregressive workload wl <- generate_mme_workload( name = "demo_ar1", n_ind = 20, n_levels = 4, structure = "ar1" )# Generate a small 1D autoregressive workload wl <- generate_mme_workload( name = "demo_ar1", n_ind = 20, n_levels = 4, structure = "ar1" )
THIS FUNCTION IS DEPRECATED. Fits a multivariate/univariate linear mixed model GWAS by likelihood methods (REML), see the Details section below. It uses the mmer function and its core coded in C++ using the Armadillo library to optimize dense matrix operations common in the derect-inversion algorithms. After the model fit extracts the inverse of the phenotypic variance matrix to perform the association test for the "p" markers. Please check the Details section (Model enabled) if you have any issue with making the function run.
The sommer package is updated on CRAN every 3-months due to CRAN policies but you can find the latest source at https://github.com/covaruber/sommer . This can be easily installed typing the following in the R console:
library(devtools)
install_github("covaruber/sommer")
This is recommended since bugs fixes will be immediately available in the GitHub source. For tutorials on how to perform different analysis with sommer please look at the vignettes by typing in the terminal:
vignette("v1.sommer.quick.start")
vignette("v2.sommer.changes.and.faqs")
vignette("v3.sommer.qg")
vignette("v4.sommer.gxe")
or visit https://covaruber.github.io
GWAS(fixed, random, rcov, data, weights, W, nIters=20, tolParConvLL = 1e-03, tolParInv = 1e-06, init=NULL, constraints=NULL,method="NR", getPEV=TRUE,naMethodX="exclude", naMethodY="exclude",returnParam=FALSE, dateWarning=TRUE,date.warning=TRUE,verbose=FALSE, stepWeight=NULL, emWeight=NULL, M=NULL, gTerm=NULL, n.PC = 0, min.MAF = 0.05, P3D = TRUE)GWAS(fixed, random, rcov, data, weights, W, nIters=20, tolParConvLL = 1e-03, tolParInv = 1e-06, init=NULL, constraints=NULL,method="NR", getPEV=TRUE,naMethodX="exclude", naMethodY="exclude",returnParam=FALSE, dateWarning=TRUE,date.warning=TRUE,verbose=FALSE, stepWeight=NULL, emWeight=NULL, M=NULL, gTerm=NULL, n.PC = 0, min.MAF = 0.05, P3D = TRUE)
fixed |
A formula specifying the response variable(s) and fixed effects, i.e: response ~ covariate for univariate models cbind(response.i,response.j) ~ covariate for multivariate models The fcm function can be used to constrain fixed effects in multi-response models. |
random |
a formula specifying the name of the random effects, i.e. random= ~ genotype + year. Useful functions can be used to fit heterogeneous variances and other special models (see 'Special Functions' in the Details section for more information):
|
rcov |
a formula specifying the name of the error term, i.e. rcov= ~ units. The functions that can be used to fit heterogeneous residual variances are the same used on the random term but the random effect is always "units", i.e. rcov=~vsr(dsr(Location),units) |
data |
a data frame containing the variables specified in the formulas for response, fixed, and random effects. |
weights |
name of the covariate for weights. To be used for the product R = Wsi*R*Wsi, where * is the matrix product, Wsi is the square root of the inverse of W and R is the residual matrix. |
W |
Alternatively, instead of providing a vector of weights the user can specify an entire W matrix (e.g., when covariances exist). To be used first to produce Wis = solve(chol(W)), and then calculate R = Wsi*R*Wsi.t(), where * is the matrix product, and R is the residual matrix. Only one of the arguments weights or W should be used. If both are indicated W will be given the preference. |
nIters |
Maximum number of iterations allowed. Default value is 15. |
tolParConvLL |
Convergence criteria. |
tolParInv |
tolerance parameter for matrix inverse used when singularities are encountered. |
init |
initial values for the variance components. By default this is NULL and variance components are estimated by the method selected, but in case the user want to provide initial values for ALL var-cov components this argument is functional. It has to be provided as a list or an array, where each list element is one variance component and if multitrait model is pursued each element of the list is a matrix of variance covariance components among traits. Initial values can also be provided in the Gt argument of the vsr function.Is highly encouraged to use the Gt and Gtc arguments of the vsr function instead of this argument |
constraints |
when initial values are provided these have to be accompanied by their constraints. See the vsr function for more details on the constraints. Is highly encouraged to use the Gt and Gtc arguments of the vsr function instead of this argument. |
method |
this refers to the method or algorithm to be used for estimating variance components. Direct-inversion Newton-Raphson NR and Average Information AI (Tunnicliffe 1989; Gilmour et al. 1995; Lee et al. 2015). |
getPEV |
a TRUE/FALSE value indicating if the program should return the predicted error variance and variance for random effects. This option is provided since this can take a long time for certain models where p > n by a big extent. |
naMethodX |
one of the two possible values; "include" or "exclude". If "include" is selected then the function will impute the X matrices for fixed effects with the median value. If "exclude" is selected it will get rid of all rows with missing values for the X (fixed) covariates. The default is "exclude". The "include" option should be used carefully. |
naMethodY |
one of the three possible values; "include", "include2" or "exclude". If "include" is selected then the function will impute the response variables with the median value. The difference between "include" and "include2" is only available in the multitrait models when the imputation can happen for the entire matrix of responses or only for complete cases ("include2"). If "exclude" is selected it will get rid of rows in responses where missing values are present for the estimation of variance components. The default is "exclude". |
returnParam |
a TRUE/FALSE value to indicate if the program should return the parameters used for modeling without fitting the model. |
dateWarning |
a TRUE/FALSE value to indicate if the program should warn you when is time to update the sommer package. |
date.warning |
a TRUE/FALSE value to indicate if the program should warn you when is time to update the sommer package. |
verbose |
a TRUE/FALSE value to indicate if the program should return the progress of the iterative algorithm. |
stepWeight |
A vector of values (of length equal to the number of iterations) indicating the weight used to multiply the update (delta) for variance components at each iteration. If NULL the 1st iteration will be multiplied by 0.5, the 2nd by 0.7, and the rest by 0.9. This argument can help to avoid that variance components go outside the parameter space in the initial iterations which doesn't happen very often with the NR method but it can be detected by looking at the behavior of the likelihood. In that case you may want to give a smaller weight to the initial 8-10 iterations. |
emWeight |
A vector of values (of length equal to the number of iterations) indicating with values between 0 and 1 the weight assigned to the EM information matrix. And the values 1 - emWeight will be applied to the NR/AI information matrix to produce a joint information matrix. If NULL weights for EM information matrix are zero and 1 for the NR/AI information matrix. |
M |
The marker matrix containing the marker scores for each level of the random effect selected in the gTerm argument, coded as numeric based on the number of reference alleles in the genotype call, e.g. (-1,0,1) = (aa,Aa,AA), levels in diploid individuals. Individuals in rows and markers in columns. No additional columns should be provided, is a purely numerical matrix. Similar logic applies to polyploid individuals, e.g. (-3,-2,-1,0,1,2,3) = (aaaa,aaaA,aaAA,Aaaa,AAaa,AAAa,AAAA). |
gTerm |
a character vector indicating the random effect linked to the marker matrix M (i.e. the genetic term) in the model. The random effect selected should have the same number of levels than the number of rows of M. When fitting only a random effect without a special covariance structure (e.g., dsr, usr, etc.) you will need to add the call 'u:' to the name of the random effect given the behavior of the naming rules of the solver when having a simple random effect without covariance structure. |
n.PC |
Number of principal components to include as fixed effects. Default is 0 (equals K model). |
min.MAF |
Specifies the minimum minor allele frequency (MAF). If a marker has a MAF less than min.MAF, it is assigned a zero score. |
P3D |
When P3D=TRUE, variance components are estimated by REML only once, without any markers in the model and then a for loop for hypothesis testing is performed. When P3D=FALSE, variance components are estimated by REML for each marker separately. The latter can be quite time consuming. As many models will be run as number of marker. |
Citation
Type citation("sommer") to know how to cite the sommer package in your publications.
Models Enabled
For details about the models enabled and more information about the covariance structures please check the help page of the package (sommer). In general the GWAS model implemented in sommer to obtain marker effect is a generalized linear model of the form:
b = (X'V-X)X'V-y
with X = ZMi
where: b is the marker effect (dimensions 1 x mt) y is the response variable (univariate or multivariate) (dimensions 1 x nt) V- is the inverse of the phenotypic variance matrix (dimensions nt x nt) Z is the incidence matrix for the random effect selected (gTerm argument) to perform the GWAS (dimensions nt x ut) Mi is the ith column of the marker matrix (M argument) (dimensions u x m)
for t traits, n observations, m markers and u levels of the random effect. Depending if P3D is TRUE or FALSE the V- matrix will be calculated once and used for all marker tests (P3D=TRUE) or estimated through REML for each marker (P3D=FALSE).
vignette('sommer.start')
Bug report and contact
If you have any technical questions or suggestions please post it in https://stackoverflow.com or https://stats.stackexchange.com.
If you have any bug report please go to https://github.com/covaruber/sommer or send me an email to address it asap.
If all parameters are correctly indicated the program will return a list with the following information:
Vi |
the inverse of the phenotypic variance matrix V^- = (ZGZ+R)^-1 |
sigma |
a list with the values of the variance-covariance components with one list element for each random effect. |
sigma_scaled |
a list with the values of the scaled variance-covariance components with one list element for each random effect. |
sigmaSE |
Hessian matrix containing the variance-covariance for the variance components. SE's can be obtained taking the square root of the diagonal values of the Hessian. |
Beta |
a data frame for trait BLUEs (fixed effects). |
VarBeta |
a variance-covariance matrix for trait BLUEs |
U |
a list (one element for each random effect) with a data frame for trait BLUPs. |
VarU |
a list (one element for each random effect) with the variance-covariance matrix for trait BLUPs. |
PevU |
a list (one element for each random effect) with the predicted error variance matrix for trait BLUPs. |
fitted |
Fitted values y.hat=XB |
residuals |
Residual values e = Y - XB |
AIC |
Akaike information criterion |
BIC |
Bayesian information criterion |
convergence |
a TRUE/FALSE statement indicating if the model converged. |
monitor |
The values of log-likelihood and variance-covariance components across iterations during the REML estimation. |
scores |
marker scores (-log_(10)p) for the traits |
method |
The method for extimation of variance components specified by the user. |
constraints |
contraints used in the mixed models for the random effects. |
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G. Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 2016, 11(6): doi:10.1371/journal.pone.0156744
Covarrubias-Pazaran G. 2018. Software update: Moving the R package sommer to multivariate mixed models for genome-assisted prediction. doi: https://doi.org/10.1101/354639
Bernardo Rex. 2010. Breeding for quantitative traits in plants. Second edition. Stemma Press. 390 pp.
Gilmour et al. 1995. Average Information REML: An efficient algorithm for variance parameter estimation in linear mixed models. Biometrics 51(4):1440-1450.
Kang et al. 2008. Efficient control of population structure in model organism association mapping. Genetics 178:1709-1723.
Lee, D.-J., Durban, M., and Eilers, P.H.C. (2013). Efficient two-dimensional smoothing with P-spline ANOVA mixed models and nested bases. Computational Statistics and Data Analysis, 61, 22 - 37.
Lee et al. 2015. MTG2: An efficient algorithm for multivariate linear mixed model analysis based on genomic information. Cold Spring Harbor. doi: http://dx.doi.org/10.1101/027201.
Maier et al. 2015. Joint analysis of psychiatric disorders increases accuracy of risk prediction for schizophrenia, bipolar disorder, and major depressive disorder. Am J Hum Genet; 96(2):283-294.
Rodriguez-Alvarez, Maria Xose, et al. Correcting for spatial heterogeneity in plant breeding experiments with P-splines. Spatial Statistics 23 (2018): 52-71.
Searle. 1993. Applying the EM algorithm to calculating ML and REML estimates of variance components. Paper invited for the 1993 American Statistical Association Meeting, San Francisco.
Yu et al. 2006. A unified mixed-model method for association mapping that accounts for multiple levels of relatedness. Genetics 38:203-208.
Tunnicliffe W. 1989. On the use of marginal likelihood in time series model estimation. JRSS 51(1):15-27.
Zhang et al. 2010. Mixed linear model approach adapted for genome-wide association studies. Nat. Genet. 42:355-360.
####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples using #### command + shift + C |OR| control + shift + C ####=========================================#### #####========================================#### ##### potato example #####========================================#### # # data(DT_polyploid, package="enhancer") # DT <- DT_polyploid # GT <- GT_polyploid # MP <- MP_polyploid # ####=========================================#### # ####### convert markers to numeric format # ####=========================================#### # numo <- atcg1234(data=GT, ploidy=4); # numo$M[1:5,1:5]; # numo$ref.allele[,1:5] # # ###=========================================#### # ###### plants with both genotypes and phenotypes # ###=========================================#### # common <- intersect(DT$Name,rownames(numo$M)) # # ###=========================================#### # ### get the markers and phenotypes for such inds # ###=========================================#### # marks <- numo$M[common,]; marks[1:5,1:5] # DT2 <- DT[match(common,DT$Name),]; # DT2 <- as.data.frame(DT2) # DT2[1:5,] # # ###=========================================#### # ###### Additive relationship matrix, specify ploidy # ###=========================================#### # A <- A.mat(marks) # ###=========================================#### # ### run it as GWAS model # ###=========================================#### # ans2 <- GWAS(tuber_shape~1, # random=~vsr(Name,Gu=A), # rcov=~units, # gTerm = "u:Name", # M=marks, data=DT2) # plot(ans2$scores[,1])####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples using #### command + shift + C |OR| control + shift + C ####=========================================#### #####========================================#### ##### potato example #####========================================#### # # data(DT_polyploid, package="enhancer") # DT <- DT_polyploid # GT <- GT_polyploid # MP <- MP_polyploid # ####=========================================#### # ####### convert markers to numeric format # ####=========================================#### # numo <- atcg1234(data=GT, ploidy=4); # numo$M[1:5,1:5]; # numo$ref.allele[,1:5] # # ###=========================================#### # ###### plants with both genotypes and phenotypes # ###=========================================#### # common <- intersect(DT$Name,rownames(numo$M)) # # ###=========================================#### # ### get the markers and phenotypes for such inds # ###=========================================#### # marks <- numo$M[common,]; marks[1:5,1:5] # DT2 <- DT[match(common,DT$Name),]; # DT2 <- as.data.frame(DT2) # DT2[1:5,] # # ###=========================================#### # ###### Additive relationship matrix, specify ploidy # ###=========================================#### # A <- A.mat(marks) # ###=========================================#### # ### run it as GWAS model # ###=========================================#### # ans2 <- GWAS(tuber_shape~1, # random=~vsr(Name,Gu=A), # rcov=~units, # gTerm = "u:Name", # M=marks, data=DT2) # plot(ans2$scores[,1])
Given a matrix A and a matrix G returns a H matrix with the C++ Armadillo library.
H.mat(A, G, tau = 1, omega = 1, tolparinv=1e-6)H.mat(A, G, tau = 1, omega = 1, tolparinv=1e-6)
A |
Additive relationship matrix based on pedigree. |
G |
Additive relationship matrix based on marker data. |
tau |
As described by Martini et al. (2018). |
omega |
As described by Martini et al. (2018). |
tolparinv |
Tolerance parameter for matrix inverse used when singularities are encountered in the estimation procedure. |
See references
H Matrix with the relationship between the individuals based on pedigree and corrected by molecular information
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
Martini, J. W., Schrauf, M. F., Garcia-Baccino, C. A., Pimentel, E. C., Munilla, S., Rogberg-Munoz, A., ... & Simianer, H. (2018). The effect of the H-1 scaling factors tau and omega on the structure of H in the single-step procedure. Genetics Selection Evolution, 50(1), 16.
####=========================================#### ####random population of 200 lines with 1000 markers ####=========================================#### M <- matrix(rep(0,200*1000),200,1000) for (i in 1:200) { M[i,] <- sample(c(-1,0,0,1), size=1000, replace=TRUE) } rownames(M) <- 1:nrow(M) v <- sample(1:nrow(M),100) M2 <- M[v,] A <- A.mat(M) # assume this is a pedigree-based matrix for the sake of example G <- A.mat(M2) H <- H.mat(A,G) # colfunc <- colorRampPalette(c("steelblue4","springgreen","yellow")) # hv <- heatmap(H[1:15,1:15], col = colfunc(100),Colv = "Rowv")####=========================================#### ####random population of 200 lines with 1000 markers ####=========================================#### M <- matrix(rep(0,200*1000),200,1000) for (i in 1:200) { M[i,] <- sample(c(-1,0,0,1), size=1000, replace=TRUE) } rownames(M) <- 1:nrow(M) v <- sample(1:nrow(M),100) M2 <- M[v,] A <- A.mat(M) # assume this is a pedigree-based matrix for the sake of example G <- A.mat(M2) H <- H.mat(A,G) # colfunc <- colorRampPalette(c("steelblue4","springgreen","yellow")) # hv <- heatmap(H[1:15,1:15], col = colfunc(100),Colv = "Rowv")
Identity covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
ism(x)ism(x)
x |
Factor, character vector, numeric design, or matrix defining covariance levels. |
ism returns . It has no covariance-shape parameters; the only unknown covariance scale is the supplied by vsm. It is commonly used as the final term of vsm to indicate an independent main effect.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(ism(id)) vsm(dsm(environment), ism(genotype)) ## End(Not run)## Not run: vsm(ism(id)) vsm(dsm(environment), ism(genotype)) ## End(Not run)
Reconstructs the normalized loadings matrix and specific variances of a
fam() or rrm() covariance-shaping factor fitted inside
vsm(), on the same scale as the fitted covariance matrix returned in
object$theta.
loadings_mmes(object, term = NULL, varianceScale=TRUE, rotation=TRUE)loadings_mmes(object, term = NULL, varianceScale=TRUE, rotation=TRUE)
object |
a fitted model of class |
term |
character name of the random term (matching a name in
|
varianceScale |
Whether to return loadings multiplied by
|
rotation |
a logical value to indicate if loadings should be rotated by its singular vectors. |
fam()/rrm() remove their otherwise redundant internal scale so
that vsm() owns the single overall variance; the loadings and specific
variances reported by loadings_mmes are re-normalized so that
reproduces object$theta[[term]] exactly when
varianceScale=FALSE, where is
object$covPar[[term]][1]. With varianceScale=TRUE, the
returned loadings crossproduct plus the diagonal of the returned specific
variances directly reproduces that covariance.
A list containing:
a levels-by-factor matrix .
a named vector of specific variances (identically
zero for every level in a rrm() term).
the fitted overall variance scale.
"fa" or "rr".
the resolved term name.
scores_mmes, fam, rrm, vsm, mmes.
## Not run: mix <- mmes(BLUEs ~ trial, random = ~ vsm(fam(trial, 2), ism(genotype)), rcov = ~ units, data = dt) loadings_mmes(mix) ## End(Not run)## Not run: mix <- mmes(BLUEs ~ trial, random = ~ vsm(fam(trial, 2), ism(genotype)), rcov = ~ units, data = dt) loadings_mmes(mix) ## End(Not run)
Moving-average covariance structures of order one or two. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
mam(x, order = 1L, theta = NULL, fixed = NULL) ma1m(x, theta = 0.15, fixed = FALSE) ma2m(x, theta = c(0.15, 0.05), fixed = NULL)mam(x, order = 1L, theta = NULL, fixed = NULL) ma1m(x, theta = 0.15, fixed = FALSE) ma2m(x, theta = c(0.15, 0.05), fixed = NULL)
x |
Ordered factor defining covariance levels. |
order |
Moving-average order; currently 1 or 2. |
theta |
Starting MA polynomial coefficients. Defaults to 0.15 for each order. |
fixed |
Logical vector with one value per MA coefficient. |
Using the conventional polynomial , the autocovariance at lag is proportional to with . The covariance is normalized to correlation scale and is zero beyond lag . Invertibility of the MA polynomial is not required merely to define this covariance matrix. ma1m and ma2m are convenience wrappers.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(ma1m(time), ism(id)) vsm(ma2m(time), ism(id)) ## End(Not run)## Not run: vsm(ma1m(time), ism(id)) vsm(ma2m(time), ism(id)) ## End(Not run)
Matern spatial covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
maternm(x, range = NULL, nu = 0.5, fixed = c(FALSE, FALSE), distance = NULL, anisotropy = c("none", "geometric"), angle = pi/2, ratio = 1.5)maternm(x, range = NULL, nu = 0.5, fixed = c(FALSE, FALSE), distance = NULL, anisotropy = c("none", "geometric"), angle = pi/2, ratio = 1.5)
x |
Numeric coordinate vector or matrix/data frame whose rows give spatial coordinates. |
range |
Positive starting range parameter. If NULL, the median positive pairwise distance is used. |
nu |
Positive starting Matern smoothness parameter. |
fixed |
Logical of length one or two (range, nu), or four with geometric anisotropy (range, nu, angle, ratio); length one is recycled. |
distance |
Optional finite symmetric q by q distance matrix with zero diagonal, aligned to the unique spatial locations. |
anisotropy |
|
angle |
Starting anisotropy angle in (0, pi). |
ratio |
Starting positive anisotropy ratio. |
For distance , the correlation is
where is range. Both range and smoothness are positive and are optimized on log scales. The implementation uses the generic R evaluator and central factor-level numerical derivatives. Repeated coordinate rows are mapped to the same covariance level.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(maternm(cbind(xcoord,ycoord)), ism(genotype)) vsm(maternm(time), ism(id)) ## End(Not run)## Not run: vsm(maternm(cbind(xcoord,ycoord)), ism(genotype)) vsm(maternm(time), ism(id)) ## End(Not run)
Back-transforms the BLUPs of a random term fitted with a genomic relationship
matrix (GBLUP) into BLUPs of marker effects, optionally with standard errors
and back-solved GWAS-type tests. This is the post-fit equivalent of ASReml's
mef argument and does not require refitting the model.
meffects_mmes(object, term, M, method = c("A.mat", "custom"), min.MAF = 0, Z = NULL, scale = NULL, blend = 0, Gu = NULL, se = FALSE, chunk = 1000)meffects_mmes(object, term, M, method = c("A.mat", "custom"), min.MAF = 0, Z = NULL, scale = NULL, blend = 0, Gu = NULL, se = FALSE, chunk = 1000)
object |
A fitted |
term |
Name (as in |
M |
Marker matrix (individuals by markers, coded -1/0/1 as for
|
method |
|
min.MAF |
The |
Z |
For |
scale |
For |
blend |
|
Gu |
Optional relationship matrix (or inverse, with |
se |
If |
chunk |
Number of markers processed per block when |
If the fitted relationship matrix is , the
BLUP of the marker effects is
using the same as the fit, so
(exactly when ). For structured terms such as
vsm(dsm(env), ism(id), Gu=Gi) effects are returned per coordinate
(environment, trait, ...).
With se=TRUE, following Gualdron-Duarte et al. (2014),
where is the variance of the coordinate and the
prediction error covariance of the term; gives
back-solved GWAS tests. Only diagonal elements are formed: the
part uses solves with the stored coefficient matrix in blocks of chunk
markers. The cost grows as for m markers and n individuals.
The rebuild of requires the data used in the original call; supply
Gu otherwise. Markers removed by the filters are returned as NA.
A data frame with columns marker, coordinate (structured
terms only), effect and, if se=TRUE, se, z and
p.value. Attributes scale and markersKept.
Gualdron-Duarte JL, Cantet RJC, Bates RO, Ernst CW, Raney NE, Steibel JP (2014). Rapid screening for phenotype-genotype associations by linear transformations of genomic evaluations. BMC Bioinformatics 15: 246.
set.seed(7) M <- matrix(sample(c(-1, 0, 1), 40 * 80, TRUE), 40) rownames(M) <- paste0("g", 1:40); colnames(M) <- paste0("snp", 1:80) G <- 0.95 * A.mat(M) + 0.05 * diag(40) Gi <- solve(G); attr(Gi, "inverse") <- TRUE d <- data.frame(id = factor(rep(rownames(M), each = 2), levels = rownames(M))) d$y <- rnorm(80) fit <- mmes(y ~ 1, random = ~ vsm(ism(id), Gu = Gi), data = d, verbose = FALSE) head(meffects_mmes(fit, 1, M, blend = 0.05, se = TRUE))set.seed(7) M <- matrix(sample(c(-1, 0, 1), 40 * 80, TRUE), 40) rownames(M) <- paste0("g", 1:40); colnames(M) <- paste0("snp", 1:80) G <- 0.95 * A.mat(M) + 0.05 * diag(40) Gi <- solve(G); attr(Gi, "inverse") <- TRUE d <- data.frame(id = factor(rep(rownames(M), each = 2), levels = rownames(M))) d$y <- rnorm(80) fit <- mmes(y ~ 1, random = ~ vsm(ism(id), Gu = Gi), data = d, verbose = FALSE) head(meffects_mmes(fit, 1, M, blend = 0.05, se = TRUE))
Exponential, power, gaussian, spherical and circular correlation structures
computed from distances between locations, isotropic or anisotropic. The
returned dimensionless covariance shape is intended for use inside
vsm, which supplies the single overall variance scale.
metricm(x, model = c("exponential", "power", "gaussian", "spherical", "circular"), range = NULL, rho = NULL, anisotropy = c("none", "product", "geometric"), angle = pi/2, ratio = 1.5, metric = c("euclidean", "manhattan"), distance = NULL, fixed = NULL)metricm(x, model = c("exponential", "power", "gaussian", "spherical", "circular"), range = NULL, rho = NULL, anisotropy = c("none", "product", "geometric"), angle = pi/2, ratio = 1.5, metric = c("euclidean", "manhattan"), distance = NULL, fixed = NULL)
x |
Numeric coordinate vector (1-D) or matrix/data frame whose rows give coordinates. Repeated coordinates share one covariance level. |
model |
Correlation function, see Details. |
range |
Starting range |
rho |
Starting correlation per unit distance for |
anisotropy |
|
angle |
Starting anisotropy angle in (0, pi). |
ratio |
Starting positive anisotropy ratio. |
metric |
Distance metric for isotropic models; |
distance |
Optional symmetric q by q distance matrix with zero diagonal, aligned to the unique locations (isotropic models only). |
fixed |
Logical vector, one value per parameter (in the order range/rho, then angle and ratio), recycled if of length one. |
With :
model |
|
validity | ASReml |
| exponential | |
any dimension | exp, iexp |
| power | |
any dimension | exp, iexp (same parameterization) |
| gaussian | |
any dimension | gau, igau |
| spherical | for , else 0 |
up to 3-D | isp |
| circular | for , else 0 |
up to 2-D | cir
|
Product anisotropy (exponential, power and gaussian) corresponds to ASReml
aexp/agau; geometric anisotropy corresponds to ASReml's
anisotropic Matern and is also available in maternm. The power
model is the exponential model with , and the
exponential model equals maternm(nu=0.5).
Ranges and ratios are optimized on log scales, correlations and angles through
bounded logits, with analytic derivatives. The structure is dense over the q
locations, so it is intended for up to a few thousand locations. On a complete
row-by-column grid, product anisotropy is a Kronecker product of two 1-D
structures; vsm(metricm(row, "power"), metricm(col, "power"), ism(units))
fits the same model while keeping the compact grid engine. The gaussian model
is nearly singular for close locations; keep a residual (nugget) term. With
geometric anisotropy the angle is not identifiable when the ratio is close to
one, and the ratio can drift to extreme values when the data are isotropic.
A list with the incidence matrix Z and a CovarianceFactor descriptor covFactor, for use inside vsm.
set.seed(1) co <- cbind(x = runif(30, 0, 10), y = runif(30, 0, 10)) d <- data.frame(x = rep(co[, 1], each = 2), y = rep(co[, 2], each = 2), one = factor(1)) d$yield <- rnorm(60) fit <- mmes(yield ~ 1, random = ~ vsm(metricm(cbind(x, y), model = "power"), ism(one)), data = d, verbose = FALSE) covparams_mmes(fit)set.seed(1) co <- cbind(x = runif(30, 0, 10), y = runif(30, 0, 10)) d <- data.frame(x = rep(co[, 1], each = 2), y = rep(co[, 2], each = 2), one = factor(1)) d$yield <- rnorm(60) fit <- mmes(yield ~ 1, random = ~ vsm(metricm(cbind(x, y), model = "power"), ism(one)), data = d, verbose = FALSE) covparams_mmes(fit)
Generate a Factorial Grid of MME Workloads
mme_workload_grid( structures = c("ar1", "us", "diag"), n_ind = c(40L, 100L), n_levels = c(4L, 10L), relationships = c("none", "dense"), reml = TRUE, computeCi = 0L )mme_workload_grid( structures = c("ar1", "us", "diag"), n_ind = c(40L, 100L), n_levels = c(4L, 10L), relationships = c("none", "dense"), reml = TRUE, computeCi = 0L )
structures |
Vector of covariance structures to test. |
n_ind |
Vector of individual counts. |
n_levels |
Vector of factor level counts. |
relationships |
Vector of relationship types. |
reml |
Logical; whether to fit by REML. |
computeCi |
Vector of computeCi modes. |
A named list of mme_workload objects.
THIS FUNCTION HAS BEEN DEPRECATD PLEASE EXPLORE mmes. The mmer
function uses the Direct-Inversion Newton-Raphson or Average Information coded in
C++ using the Armadillo library to optimize dense matrix operations common in
genomic selection models. These algorithms are intended to be used for
problems of the type c > r (more coefficients to estimate than records in the
dataset) and/or dense matrices. For problems with sparse data, or problems of
the type r > c (more records in the dataset than coefficients to estimate), the
MME-based algorithm in the mmes function is faster and we recommend
to shift to use that function.
mmer(fixed, random, rcov, data, weights, W, nIters=20, tolParConvLL = 1e-03, tolParInv = 1e-06, init=NULL, constraints=NULL,method="NR", getPEV=TRUE, naMethodX="exclude", naMethodY="exclude",returnParam=FALSE, dateWarning=TRUE,date.warning=TRUE,verbose=TRUE, reshapeOutput=TRUE, stepWeight=NULL, emWeight=NULL, contrasts=NULL)mmer(fixed, random, rcov, data, weights, W, nIters=20, tolParConvLL = 1e-03, tolParInv = 1e-06, init=NULL, constraints=NULL,method="NR", getPEV=TRUE, naMethodX="exclude", naMethodY="exclude",returnParam=FALSE, dateWarning=TRUE,date.warning=TRUE,verbose=TRUE, reshapeOutput=TRUE, stepWeight=NULL, emWeight=NULL, contrasts=NULL)
fixed |
A formula specifying the response variable(s) and fixed effects, e.g.: response ~ covariate for univariate models cbind(response.i,response.j) ~ covariate for multivariate models The |
random |
A formula specifying the name of the random effects, e.g. random= ~ genotype + year. Useful functions can be used to fit heterogeneous variances and other special models (see 'Special Functions' in the Details section for more information):
** ** **
|
rcov |
A formula specifying the name of the error term, e.g., rcov= ~ units. Special heterogeneous and special variance models and constraints for the residual part are the same used on the random term but the name of the random effect is always "units" which can be thought as a column with as many levels as rows in the data, e.g., rcov=~vsr(dsr(covariate),units) |
data |
A data frame containing the variables specified in the formulas for response, fixed, and random effects. |
weights |
Name of the covariate for weights. To be used for the product R = Wsi*R*Wsi, where * is the matrix product, Wsi is the square root of the inverse of W and R is the residual matrix. |
W |
Alternatively, instead of providing a vector of weights the user can specify an entire W matrix (e.g., when covariances exist). To be used first to produce Wis = solve(chol(W)), and then calculate R = Wsi*R*Wsi.t(), where * is the matrix product, and R is the residual matrix. Only one of the arguments weights or W should be used. If both are indicated W will be given the preference. |
nIters |
Maximum number of iterations allowed. |
tolParConvLL |
Convergence criteria for the change in log-likelihood. |
tolParInv |
Tolerance parameter for matrix inverse used when singularities are encountered in the estimation procedure. |
init |
Initial values for the variance components. By default this is NULL and initial values for the variance components are provided by the algorithm, but in case the user want to provide initial values for ALL var-cov components this argument is functional. It has to be provided as a list, where each list element corresponds to one random effect (1x1 matrix) and if multitrait model is pursued each element of the list is a matrix of variance covariance components among traits for such random effect. Initial values can also be provided in the Gti argument of the vsr function. Is highly encouraged to use the Gti and Gtc arguments of the vsr function instead of this argument, but these argument can be used to provide all initial values at once |
constraints |
When initial values are provided these have to be accompanied by their constraints. See the vsr function for more details on the constraints. Is highly encouraged to use the Gti and Gtc arguments of the vsr function instead of this argument but these argument can be used to provide all constraints at once. |
method |
This refers to the method or algorithm to be used for estimating variance components. Direct-inversion Newton-Raphson NR and Average Information AI (Tunnicliffe 1989; Gilmour et al. 1995; Lee et al. 2015). |
getPEV |
A TRUE/FALSE value indicating if the program should return the predicted error variance and variance for random effects. This option is provided since this can take a long time for certain models where p is > n by a big extent. |
naMethodX |
One of the two possible values; "include" or "exclude". If "include" is selected then the function will impute the X matrices for fixed effects with the median value. If "exclude" is selected it will get rid of all rows with missing values for the X (fixed) covariates. The default is "exclude". The "include" option should be used carefully. |
naMethodY |
One of the three possible values; "include", "include2" or "exclude" (default) to treat the observations in response variable to be used in the estimation of variance components. The first option "include" will impute the response variables for all rows with the median value, whereas "include2" imputes the responses only for rows where there is observation(s) for at least one of the responses (only available in the multi-response models). If "exclude" is selected (default) it will get rid of rows in response(s) where missing values are present for at least one of the responses. |
returnParam |
A TRUE/FALSE value to indicate if the program should return the parameters to be used for fitting the model instead of fitting the model. |
dateWarning |
A TRUE/FALSE value to indicate if the program should warn you when is time to update the sommer package. |
date.warning |
A TRUE/FALSE value to indicate if the program should warn you when is time to update the sommer package. This argument will be removed soon, just left for backcompatibility. |
verbose |
A TRUE/FALSE value to indicate if the program should return the progress of the iterative algorithm. |
reshapeOutput |
A TRUE/FALSE value to indicate if the output should be reshaped to be easier to interpret for the user, some information is missing from the multivariate models for an easy interpretation. |
stepWeight |
A vector of values (of length equal to the number of iterations) indicating the weight used to multiply the update (delta) for variance components at each iteration. If NULL the 1st iteration will be multiplied by 0.5, the 2nd by 0.7, and the rest by 0.9. This argument can help to avoid that variance components go outside the parameter space in the initial iterations which doesn't happen very often with the NR method but it can be detected by looking at the behavior of the likelihood. In that case you may want to give a smaller weight to the initial 8-10 iterations. |
emWeight |
A vector of values (of length equal to the number of iterations) indicating with values between 0 and 1 the weight assigned to the EM information matrix. And the values 1 - emWeight will be applied to the NR/AI information matrix to produce a joint information matrix. |
contrasts |
an optional list. See the contrasts.arg of model.matrix.default. |
The use of this function requires a good understanding of mixed models. Please review the 'sommer.quick.start' vignette and pay attention to details like format of your random and fixed variables (e.g. character and factor variables have different properties when returning BLUEs or BLUPs, please see the 'sommer.changes.and.faqs' vignette).
For tutorials on how to perform different analysis with sommer please look at the vignettes by typing in the terminal:
vignette("v1.sommer.quick.start")
vignette("v2.sommer.changes.and.faqs")
vignette("v3.sommer.qg")
vignette("v4.sommer.gxe")
Citation
Type citation("sommer") to know how to cite the sommer package in your publications.
Special variance structures
can be used to specify heterogeneous variance for the "y" covariate at specific levels of the covariate "x", e.g., random=~vsr(at(Location,c("A","B")),ID) fits a variance component for ID at levels A and B of the covariate Location.
can be used to specify a diagonal covariance structure for the "y" covariate for all levels of the covariate "x", e.g., random=~vsr(dsr(Location),ID) fits a variance component for ID at all levels of the covariate Location.
can be used to specify an unstructured covariance structure for the "y" covariate for all levels of the covariate "x", e.g., random=~vsr(usr(Location),ID) fits variance and covariance components for ID at all levels of the covariate Location.
vsr(overlay(...,rlist=NULL,prefix=NULL))
can be used to specify overlay of design matrices between consecutive random effects specified, e.g., random=~vsr(overlay(male,female)) overlays (overlaps) the incidence matrices for the male and female random effects to obtain a single variance component for both effects. The 'rlist' argument is a list with each element being a numeric value that multiplies the incidence matrix to be overlayed. See overlay for details.Can be combined with vsr().
can be used to fit a random regression model using a numerical variable x that marks the trayectory for the random effect y. The leg function can be combined with the special functions dsr, usr at and csr. For example random=~vsr(leg(x,1),y) or random=~vsr(usr(leg(x,1)),y).
vsr(x,Gtc=fcm(v))
can be used to constrain fixed effects in the multi-response mixed models. This is a vector that specifies if the fixed effect is to be estimated for such trait. For example fixed=cbind(response.i, response.j)~vsr(Rowf, Gtc=fcm(c(1,0))) means that the fixed effect Rowf should only be estimated for the first response and the second should only have the intercept.
gvsr(x,y)
can be used to fit variance and covariance parameters between two or more random effects. For example, indirect genetic effect models.
spl2Da(x.coord, y.coord, at.var, at.levels))
can be used to fit a 2-dimensional spline (e.g., spatial modeling) using coordinates x.coord and y.coord (in numeric class) assuming a single variance component. The 2D spline can be fitted at specific levels using the at.var and at.levels arguments. For example random=~spl2Da(x.coord=Row,y.coord=Range,at.var=FIELD).
spl2Db(x.coord, y.coord, at.var, at.levels))
can be used to fit a 2-dimensional spline (e.g., spatial modeling) using coordinates x.coord and y.coord (in numeric class) assuming multiple variance components. The 2D spline can be fitted at specific levels using the at.var and at.levels arguments. For example random=~spl2Db(x.coord=Row,y.coord=Range,at.var=FIELD).
S3 methods
S3 methods are available for some parameter extraction such as fitted.mmer, residuals.mmer, summary.mmer, randef, coef.mmer, anova.mmer, plot.mmer, and predict.mmer to obtain adjusted means. In addition, the vpredict function (replacement of the pin function) can be used to estimate standard errors for linear combinations of variance components (e.g., ratios like h2).
Additional Functions
Additional functions for genetic analysis have been included such as relationship matrix building (A.mat, D.mat, E.mat, H.mat), build a genotypic hybrid marker matrix (build.HMM), plot of genetic maps (map.plot), and manhattan plots (manhattan). If you need to build a pedigree-based relationship matrix use the getA function from the pedigreemm package.
Bug report and contact
If you have any technical questions or suggestions please post it in https://stackoverflow.com or https://stats.stackexchange.com
If you have any bug report please go to https://github.com/covaruber/sommer or send me an email to address it asap, just make sure you have read the vignettes carefully before sending your question.
Example Datasets
The package has been equiped with several datasets to learn how to use the sommer package:
* DT_halfdiallel, DT_fulldiallel and DT_mohring datasets have examples to fit half and full diallel designs.
* DT_h2 to calculate heritability
* DT_cornhybrids and DT_technow datasets to perform genomic prediction in hybrid single crosses
* DT_wheat dataset to do genomic prediction in single crosses in species displaying only additive effects.
* DT_cpdata dataset to fit genomic prediction models within a biparental population coming from 2 highly heterozygous parents including additive, dominance and epistatic effects.
* DT_polyploid to fit genomic prediction and GWAS analysis in polyploids.
* DT_gryphon data contains an example of an animal model including pedigree information.
* DT_btdata dataset contains an animal (birds) model.
* DT_legendre simulated dataset for random regression model.
* DT_sleepstudy dataset to know how to translate lme4 models to sommer models.
* DT_ige dataset to show how to fit indirect genetic effect models.
Models Enabled
For details about the models enabled and more information about the covariance structures please check the help page of the package (sommer).
If all parameters are correctly indicated the program will return a list with the following information:
Vi |
the inverse of the phenotypic variance matrix V^- = (ZGZ+R)^-1 |
P |
the projection matrix Vi - [Vi*(X*Vi*X)^-*Vi] |
sigma |
a list with the values of the variance-covariance components with one list element for each random effect. |
sigma_scaled |
a list with the values of the scaled variance-covariance components with one list element for each random effect. |
sigmaSE |
Hessian matrix containing the variance-covariance for the variance components. SE's can be obtained taking the square root of the diagonal values of the Hessian. |
Beta |
a data frame for trait BLUEs (fixed effects). |
VarBeta |
a variance-covariance matrix for trait BLUEs |
U |
a list (one element for each random effect) with a data frame for trait BLUPs. |
VarU |
a list (one element for each random effect) with the variance-covariance matrix for trait BLUPs. |
PevU |
a list (one element for each random effect) with the predicted error variance matrix for trait BLUPs. |
fitted |
Fitted values y.hat=XB |
residuals |
Residual values e = Y - XB |
AIC |
Akaike information criterion |
BIC |
Bayesian information criterion |
convergence |
a TRUE/FALSE statement indicating if the model converged. |
monitor |
The values of log-likelihood and variance-covariance components across iterations during the REML estimation. |
percChange |
The percent change of variance components across iterations. There should be one column less than the number of iterations. Calculated as percChange = ((x_i/x_i-1) - 1) * 100 where i is the ith iteration. |
dL |
The vector of first derivatives of the likelihood with respect to the ith variance-covariance component. |
dL2 |
The matrix of second derivatives of the likelihood with respect to the i.j th variance-covariance component. |
method |
The method for extimation of variance components specified by the user. |
call |
Formula for fixed, random and rcov used. |
constraints |
contraints used in the mixed models for the random effects. |
constraintsF |
contraints used in the mixed models for the fixed effects. |
data |
The dataset used in the model after removing missing records for the response variable. |
dataOriginal |
The original dataset used in the model. |
terms |
The name of terms for responses, fixed, random and residual effects in the model. |
termsN |
The number of effects associated to fixed, random and residual effects in the model. |
sigmaVector |
a vectorized version of the sigma element (variance-covariance components) to match easily the standard errors of the var-cov components stored in the element sigmaSE. |
reshapeOutput |
The value provided to the mmer function for the argument with the same name. |
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G. Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 2016, 11(6): doi:10.1371/journal.pone.0156744
Covarrubias-Pazaran G. 2018. Software update: Moving the R package sommer to multivariate mixed models for genome-assisted prediction. doi: https://doi.org/10.1101/354639
Bernardo Rex. 2010. Breeding for quantitative traits in plants. Second edition. Stemma Press. 390 pp.
Gilmour et al. 1995. Average Information REML: An efficient algorithm for variance parameter estimation in linear mixed models. Biometrics 51(4):1440-1450.
Kang et al. 2008. Efficient control of population structure in model organism association mapping. Genetics 178:1709-1723.
Lee, D.-J., Durban, M., and Eilers, P.H.C. (2013). Efficient two-dimensional smoothing with P-spline ANOVA mixed models and nested bases. Computational Statistics and Data Analysis, 61, 22 - 37.
Lee et al. 2015. MTG2: An efficient algorithm for multivariate linear mixed model analysis based on genomic information. Cold Spring Harbor. doi: http://dx.doi.org/10.1101/027201.
Maier et al. 2015. Joint analysis of psychiatric disorders increases accuracy of risk prediction for schizophrenia, bipolar disorder, and major depressive disorder. Am J Hum Genet; 96(2):283-294.
Rodriguez-Alvarez, Maria Xose, et al. Correcting for spatial heterogeneity in plant breeding experiments with P-splines. Spatial Statistics 23 (2018): 52-71.
Searle. 1993. Applying the EM algorithm to calculating ML and REML estimates of variance components. Paper invited for the 1993 American Statistical Association Meeting, San Francisco.
Yu et al. 2006. A unified mixed-model method for association mapping that accounts for multiple levels of relatedness. Genetics 38:203-208.
Tunnicliffe W. 1989. On the use of marginal likelihood in time series model estimation. JRSS 51(1):15-27.
Zhang et al. 2010. Mixed linear model approach adapted for genome-wide association studies. Nat. Genet. 42:355-360.
####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples ####=========================================#### ####=========================================#### #### EXAMPLES #### Different models with sommer ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example head(DT) ####=========================================#### #### Univariate homogeneous variance models #### ####=========================================#### ## Compound simmetry (CS) model ans1 <- mmer(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT) summary(ans1) ####===========================================#### #### Univariate heterogeneous variance models #### ####===========================================#### ## Compound simmetry (CS) + Diagonal (DIAG) model ans2 <- mmer(Yield~Env, random= ~Name + vsr(dsr(Env),Name), rcov= ~ vsr(dsr(Env),units), data=DT) summary(ans2) ####===========================================#### #### Univariate unstructured variance models #### ####===========================================#### ans3 <- mmer(Yield~Env, random=~ vsr(usr(Env),Name), rcov=~vsr(dsr(Env),units), data=DT) summary(ans3) ####==========================================#### #### Multivariate homogeneous variance models #### ####==========================================#### ## Multivariate Compound simmetry (CS) model DT$EnvName <- paste(DT$Env,DT$Name) ans4 <- mmer(cbind(Yield, Weight) ~ Env, random= ~ vsr(Name, Gtc = unsm(2)) + vsr(EnvName,Gtc = unsm(2)), rcov= ~ vsr(units, Gtc = unsm(2)), data=DT) summary(ans4) ####=============================================#### #### Multivariate heterogeneous variance models #### ####=============================================#### ## Multivariate Compound simmetry (CS) + Diagonal (DIAG) model ans5 <- mmer(cbind(Yield, Weight) ~ Env, random= ~ vsr(Name, Gtc = unsm(2)) + vsr(dsr(Env),Name, Gtc = unsm(2)), rcov= ~ vsr(dsr(Env),units, Gtc = unsm(2)), data=DT) summary(ans5) ####===========================================#### #### Multivariate unstructured variance models #### ####===========================================#### ans6 <- mmer(cbind(Yield, Weight) ~ Env, random= ~ vsr(usr(Env),Name, Gtc = unsm(2)), rcov= ~ vsr(dsr(Env),units, Gtc = unsm(2)), data=DT) summary(ans6) ####=========================================#### ####=========================================#### #### EXAMPLE SET 2 #### 2 variance components #### one random effect with variance covariance structure ####=========================================#### ####=========================================#### data("DT_cpdata", package="enhancer") DT <- DT_cpdata GT <- GT_cpdata MP <- MP_cpdata head(DT) GT[1:4,1:4] #### create the variance-covariance matrix A <- A.mat(GT) #### look at the data and fit the model mix1 <- mmer(Yield~1, random=~vsr(id, Gu=A) + Rowf, rcov=~units, data=DT) summary(mix1)$varcomp #### multi trait example mix2 <- mmer(cbind(Yield,color)~1, random = ~ vsr(id, Gu=A, Gtc = unsm(2)) + # unstructured at trait level vsr(Rowf, Gtc=diag(2)) + # diagonal structure at trait level vsr(Colf, Gtc=diag(2)), # diagonal structure at trait level rcov = ~ vsr(units, Gtc = unsm(2)), # unstructured at trait level data=DT) summary(mix2)####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples ####=========================================#### ####=========================================#### #### EXAMPLES #### Different models with sommer ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example head(DT) ####=========================================#### #### Univariate homogeneous variance models #### ####=========================================#### ## Compound simmetry (CS) model ans1 <- mmer(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT) summary(ans1) ####===========================================#### #### Univariate heterogeneous variance models #### ####===========================================#### ## Compound simmetry (CS) + Diagonal (DIAG) model ans2 <- mmer(Yield~Env, random= ~Name + vsr(dsr(Env),Name), rcov= ~ vsr(dsr(Env),units), data=DT) summary(ans2) ####===========================================#### #### Univariate unstructured variance models #### ####===========================================#### ans3 <- mmer(Yield~Env, random=~ vsr(usr(Env),Name), rcov=~vsr(dsr(Env),units), data=DT) summary(ans3) ####==========================================#### #### Multivariate homogeneous variance models #### ####==========================================#### ## Multivariate Compound simmetry (CS) model DT$EnvName <- paste(DT$Env,DT$Name) ans4 <- mmer(cbind(Yield, Weight) ~ Env, random= ~ vsr(Name, Gtc = unsm(2)) + vsr(EnvName,Gtc = unsm(2)), rcov= ~ vsr(units, Gtc = unsm(2)), data=DT) summary(ans4) ####=============================================#### #### Multivariate heterogeneous variance models #### ####=============================================#### ## Multivariate Compound simmetry (CS) + Diagonal (DIAG) model ans5 <- mmer(cbind(Yield, Weight) ~ Env, random= ~ vsr(Name, Gtc = unsm(2)) + vsr(dsr(Env),Name, Gtc = unsm(2)), rcov= ~ vsr(dsr(Env),units, Gtc = unsm(2)), data=DT) summary(ans5) ####===========================================#### #### Multivariate unstructured variance models #### ####===========================================#### ans6 <- mmer(cbind(Yield, Weight) ~ Env, random= ~ vsr(usr(Env),Name, Gtc = unsm(2)), rcov= ~ vsr(dsr(Env),units, Gtc = unsm(2)), data=DT) summary(ans6) ####=========================================#### ####=========================================#### #### EXAMPLE SET 2 #### 2 variance components #### one random effect with variance covariance structure ####=========================================#### ####=========================================#### data("DT_cpdata", package="enhancer") DT <- DT_cpdata GT <- GT_cpdata MP <- MP_cpdata head(DT) GT[1:4,1:4] #### create the variance-covariance matrix A <- A.mat(GT) #### look at the data and fit the model mix1 <- mmer(Yield~1, random=~vsr(id, Gu=A) + Rowf, rcov=~units, data=DT) summary(mix1)$varcomp #### multi trait example mix2 <- mmer(cbind(Yield,color)~1, random = ~ vsr(id, Gu=A, Gtc = unsm(2)) + # unstructured at trait level vsr(Rowf, Gtc=diag(2)) + # diagonal structure at trait level vsr(Colf, Gtc=diag(2)), # diagonal structure at trait level rcov = ~ vsr(units, Gtc = unsm(2)), # unstructured at trait level data=DT) summary(mix2)
Fits a generalized linear mixed model
coded in C++ using the Armadillo and Eigen libraries to optimize matrix
operations. Special covariance structures can be specified with the vsm()
function. Two engines are available: Henderson mixed model equations and direct
observation-space REML/ML, selected by henderson. The Henderson engine
supports ldlt, cholmod, and pcg solvers. Both CPU and
optional CUDA dense kernels use the same Henderson algorithm.
mmes(fixed, random, rcov, data, W, weights=NULL, nIters=30, tolParConvLL=1e-04, tolParConvNorm=1e-04, tolParInv=1e-06, naMethodX="exclude", naMethodY="exclude", naMethodRandom="exclude", naMethodR="exclude", returnParam=FALSE, dateWarning=TRUE, verbose=TRUE, stepWeight=NULL, blend=c("em", "pxem"), blendWeight=NULL, contrasts=NULL, getPEV=TRUE, henderson=TRUE, computeCi=0, solver="auto", REML=TRUE, vcc=NULL, family=stats::gaussian(), pqlControl=list(), solveOnly=FALSE, covPar=NULL, blasThreads=NULL, engine=NULL, ..., .internal=NULL)mmes(fixed, random, rcov, data, W, weights=NULL, nIters=30, tolParConvLL=1e-04, tolParConvNorm=1e-04, tolParInv=1e-06, naMethodX="exclude", naMethodY="exclude", naMethodRandom="exclude", naMethodR="exclude", returnParam=FALSE, dateWarning=TRUE, verbose=TRUE, stepWeight=NULL, blend=c("em", "pxem"), blendWeight=NULL, contrasts=NULL, getPEV=TRUE, henderson=TRUE, computeCi=0, solver="auto", REML=TRUE, vcc=NULL, family=stats::gaussian(), pqlControl=list(), solveOnly=FALSE, covPar=NULL, blasThreads=NULL, engine=NULL, ..., .internal=NULL)
fixed |
A formula specifying the response variable(s) and fixed effects, i.e: response ~ covariate |
random |
A formula specifying the random effects, e.g.,
random = ~ genotype + year. A simple random term that is not wrapped
in The
where Within
fits heterogeneous variances across
specifies an arbitrary Kronecker product of covariance structures before the
relationship matrix for Covariance constructors currently available include:
Design-matrix utilities such as See A single relationship term may request Lee–van der Werf rotation with
|
rcov |
A formula specifying the residual covariance structure. The default is rcov = ~ units, which fits a homogeneous residual variance. Structured residual covariance is specified with the same
The final term is normally
fits heterogeneous residual variances across environments, while
fits a separable row-by-column AR1 residual covariance, with one correlation per direction shared by every other Kronecker factor. For section-specific variances and correlations, use
(see Residual covariance factors must identify exactly one covariance-product
coordinate for each observation. Residual pairing key (multi-trait models). For a long-format
multi-trait model the residual must know which records belong to the same
experimental unit. With
where As with random effects, See |
data |
Optional data frame containing variables used by the model.
Model expressions are evaluated using normal R scoping rules: variables are first
sought in Observation-level variables used by the response, fixed effects, random effects,
and residual covariance specification must nevertheless have compatible lengths.
Internally, |
W |
Weights matrix (e.g., when covariance among plots exist). Internally W is squared and inverted as Wsi = solve(chol(W)), then the residual matrix is calculated as R = Wsi*O*Wsi.t(), where * is the matrix product, and O is the original residual matrix. Weights can be combined with any residual structure, including Kronecker (multi-trait) residuals. |
weights |
Optional one-sided formula describing independent row blocks
of the supplied |
nIters |
Maximum number of iterations allowed. |
tolParConvLL |
Convergence criteria based in the change of log-likelihood between iteration i and i-1. |
tolParConvNorm |
When using the Henderson method this argument is the convergence criteria based in the norm proposed by Jensen, Madsen and Thompson (1997): e1 = || InfMatInv.diag()/sqrt(N) * dLu || where InfMatInv.diag() is the diagonal of the inverse of the information matrix, N is the total number of variance components, and dLu is the vector of first derivatives. |
tolParInv |
Tolerance parameter for matrix inverse used when singularities are encountered in the estimation procedure. By default the value is 1e-06. This parameter should be fairly small because the it is used to bend matrices like the information matrix in the henderson algorithm or the coefficient matrix when it is not positive-definite. |
naMethodX |
Missing-data policy for variables entering the fixed-effect
design matrix. The default, |
naMethodY |
Missing-data policy for the response variable(s). The default,
|
naMethodRandom |
Missing-data policy for observation-level variables used to
construct random-effect terms. The default is |
naMethodR |
Missing-data policy for observation-level variables used to define
the residual covariance structure. The default is |
returnParam |
A TRUE/FALSE value to indicate if the program should return the parameters to be used for fitting the model instead of fitting the model. |
dateWarning |
A TRUE/FALSE value to indicate if the program should warn you when is time to update the sommer package. |
verbose |
A TRUE/FALSE value indicating whether to print iteration progress. Fits share a compact table with likelihood, update method, recovery policy, safeguards, and elapsed seconds. See Iteration output. |
stepWeight |
A positive scalar or vector recycled to the number of
iterations. It scales each covariance-parameter proposal; values below 1
damp the step. With positive blending weights the default is 1,
so proposals at |
blend |
Recovery or direction-blending method. With omitted
|
blendWeight |
A finite scalar or vector recycled to |
contrasts |
an optional list. See the contrasts.arg of model.matrix.default. |
getPEV |
A logical value indicating whether prediction error variance
results should be organized and returned when they are requested through
|
henderson |
A logical value indicating which REML engine to use. |
computeCi |
An integer indicating whether post-fit prediction error variance information
and/or the inverse of the mixed model coefficient matrix should be computed when the
Henderson algorithm is used (
With
For large models, |
solver |
Linear-system solver used by the Henderson implementation.
|
REML |
Logical, |
vcc |
Optional data frame of equality/scaling constraints between
covariance parameters (columns |
family |
A Long-format multi-trait data with a different family per trait are fitted by
supplying |
pqlControl |
A named list controlling non-Gaussian PQL fits. Supported
entries are |
solveOnly |
If |
covPar |
Known covariance parameters for |
blasThreads |
Optional BLAS thread limit for the duration of this call:
|
engine |
Optional structured control object returned by
|
... |
Additional solver options or legacy arguments (such as |
.internal |
Internal parameter list reserved for nested recursive calls (e.g. PQL inner fits). |
EM, PX-GEM and AI direction blending
The REML E-step includes posterior uncertainty in both fixed coefficients and random effects. ML conditions on current GLS fixed effects. Closed-form M-steps update covariance scales and eligible fully free diagonal or unstructured random terms from their posterior moments. Under Henderson fitting, complete, fully free unstructured residual blocks and diagonal residual factors also have closed-form updates. Models without a closed-form joint M-step, including free structured covariance shapes, reduced-rank loadings, and equality or ratio constraints or incomplete unstructured residual blocks, use the same auxiliary objective with a numerical generalized EM M-step. Every accepted numerical M-step must increase Q, even if the numerical optimizer stops before convergence.
With blend="pxem", each random term is expanded as
, with and expanded covariance
. The E-step starts at .
An ordinary EM/GEM proposal seeds joint numerical optimization over the
original admissible covariance parameters and .
The expanded residual objective includes fixed/random and cross-random
posterior uncertainty. Reduction returns and resets
expansion to identity for the next E-step. Fixed parameters, equality/ratio
constraints, and scale floors apply to the reduced parameters throughout,
not through post-hoc clipping. All covariance families supported by ordinary
EM/GEM, including latent reduced-rank terms, can use this scalar expansion.
Residual-only models use the ordinary EM/GEM update because there is no
random term to expand.
This implementation is PX-GEM: every accepted expanded M-step increases Q, but numerical optimization need not reach its maximum. It is not a full matrix expansion or a claim to reproduce another package's PX algorithm. The following coefficient-cache details describe the Henderson implementation. Non-reduced-rank models cache blockwise quadratic expansion moments. Reduced-rank models cache exact quadratic posterior moments in a normalized loading/design basis once per E-step, including cross-term uncertainty. Auxiliary-objective probes reuse these moments without coefficient solves. Both use existing coefficient-solver paths, but extra contractions can increase memory and runtime; fewer iterations do not guarantee faster fitting.
The engine blends the selected EM-type and AI directions in working covariance coordinates,
not their information matrices. Mixed proposals retain descriptor-defined
working-coordinate trust caps. Mixed or damped proposals use observed
likelihood backtracking; a rejected mixture also tries the selected EM-type
direction. PX-GEM proposals always use likelihood backtracking and may
fall back to their ordinary EM/GEM seed if rejected.
Undamped closed-form EM steps evaluate their likelihood at the next E-step
without a duplicate trial fit. Fixed parameters, scale floors, and
vcc constraints remain in force. Numerically unfactorizable trial
fits are rejected with a warning and recorded diagnostic reasons; unrelated
evaluation errors propagate.
Full Henderson EM or PX-GEM weights skip iterative scores and AI sensitivity solves. Zero weights
skip posterior-moment and M-step work. Exact final AI is still computed for
covariance-parameter standard errors. Non-reduced-rank AI directions, including
zero-weight iterations inside a blended schedule, use the native exact AI
trace and sensitivity kernels. Reduced-rank terms retain their shared latent
AI kernels. Accepted trial fits can supply the next zero-weight iteration's
likelihood, score, and information without another coefficient factorization.
Final exact inference reuses such a fit when available. Blending guards,
constraints, and likelihood backtracking remain active.
The blend diagnostics nativeAIEvaluations, latentAIEvaluations,
and acceptedAIFitReuses report this dispatch and reuse.
Random posterior moments reuse exact
Schur inverse blocks or selected-inverse contractions when available.
Structurally diagonal covariance updates request only diagonal moments.
Scalar residual updates use a trace identity that includes fixed-effect
uncertainty; scalar non-reduced-rank PX expansion moments reuse exact
coefficient contractions when their sparse products fit the memory budget.
Uncached contractions retain bounded exact panel solves as a fallback.
Structured residuals can still require dense observed-block moment matrices.
They obey denseMemoryMB; large blocks can require a larger budget.
PX-GEM additionally budgets expansion contractions and optimizer workspace.
For non-reduced-rank models, expansion-moment storage grows quadratically
with the number of random terms.
Reduced-rank moment-cache storage grows quadratically with the loading/design
basis size. latentMomentPreparations and latentMomentBases report
cache preparations and the largest basis size in engineDiagnostics$blend.
The same list reports randomMomentPairs,
randomOffDiagonalPairsSkipped, scalarResidualTraceSteps,
scalarResidualContractions, and momentPanelSolves.
Top-level engineDiagnostics counters emInverseTraceCalls,
emInverseTraceFallbackPanels, and emDesignTraceCalls distinguish
backend contractions from their uncached exact-panel fallbacks.
Direct observation-space EM
With henderson=FALSE, the same blend and blendWeight
controls select AI, EM/GEM, scalar PX-GEM, mixed directions, or exponential
tapers. Omitted weights select AI-first recovery; explicit zero weights disable
EM work and recovery. No Henderson coefficient solve is used.
Exact random sufficient statistics contract the cached observation kernels
with minus for REML or
for ML. Residual moments use the same observation order, weights,
and observed residual-block indices as direct likelihood assembly.
Zero-specific reduced-rank terms use nonsingular latent priors and
candidate-dependent loading maps, not inverses of singular random covariances.
PX objectives retain cross-term and fixed-effect posterior uncertainty.
Eligible scale, diagonal, and unstructured random M-steps are closed form.
Other direct updates, including structured or incomplete residual covariances,
custom covariance factors, partially fixed structures, and vcc constraints,
numerically increase Q. These are GEM, not a guarantee of global Q maximization.
ML profiles fixed effects inside the residual Q objective; REML integrates their
joint posterior uncertainty. Full EM weights compute no AI update solves.
Projected-score convergence checks and clean final AI inference remain active.
Full undamped EM proposals bypass AI trust caps but still pass covariance
validity and observed-likelihood checks. Accepted trials supply the next
iteration's likelihood state. Exact EM workspace obeys denseMemoryMB;
the estimate covers EM workspace, not all pre-existing direct-engine caches.
engineDiagnostics$direct records optimizer, stop reason, projected
score certificate, line-search halvings, aiUpdateSolves, and likelihood
evaluations. engineDiagnostics$blend records actual weights, Q gains,
closed-form/GEM seed counts, eStepEvaluations, numerical M-step
status/evaluation counts, PX expansions, and fallbacks. Q and expansion histories
describe proposals before outer backtracking; uncomputed Q gains and M-step
statuses are NA. The final evaluated iteration has no proposal.
Direct recovery uses the same poor-progress triggers and regularized-AI helper
as Henderson. Information reliability is tested after diagonal normalization,
so a small variance alone does not force recovery. Recovery attempts require
observed-likelihood gains above 1e-10 and resume AI after acceptance.
The common engineDiagnostics$recovery fields describe these attempts.
For PX-GEM, engineDiagnostics$blend includes pxEvaluations,
pxExpansionTerms, pxLogExpansion (random terms by iterations),
pxQGains (expanded Q improvement beyond the ordinary seed),
pxMstepConverged, pxMstepEvaluations, and pxEMFallbacks.
Expansion values and Q gains describe proposed updates, before likelihood
backtracking or fallback; the final iteration has no proposal.
The existing closedFormSteps, generalizedSteps, and numerical
M-step fields describe ordinary seeds. qGains includes the expanded
improvement when PX is selected.
All Henderson optimizer paths factor a full weight matrix in observation
order. This fixes a previous pure-AI ordering discrepancy for correlated
weights, ensuring that changing blendWeight does not change the
weighted model. Correlated-weight results can therefore differ from earlier
versions; diagonal-weight fits are unaffected by this correction.
Optional GPU kernels
CPU is the default. Set options(sommer.mme.gpu=TRUE) to request CUDA
kernels by default, or use engine=mmes_control(gpu=TRUE) for one fit.
Explicit gpu=FALSE controls override the global option. Package startup
checks accessible NVIDIA hardware before probing CUDA libraries and reports
whether GPU use is ready, libraries or a CUDA-enabled build are missing, or
device initialization failed. A compatible NVIDIA driver, CUDA runtime,
cuBLAS, cuSOLVER, and a CUDA-enabled sommer build are required.
On Linux, build with SOMMER_CUDA_HOME=/path/to/cuda R CMD INSTALL --preclean ..
CUDA libraries load dynamically, so the same build can fit on CPU without them.
Explicit GPU requests stop if unavailable; direct inversion and solveOnly
remain CPU-only. GPU use does not alter the existing solver="auto" policy.
Eligible dense Cholesky factorizations, triangular solves, and Schur products
can use CUDA. Sparse factorization, assembly, and remaining trace operations
remain on CPU. Small operations stay on CPU according to gpuMinSize.
The returned gpuDiagnostics contains enabled, minimumSize,
choleskyCalls, triangularSolveCalls, and productCalls;
zero counters mean no GPU kernels ran. Operands currently transfer per operation,
so GPU availability alone does not imply faster fitting.
Iteration output
With verbose=TRUE, mmes() prints an
iteration table with the same columns for ordinary AI, hybrid AI, reduced-rank
AI, explicit EM/PX-GEM blending, automatic recovery, and direct inversion.
Direct inversion reports policy="off" with unavailable safeguard fields.
The table uses compact
fixed-width fields and a single monotonic elapsed-time column, rather than
local clock time and process CPU time.
iterThe iteration number.
LogLikThe log likelihood at the current accepted parameter
values (restricted log likelihood when REML=TRUE).
deltaLLChange from the preceding printed accepted likelihood;
- on the first row.
updateThe selected proposal method: AI, hybrid-AI,
AI-reg (scaled, regularized AI), EM, or PXEM.
A mixture such as AI+EM:0.40 shows the
EM-type direction weight. Fallbacks show the method actually tried last.
A final row may report a selected method without taking another step.
policyauto:em or auto:pxem means AI-first
monitoring with that recovery method available. A recovery row instead names
its trigger: backtracking, low-gain, line-search, or
info-solve. The update column identifies the recovery method.
Subsequent AI rows return to the automatic policy label.
scheduled denotes an explicit positive blend weight, not automatic
recovery; off denotes a path or explicit zero weight with no automatic
recovery. A trigger names an attempted recovery, not proof that it succeeded;
consult engineDiagnostics$recovery for acceptance and stop reasons.
trustJoint proposal scaling due to trust caps and feasibility
bounds, separate from likelihood backtracking. A value of 1 means no
such shortening.
lineLikelihood line-search multiplier; 1 means no
halving. Standalone reduced-rank AI includes stepWeight in this field.
notPDThe one-based covariance structure indices whose proposed
updates failed the positive-definiteness check and required local fallback.
Multiple indices are comma-separated (e.g., 2,3); - means none
failed or this local-fallback diagnostic does not apply. Indices follow the
random terms, with the residual structure last. EM/PX and latent fitting use
candidate rejection rather than this local covariance repair.
time(s)Cumulative elapsed seconds since the optimizer started, including time spent on rejected trials. This is not process CPU time.
An unavailable or unattempted safeguard is printed as -, not a
successful multiplier. Ordinary AI reports the current proposal's trust cap
and the incoming accepted step's line search; standalone reduced-rank AI
reports incoming accepted scales. The EM/PX/automatic driver reports the
current row's outgoing attempted scales, after any recovery or fallback.
Detailed Q gains, step norms, exact blend weights, and numerical work counters
remain in the fit and engineDiagnostics; display formatting does not
change optimization or the existing diagnostic fields.
Legacy mmer() progress output and its emWeight argument retain
their existing interface and are separate from mmes() direction blending.
Likelihoods use six decimals, likelihood gains four, safeguard scales three,
and elapsed seconds two; scientific notation is used when needed to fit.
Stored estimates are not rounded; very small values may display as zero.
Evaluation environments and observation filtering
The current interface follows R-style model evaluation. Variables referenced by
fixed, random, and rcov may be supplied as columns of
data or resolved from the formula/calling environment. This makes it possible,
for example, to keep relationship matrices, external grouping variables, or spatial
coordinates outside the analysis data frame.
Missingness is handled through a common observation-selection mechanism. The response, fixed effects, random effects, and residual covariance specification are evaluated against the original observation set and their validity is combined into a single inclusion mask. The same retained rows are then used for the response vector, fixed-effect design matrix, random-effect design matrices, optional weight matrix, and residual covariance indexing. This avoids independently subsetting different parts of the mixed model.
The fitted object contains obsInfo, an observation-level audit table describing
the filtering process. It records the original row index, validity of the response,
fixed, random, and residual components, whether the observation was retained, and,
when applicable, the reason for exclusion. This can be useful for diagnosing model
specifications involving missing values.
Estimated marginal means
When the suggested emmeans package is installed, univariate mmes
fits can be supplied directly to emmeans::emmeans(). The resulting means
are population-level fixed-effect marginal means with covariance obtained from
the mixed-model equations. Inference uses asymptotic degrees of freedom
(df = Inf). Multivariate-response fits are not currently supported by
this interface.
Random and residual formulas are evaluated as R language objects rather than by splitting their textual representation at plus signs. Consequently, arithmetic or nested expressions inside model terms are not interpreted as separate top-level random or residual terms.
The use of this function requires a good understanding of mixed models. Please review the 'sommer.quick.start' vignette and pay attention to details like format of your random and fixed variables (e.g. character and factor variables have different properties when returning BLUEs or BLUPs).
For tutorials on how to perform different analysis with sommer please look at the vignettes by typing in the terminal:
vignette("v1.sommer.quick.start")
vignette("v2.sommer.changes.and.faqs")
vignette("v3.sommer.qg")
vignette("v4.sommer.gxe")
Citation
Type citation("sommer") to know how to cite the sommer package in your publications.
Special variance structures
can be used to specify heterogeneous variance for the "y" covariate at specific levels of the covariate "x", e.g., random=~vsm(at(Location,c("A","B")),ism(ID)) fits a variance component for ID at levels A and B of the covariate Location.
can be used to specify a diagonal covariance structure for the "y" covariate for all levels of the covariate "x", e.g., random=~vsm(dsm(Location),ism(ID)) fits a variance component for ID at all levels of the covariate Location.
can be used to specify an unstructured covariance structure for the "y" covariate for all levels of the covariate "x", e.g., random=~vsm(usm(Location),ism(ID)) fits variance and covariance components for ID at all levels of the covariate Location.
vsm(usm(rrmat(x,y,z,nPC)),ism(y))
can be used to specify an unstructured covariance structure for the "y" effect for all levels of the covariate "x", and a response variable "z", e.g., random=~vsm(rrmat(Location,ID,response, nPC=2),ism(ID)) fits a reduced-rank factor analytic covariance for ID at 2 principal components of the covariate Location.
vsm(ism(overlay(...,rlist=NULL,prefix=NULL)))
can be used to specify overlay of design matrices between consecutive random
effects specified, e.g., random=~vsm(ism(overlay(male,female))) overlays
(overlaps) the incidence matrices for the male and female random effects to obtain
a single variance component for both effects. The 'rlist' argument is a list with
each element being a numeric value that multiplies the incidence matrix to be
overlayed. See overlay for details.Can be combined with vsm().
can be used to create a reduced model matrix of an effect (x) assumed to be a
linear function of some feature matrix (M), e.g., random=~vsm(ism(redmm(x,M)))
creates an incidence matrix from a very large set of features (M) that belong
to the levels of x to create a reduced model matrix. See redmm
for details.Can be combined with vsm().
can be used to fit a random regression model using a numerical variable x
that marks the trayectory for the random effect y. The leg function can
be combined with the special functions dsm, usm at and csm.
For example random=~vsm(leg(x,1),ism(y)) or random=~vsm(usm(leg(x,1)),ism(y)).
spl2Dc(x.coord, y.coord, at.var, at.levels))
can be used to fit a 2-dimensional spline (e.g., spatial modeling) using
coordinates x.coord and y.coord (in numeric class) assuming
multiple variance components. The 2D spline can be fitted at specific
levels using the at.var and at.levels arguments. For example
random=~spl2Dc(x.coord=Row,y.coord=Range,at.var=FIELD).
Covariance between random effects
covm( vsm(ism(ran1)), vsm(ism(ran2)) )
can be used to specify covariance between two different random effects, e.g., random=~covm( vsm(ism(x1)), vsm(ism(x2)) ) where two random effects in their own vsm() structure are encapsulated. Only applies for simple random effects.
S3 methods
S3 methods are available for some parameter extraction such as
fitted.mmes, residuals.mmes, summary.mmes,
randef, coef.mmes, anova.mmes,
plot.mmes, and predict.mmes to obtain adjusted means.
In addition, the vpredict function (replacement of the pin
function) can be used to estimate standard errors for linear combinations of
variance components (e.g., ratios like h2). The r2 function calculates
reliability.
Additional Functions
Additional functions for genetic analysis have been included such as relationship
matrix building (A.mat, D.mat, E.mat,
H.mat), build a genotypic hybrid marker matrix (build.HMM),
plot of genetic maps (map.plot), and manhattan plots
(manhattan). If you need to build a pedigree-based relationship
matrix use the getA function from the pedigreemm package.
Bug report and contact
If you have any technical questions or suggestions please post it in https://stackoverflow.com or https://stats.stackexchange.com for the community to help you.
If you have any bug report please go to https://github.com/covaruber/sommer or send me an email to address it asap, just make sure you have read the vignettes carefully before sending your question. If you need professional consulting support visit https://covaruber.github.io/sommer/
Example Datasets
The package has been equiped with several datasets to learn how to use the sommer package:
* DT_halfdiallel, DT_fulldiallel and DT_mohring
datasets have examples to fit half and full diallel designs.
* DT_h2 to calculate heritability
* DT_cornhybrids and DT_technow datasets to perform
genomic prediction in hybrid single crosses
* DT_wheat dataset to do genomic prediction in single crosses in
species displaying only additive effects.
* DT_cpdata dataset to fit genomic prediction models within a
biparental population coming from 2 highly heterozygous parents including additive,
dominance and epistatic effects.
* DT_polyploid to fit genomic prediction and GWAS analysis in polyploids.
* DT_gryphon data contains an example of an animal model including
pedigree information.
* DT_btdata dataset contains an animal (birds) model.
* DT_legendre simulated dataset for random regression model.
* DT_sleepstudy dataset to know how to translate lme4 models to
sommer models.
* DT_ige dataset to show how to fit indirect genetic effect models.
Models Enabled
For details about the models enabled and more information about the covariance
structures please check the help page of the package (sommer).
If all parameters are correctly indicated the program will return a list with the following information:
data |
the dataset used in model fitting after application of the common observation mask. |
obsInfo |
an observation-level audit table describing the common missing-data filter. It includes the original row index, validity indicators for response, fixed, random, and residual model components, the final inclusion indicator, and the reason for exclusion when applicable. |
Dtable |
the table to be used for the predict function to help the program recognize the factors available. |
llik |
the vector of log-likelihoods across iterations |
b |
the vector of fixed effect. |
u |
the vector of random effect. |
bu |
the vector of fixed and random effects together. |
Ci |
the inverse of the coefficient matrix. |
Ci_11 |
the inverse of the coefficient matrix pertaining to the fixed effects. |
theta |
a list of estimated variance covariance matrices. Each element of the list corresponds to the different random and residual components |
covPar |
the fitted covariance parameters in their descriptor-defined reported coordinates. |
pcgMatrixFree |
logical indicating whether the matrix-free Kronecker PCG path was used during optimization. |
residualCovarianceCompact |
logical indicating that a complete, unweighted,
non-diagonal Kronecker residual covariance was evaluated directly from its
factors without materializing the full covariance matrix. In this case the
residual element of |
covParNative |
a data frame containing all fixed and estimated covariance
parameters in the native model-facing scale defined by each CovarianceFactor.
For example, |
covParNativeSE |
the native-scale covariance-parameter table augmented
with delta-method standard errors and Z ratios. This is the same result
returned by |
theta_se |
inverse of the information matrix. |
InfMat |
information matrix. |
monitor |
The values of the variance-covariance components across iterations during the REML estimation. |
AIC |
Akaike information criterion |
BIC |
Bayesian information criterion |
convergence |
a TRUE/FALSE statement indicating if the model converged. |
partitions |
a list where each element contains a matrix indicating where each random effect starts and ends. |
partitionsX |
a list where each element contains a matrix indicating where each fixed effect starts and ends. |
percDelta |
the matrix of percentage change in deltas (see tolParConvNorm argument). |
normMonitor |
the matrix of the three norms calculated (see tolParConvNorm argument). |
toBoundary |
the matrix of variance components that were forced to the boundary across iterations. |
Cchol |
the Cholesky decomposition of the coefficient matrix. |
y |
the response vector. |
W |
the column binded matrix W = [X Z] |
uList |
a list containing the BLUPs in data frame format where rows are levels of the random effects and column the different factors at which the random effect is fitted. This is specially useful for diagonal and unstructured models. |
uPevList |
a list containing the BLUPs in data frame format where rows are levels of the random effects and column the different factors at which the random effect is fitted. This is specially useful for diagonal and unstructured models. |
args |
the fixed, random and residual formulas from the mmes model. |
constraints |
The vector of constraints. |
Coded by Giovanny Covarrubias-Pazaran with contributions of Christelle Fernandez Camacho, Johan Aparicio-Arce, and Claudio Flavio 5.1 jaja (laughing in Spanish).
Covarrubias-Pazaran G. Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 2016, 11(6): doi:10.1371/journal.pone.0156744
Jensen, J., Mantysaari, E. A., Madsen, P., and Thompson, R. (1997). Residual maximum likelihood estimation of (co) variance components in multivariate mixed linear models using average information. Journal of the Indian Society of Agricultural Statistics, 49, 215-236.
Sanderson, C., & Curtin, R. (2025). Armadillo: An Efficient Framework for Numerical Linear Algebra. arXiv preprint arXiv:2502.03000.
Gilmour et al. 1995. Average Information REML: An efficient algorithm for variance parameter estimation in linear mixed models. Biometrics 51(4):1440-1450.
####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example head(DT) ####=========================================#### #### Univariate homogeneous variance models #### ####=========================================#### ## Compound simmetry (CS) model ans1 <- mmes(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT) summary(ans1) ## Known variances: solve the MME only (e.g. genetic evaluation) sol1 <- mmes(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT, solveOnly=TRUE, covPar=ans1) head(sol1$uList[[1]]) ####===========================================#### #### Univariate heterogeneous variance models #### ####===========================================#### DT=DT[with(DT, order(Env)), ] ## Compound simmetry (CS) + Diagonal (DIAG) model ans2 <- mmes(Yield~Env, random= ~Name + vsm(dsm(Env),ism(Name)), rcov= ~ dsumm(vsm(ism(units)), by=Env), data=DT) summary(ans2) ####===========================================#### #### Univariate unstructured variance models #### ####===========================================#### ans3 <- mmes(Yield~Env, random=~ vsm(usm(Env),ism(Name)), rcov= ~ dsumm(vsm(ism(units)), by=Env), data=DT) summary(ans3) ## simulated MET nInds=300 nMarks=1000 nEnvs=3 #random population of nInds lines with nMarks markers M <- matrix(rep(0,nInds*nMarks),nInds,nMarks) for (i in 1:nInds) { M[i,] <- ifelse(runif(nMarks)<0.5,-1,1) } # compute the relationship matrix MMT <- tcrossprod(M) m <- sum(diag(MMT))/nrow(MMT) MMT <- MMT/m MMT <- MMT + diag(1e-05, ncol(MMT), ncol(MMT)) # get phenotypes rg <- enhancer::simGECorMat(nEnvs, 1, mu=0.2, v=0.2) rg <- Matrix::nearPD(rg)$mat rg # desired genetic correlation u <- mvrnorm(n = nMarks, rep(0, nEnvs), Sigma=rg) # marker effects g <- crossprod(t(M),u) # genetic values h2 <- 0.2 #heritability envEffect <- rnorm(nEnvs, mean = abs(rnorm(1))) # environment means e <- mvrnorm(n = nInds, envEffect, Sigma=(1-h2)/h2*diag(diag(var(g)))) # errors p = g + e # phenotypes y <- as.vector(p) # phenotypes as vector env <- sort(rep(paste0("e",1:nEnvs), nrow(g))) # environment labels ind <- rep(paste0("i",1:nrow(g)), nEnvs ) # individuals labels colnames(MMT) <- rownames(MMT) <- paste0("i",1:nrow(g)) # assign dimnames MMTi <- solve(MMT + diag(1e-4,ncol(MMT),ncol(MMT))) MMTi[lower.tri(MMTi)] <- t(MMTi)[lower.tri(MMTi)] # fill the lower triangular MMTi <- as(as(as( MMTi, "dMatrix"), "generalMatrix"), "CsparseMatrix") attr(MMTi, 'inverse')=TRUE DT <- data.frame(ind=ind, env=env, y=y) # fit the models mixm2 <- mmes(y ~ env, random=~ vsm(dsm(env), ism(ind), Gu=MMTi), data=DT ) summary(mixm2)$varcomp####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example head(DT) ####=========================================#### #### Univariate homogeneous variance models #### ####=========================================#### ## Compound simmetry (CS) model ans1 <- mmes(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT) summary(ans1) ## Known variances: solve the MME only (e.g. genetic evaluation) sol1 <- mmes(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT, solveOnly=TRUE, covPar=ans1) head(sol1$uList[[1]]) ####===========================================#### #### Univariate heterogeneous variance models #### ####===========================================#### DT=DT[with(DT, order(Env)), ] ## Compound simmetry (CS) + Diagonal (DIAG) model ans2 <- mmes(Yield~Env, random= ~Name + vsm(dsm(Env),ism(Name)), rcov= ~ dsumm(vsm(ism(units)), by=Env), data=DT) summary(ans2) ####===========================================#### #### Univariate unstructured variance models #### ####===========================================#### ans3 <- mmes(Yield~Env, random=~ vsm(usm(Env),ism(Name)), rcov= ~ dsumm(vsm(ism(units)), by=Env), data=DT) summary(ans3) ## simulated MET nInds=300 nMarks=1000 nEnvs=3 #random population of nInds lines with nMarks markers M <- matrix(rep(0,nInds*nMarks),nInds,nMarks) for (i in 1:nInds) { M[i,] <- ifelse(runif(nMarks)<0.5,-1,1) } # compute the relationship matrix MMT <- tcrossprod(M) m <- sum(diag(MMT))/nrow(MMT) MMT <- MMT/m MMT <- MMT + diag(1e-05, ncol(MMT), ncol(MMT)) # get phenotypes rg <- enhancer::simGECorMat(nEnvs, 1, mu=0.2, v=0.2) rg <- Matrix::nearPD(rg)$mat rg # desired genetic correlation u <- mvrnorm(n = nMarks, rep(0, nEnvs), Sigma=rg) # marker effects g <- crossprod(t(M),u) # genetic values h2 <- 0.2 #heritability envEffect <- rnorm(nEnvs, mean = abs(rnorm(1))) # environment means e <- mvrnorm(n = nInds, envEffect, Sigma=(1-h2)/h2*diag(diag(var(g)))) # errors p = g + e # phenotypes y <- as.vector(p) # phenotypes as vector env <- sort(rep(paste0("e",1:nEnvs), nrow(g))) # environment labels ind <- rep(paste0("i",1:nrow(g)), nEnvs ) # individuals labels colnames(MMT) <- rownames(MMT) <- paste0("i",1:nrow(g)) # assign dimnames MMTi <- solve(MMT + diag(1e-4,ncol(MMT),ncol(MMT))) MMTi[lower.tri(MMTi)] <- t(MMTi)[lower.tri(MMTi)] # fill the lower triangular MMTi <- as(as(as( MMTi, "dMatrix"), "generalMatrix"), "CsparseMatrix") attr(MMTi, 'inverse')=TRUE DT <- data.frame(ind=ind, env=env, y=y) # fit the models mixm2 <- mmes(y ~ env, random=~ vsm(dsm(env), ism(ind), Gu=MMTi), data=DT ) summary(mixm2)$varcomp
Constructs a structured configuration object for mmes, encapsulating
solver algorithms, memory budgets, iterative PCG parameters, and experimental numerical
paths without modifying global options.
mmes_control(solver = c("auto", "ldlt", "cholmod", "pcg"), denseMemoryMB = NULL, experimental = list(), pcg = list(), acceleration = c("none", "aitken", "hybrid-ai"), factorScoreAugmentation = c("none", "fixed-shape", "profile"), recordDiagnostics = TRUE, verboseDiagnostics = FALSE, memoryPolicy = NULL, gpu = NULL, gpuMinSize = NULL, ...)mmes_control(solver = c("auto", "ldlt", "cholmod", "pcg"), denseMemoryMB = NULL, experimental = list(), pcg = list(), acceleration = c("none", "aitken", "hybrid-ai"), factorScoreAugmentation = c("none", "fixed-shape", "profile"), recordDiagnostics = TRUE, verboseDiagnostics = FALSE, memoryPolicy = NULL, gpu = NULL, gpuMinSize = NULL, ...)
solver |
Backend linear solver for coefficient matrix factorization.
Options are |
denseMemoryMB |
Upper bound on dense allocations (in megabytes) used by Schur-complement engines, block-chain/banded paths, and selected-inverse caches. Default is 1000 MB. |
memoryPolicy |
|
experimental |
A named list of experimental solver paths. Each toggle accepts
|
pcg |
A named list of settings for the iterative PCG solver:
|
acceleration |
Convergence accelerator: Hybrid AI requires Gaussian identity-link Henderson fitting with Hybrid convergence requires an exact final relative proposal norm below
|
factorScoreAugmentation |
Factor-score augmentation: |
recordDiagnostics |
Logical; whether to capture internal solver diagnostics in |
verboseDiagnostics |
Logical; whether to print diagnostic details during execution. Default is |
gpu |
Logical; enable eligible CUDA dense kernels in the unified Henderson
solver. Defaults to |
gpuMinSize |
Positive integer; minimum matrix size for CUDA kernels.
Defaults to |
... |
Additional named parameters or legacy experimental arguments. |
An object of class "sommer_mmes_control".
mmes, generate_mme_workload, run_mme_benchmark
# Default engine configuration ctrl <- mmes_control() print(ctrl) # Force block-banded experimental path with custom memory budget ctrl_banded <- mmes_control( solver = "cholmod", denseMemoryMB = 2000, experimental = list(blockBanded = "force") ) print(ctrl_banded)# Default engine configuration ctrl <- mmes_control() print(ctrl) # Force block-banded experimental path with custom memory budget ctrl_banded <- mmes_control( solver = "cholmod", denseMemoryMB = 2000, experimental = list(blockBanded = "force") ) print(ctrl_banded)
Multivariate Newton-Raphson algorithm used behind mmes when the henderson argument is set to FALSE. Algorithm made available for users that want to avoid the user-friendly interface and provide their matrices directly.
MNR(Y, # response X, Gx, # fixed effects Z, K, # random effects R, # residual effects Ge, GeI, # initial values and constraints W, isInvW, # weights matrix iters, tolpar, tolparinv, # other params ai, pev, verbose, retscaled, stepweight, emweight )MNR(Y, # response X, Gx, # fixed effects Z, K, # random effects R, # residual effects Ge, GeI, # initial values and constraints W, isInvW, # weights matrix iters, tolpar, tolparinv, # other params ai, pev, verbose, retscaled, stepweight, emweight )
Y |
A matrix with rows for records and columns for traits. Expected class is a 'matrix'. |
X |
Design matrices for fixed effects. Expected class is a 'list' with as many design matrices as fixed effects. Matrices within the list should be of class 'matrix' |
Gx |
Trait multiplier matrix for fixed effects. Expected class is a 'list' with as many matrices as fixed effects. Each matrix is a square matrix with as many rows and columns as number of traits. Each matrix is of class 'matrix' |
Z |
Design matrices for random effects. Expected class is a 'list' with as many design matrices as random effects. Each element in the list should be a matrix of class 'dgCMatrix' |
K |
Covariance matrices for design matrices of random effects. Expected class is a 'list' with as many covariance matrices as random effects specified in Z. Each element in the list should be a matrix of class 'dgCMatrix' |
R |
Residual matrices for residual effects. Expected class is a 'list' with as many residual matrices as residual effects. Each element in the list should be a square matrix of dimensions n x n, where n is the number of records. Each matrix should be of class 'matrix' |
Ge |
Initial values for variance components. Expected class is a 'list' with as many variance component matrices as random effects specified in Z. Each element in the list should be a matrix of dimensions t x t, where t is the number of traits and of class 'matrix'. Initial values are any real values. |
GeI |
Initial constraints for variance components. Expected class is a 'list' with as many variance component constraints matrices as random effects specified in Z. Each element in the list should be a matrix of dimensions t x t, where t is the number of traits and of class 'matrix'. Values expected are: 0: not to be estimated 1: estimated and constrained to be positive (i.e. variance component) 2: estimated and unconstrained (can be negative or positive, i.e. covariance component) 3: not to be estimated but fixed (value has to be provided in the Gti argument) Please notice that lower triangular values of these matrices have to be equal to zero since only the values in the upper triangular are estimated. |
W |
Design matrix for weights. A matrix of class 'matrix' for weighting the records. |
isInvW |
A value of class 'logical' to indicate if the W matrix provided is already an inverse or not. This aims to speed up the computations. |
iters |
Maximum number of iterations allowed in REML. Value is of class 'integer'. |
tolpar |
Convergence criteria for the change in log-likelihood. Value is of class 'numeric'. |
tolparinv |
Tolerance parameter for matrix inverse used when singularities are encountered in the estimation procedure. Value is of class 'numeric'. |
ai |
A value of class 'logical' to indicate if the Average Information algorithm should be used instead. That is faster but much less stable. |
pev |
A value of class 'logical' to indicate if the predicted error variance should be computed or not. If FALSE computations are speeded up for models with many effects to be estimated. |
verbose |
A value of class 'logical' to value to indicate if the program should return the progress of the iterative algorithm. |
retscaled |
A value of class 'logical' to indicate if we should avoid scaling the traits. |
stepweight |
Vector of class 'numeric' with length equal to niters to specify the relative weight given to the second derivative Newton update. |
emweight |
Vector of class 'numeric' with length equal to niters to specify the relative weight given to the EM update compared to the NR update. |
This is the Rcpp-coded Direct-Inversion LMM REML algorithm used behind the mmer function.
If all parameters are correctly indicated the program will return a list with the following information:
Vi |
the inverse of the phenotypic variance matrix V^- = (ZGZ+R)^-1 |
P |
the projection matrix Vi - [Vi*(X*Vi*X)^-*Vi] |
sigma |
a list with the values of the variance-covariance components with one list element for each random effect. |
sigma_scaled |
a list with the values of the scaled variance-covariance components with one list element for each random effect. |
sigmaSE |
Hessian matrix containing the variance-covariance for the variance components. SE's can be obtained taking the square root of the diagonal values of the Hessian. |
Beta |
a data frame for trait BLUEs (fixed effects). |
VarBeta |
a variance-covariance matrix for trait BLUEs |
U |
a list (one element for each random effect) with a data frame for trait BLUPs. |
VarU |
a list (one element for each random effect) with the variance-covariance matrix for trait BLUPs. |
PevU |
a list (one element for each random effect) with the predicted error variance matrix for trait BLUPs. |
fitted |
Fitted values y.hat=XB |
residuals |
Residual values e = Y - XB |
AIC |
Akaike information criterion |
BIC |
Bayesian information criterion |
convergence |
a TRUE/FALSE statement indicating if the model converged. |
monitor |
The values of log-likelihood and variance-covariance components across iterations during the REML estimation. |
percChange |
The percent change of variance components across iterations. There should be one column less than the number of iterations. Calculated as percChange = ((x_i/x_i-1) - 1) * 100 where i is the ith iteration. |
dL |
The vector of first derivatives of the likelihood with respect to the ith variance-covariance component. |
dL2 |
The matrix of second derivatives of the likelihood with respect to the i.j th variance-covariance component. |
Mrode, R. A. (2014). Linear models for the prediction of animal breeding values. Cabi.
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
mmes – the core function of the package
data(DT_cpdata, package="enhancer") DT <- DT_cpdata # response matrix y <- cbind(imputev(DT$Yield), imputev(DT$Firmness)) # fixed effect incidence matrix X <- model.matrix(~Rowf, data=DT) # random effect incidence matrix Z <- Matrix::sparse.model.matrix(~id - 1, data=DT) colnames(Z) <- gsub("id","",colnames(Z)) # covariance for random effect GT <- GT_cpdata A <- A.mat(GT) # additive relationship matrix A <- A[colnames(Z),colnames(Z)] # make sure of the order A <- A + diag(1e-4,nrow(A), nrow(A)) # residual effect incidence matrix (dimensions equal nrow(y)) R1 <- Matrix::Diagonal(n=nrow(y)) # weights matrix (dimensions equal nrow(y)) W <- diag(nrow(y)) # some other parameters maxIter=3 stepWeight <- rep(0.9, maxIter) stepWeight[1:2] <- c(0.5, 0.7) emWeights <- rep(0,maxIter) # model fit res <- MNR( Y=y, # multi-trait response X=list(X), Gx=list(diag(2)), # fixed effects Z=list(Z), K=list(A), # random effects R=list(R1), # residual effects Ge=list( (diag(2)*.3)+.15 , diag(2)*0.75 ), # inital vc GeI=list(unsm2(2),diag(2)), # vc constraints W=W, isInvW=TRUE, # weights for records iters=maxIter, tolpar=1e-4, tolparinv=1e-6, # tolerance ai=FALSE, pev=FALSE, # algorithm specifics verbose=TRUE, retscaled=FALSE, stepweight=stepWeight, # second derivatives weights emweight=emWeights # em update weights ) res$sigma res$Beta res$U[[1]]data(DT_cpdata, package="enhancer") DT <- DT_cpdata # response matrix y <- cbind(imputev(DT$Yield), imputev(DT$Firmness)) # fixed effect incidence matrix X <- model.matrix(~Rowf, data=DT) # random effect incidence matrix Z <- Matrix::sparse.model.matrix(~id - 1, data=DT) colnames(Z) <- gsub("id","",colnames(Z)) # covariance for random effect GT <- GT_cpdata A <- A.mat(GT) # additive relationship matrix A <- A[colnames(Z),colnames(Z)] # make sure of the order A <- A + diag(1e-4,nrow(A), nrow(A)) # residual effect incidence matrix (dimensions equal nrow(y)) R1 <- Matrix::Diagonal(n=nrow(y)) # weights matrix (dimensions equal nrow(y)) W <- diag(nrow(y)) # some other parameters maxIter=3 stepWeight <- rep(0.9, maxIter) stepWeight[1:2] <- c(0.5, 0.7) emWeights <- rep(0,maxIter) # model fit res <- MNR( Y=y, # multi-trait response X=list(X), Gx=list(diag(2)), # fixed effects Z=list(Z), K=list(A), # random effects R=list(R1), # residual effects Ge=list( (diag(2)*.3)+.15 , diag(2)*0.75 ), # inital vc GeI=list(unsm2(2),diag(2)), # vc constraints W=W, isInvW=TRUE, # weights for records iters=maxIter, tolpar=1e-4, tolparinv=1e-6, # tolerance ai=FALSE, pev=FALSE, # algorithm specifics verbose=TRUE, retscaled=FALSE, stepweight=stepWeight, # second derivatives weights emweight=emWeights # em update weights ) res$sigma res$Beta res$U[[1]]
User-defined covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
ownm(x, K = NULL, fun = NULL, par = numeric(), fixed = NULL, dfun = NULL, par_names = NULL, native_report = NULL)ownm(x, K = NULL, fun = NULL, par = numeric(), fixed = NULL, dfun = NULL, par_names = NULL, native_report = NULL)
x |
Variable or design defining q covariance levels. |
K |
Optional known positive-definite q by q covariance matrix. If supplied, the structure is fixed. |
fun |
Optional function fun(par) returning a finite q by q covariance matrix. |
par |
Starting parameter vector for fun. |
fixed |
Logical vector of length par indicating fixed parameters. |
dfun |
Optional derivative function dfun(par, k) returning the derivative of the raw covariance matrix with respect to parameter k. |
par_names |
Optional names for the parameters. |
native_report |
Optional function with arguments |
There are two modes. With K, ownm creates a fixed covariance factor. With fun, the matrix is evaluated at every optimizer point. The returned matrix is symmetrized and normalized by its first diagonal element so that vsm retains the unique overall variance scale. If dfun is supplied, its derivative is normalized analytically using the quotient rule; otherwise a central numerical derivative of the normalized factor is used. This is the general extension mechanism for covariance structures that do not require a native C++ evaluator. When native_report is omitted, the overall variance and naturally transformed par values are reported.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
vsm, covparams_mmes, rrm, maternm, sar, car.
## Not run: K <- matrix(c(1,.3,.3,1),2,2) vsm(ownm(group, K=K), ism(id)) cfun <- function(p) { r <- tanh(p[1]); matrix(c(1,r,r,1),2,2) } native <- function(scale, par, factor, absorb_scale=TRUE) { c(variance=scale, correlation=tanh(par[1])) } vsm(ownm(group, fun=cfun, par=0, native_report=native), ism(id)) ## End(Not run)## Not run: K <- matrix(c(1,.3,.3,1),2,2) vsm(ownm(group, K=K), ism(id)) cfun <- function(p) { r <- tanh(p[1]); matrix(c(1,r,r,1),2,2) } native <- function(scale, par, factor, absorb_scale=TRUE) { c(variance=scale, correlation=tanh(par[1])) } vsm(ownm(group, fun=cfun, par=0, native_report=native), ism(id)) ## End(Not run)
plot method for class "mmes".
## S3 method for class 'mmes' plot(x,stnd=TRUE, ...)## S3 method for class 'mmes' plot(x,stnd=TRUE, ...)
x |
an object of class |
stnd |
argument for ploting the residuals to know if they should be standarized. |
... |
Further arguments to be passed |
vector of plot
Giovanny Covarrubias [email protected]
data(DT_yatesoats, package="enhancer") DT <- DT_yatesoats head(DT) m3 <- mmes(fixed=Y ~ V + N + V:N, random = ~ B + B:MP, rcov=~units, data = DT)data(DT_yatesoats, package="enhancer") DT <- DT_yatesoats head(DT) m3 <- mmes(fixed=Y ~ V + N + V:N, random = ~ B + B:MP, rcov=~units, data = DT)
plot for monitoring.
pmonitor(object, ...)pmonitor(object, ...)
object |
model object of class |
... |
Further arguments to be passed to the plot function. |
vector of plot
Giovanny Covarrubias
data(DT_yatesoats, package="enhancer") DT <- DT_yatesoats head(DT) m3 <- mmes(fixed=Y ~ V + N + V:N, random = ~ B + B:MP, rcov=~units, data = DT) pmonitor(m3)data(DT_yatesoats, package="enhancer") DT <- DT_yatesoats head(DT) m3 <- mmes(fixed=Y ~ V + N + V:N, random = ~ B + B:MP, rcov=~units, data = DT) pmonitor(m3)
Computes prediction error variances (PEVs) or the complete inverse of the mixed model coefficient matrix after a model has been fitted with mmes. For PEV-only calculations, the function uses the Takahashi sparse inverse subset approach, avoiding computation of the complete inverse of the coefficient matrix.
postPEV(object, mode = 1L)postPEV(object, mode = 1L)
object |
A fitted model object of class |
mode |
Integer specifying the post-fit inverse calculation to perform. Use |
The function is intended for post-processing models fitted with mmes, allowing prediction error variances or the complete inverse of the mixed model coefficient matrix to be calculated only when they are needed.
When mode = 1, the sparse mixed model coefficient matrix stored in the fitted object is factorized and the Takahashi equations are used to obtain the selected elements of its inverse required for the diagonal prediction error variances. The complete inverse is not formed.
When mode = 2, the complete inverse of the mixed model coefficient matrix is computed. The prediction error variances are then obtained from the corresponding diagonal elements of this inverse.
When mode = 0, no matrix factorization or inverse calculation is performed and previously stored inverse-derived results are cleared.
predict.mmes does not require any particular mode: it computes exact standard errors for arbitrary linear combinations of fixed and random effects directly from the stored coefficient matrix C, without using Ci at all (see predict.mmes for details). postPEV() is only needed when the diagonal prediction error variances (uPevList) or the complete inverse (Ci) are wanted for their own sake.
For the sampling variance of the BLUP itself, use postVarU:
.
PEV and BLUP sampling variance are different quantities. Neither includes
uncertainty from estimating covariance parameters. postVarU() leaves
existing PEV outputs unchanged.
For this post-fit calculation to be available, the mmes model must have been fitted with a version of the Henderson mixed model solver that stores the final sparse coefficient matrix and its scaling factor in the fitted model object. Models can therefore be initially fitted with computeCi = 0 and the PEVs or complete inverse calculated afterwards only if required.
An object of class "mmes" containing the original fitted model together with the requested post-fit inverse information.
With mode = 1, uPevList contains the prediction error variances for the random effects while Ci remains empty.
With mode = 2, Ci contains the complete inverse of the mixed model coefficient matrix and uPevList contains the corresponding prediction error variances for the random effects.
With mode = 0, inverse-derived outputs are cleared.
The returned object also contains CiComputed and CiMode, indicating whether the complete inverse was computed and which calculation mode was used, respectively.
Takahashi, K., Fagan, J., and Chin, M. S. (1973). Formation of a sparse bus impedance matrix and its application to short circuit study. Proceedings of the 8th PICA Conference, Minneapolis, Minnesota.
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
####=========================================#### #### Fit a mixed model without computing PEVs #### or the complete inverse during estimation ####=========================================#### # mod <- mmes( # fixed = Yield ~ 1, # random = ~ vsm(ism(Genotype)), # rcov = ~ units, # data = DT, # computeCi = 0 # ) ####=========================================#### #### Compute PEVs afterwards using the #### Takahashi sparse inverse subset ####=========================================#### # mod <- postPEV(mod, mode = 1) # mod$uPevList ####=========================================#### #### Compute the complete inverse afterwards ####=========================================#### # mod <- postPEV(mod, mode = 2) # mod$Ci # mod$uPevList####=========================================#### #### Fit a mixed model without computing PEVs #### or the complete inverse during estimation ####=========================================#### # mod <- mmes( # fixed = Yield ~ 1, # random = ~ vsm(ism(Genotype)), # rcov = ~ units, # data = DT, # computeCi = 0 # ) ####=========================================#### #### Compute PEVs afterwards using the #### Takahashi sparse inverse subset ####=========================================#### # mod <- postPEV(mod, mode = 1) # mod$uPevList ####=========================================#### #### Compute the complete inverse afterwards ####=========================================#### # mod <- postPEV(mod, mode = 2) # mod$Ci # mod$uPevList
Computes the plug-in sampling variance or covariance of fitted random-effect
predictors, , using Henderson's mixed-model coefficient system.
This is distinct from the prior variance of the random effects and their
prediction error variance (PEV).
postVarU(object, mode=1L)postVarU(object, mode=1L)
object |
A Gaussian |
mode |
|
For , with and
, the unscaled Henderson matrix is
Its random-effect inverse block is
. Consequently,
For known covariance parameters this identity is exact. At estimated parameters the result is a plug-in covariance, omitting covariance-parameter estimation uncertainty. The same identity is used for ML and REML fits.
The implementation does not construct or invert the observation covariance
. Error covariance is computed by solving the stored Henderson
system and multiplying by Cscale to recover the original response
scale. For each independent random term,
, where is the fitted
covariance-coordinate matrix and the relationship covariance.
Products with are evaluated by solving its retained sparse
precision, not by explicitly forming its inverse or the full joint .
mode=1 processes identity contrasts in batches of at most 128 rows,
so neither a full coefficient inverse nor a full random-effect covariance
matrix is stored. It requires solves for all requested effect diagonals and
can be expensive for large models. mode=2 requires quadratic storage
in the number of random effects. Although independent terms have zero prior
cross-covariance, their BLUPs can have nonzero sampling cross-covariance; the
joint VarU includes these cross-term entries.
Rotation and factor-score augmentation are mapped to the public
uList coordinates before computing error covariance. New fits retain
randomPrecision in original level order, so external Gu
objects are not needed after fitting. Older ordinary fits attempt to rebuild
relationship precisions from saved model inputs, requiring the original
formula objects; dimension checks cannot detect all changes to those objects.
Older rotated or augmented fits must be refitted. No clipping is performed:
small negative variances from numerical cancellation remain visible.
Existing Ci and uPevList are left unchanged. The variance here
is not the empirical variance across BLUP values and is not a posterior
variance of . It is the repeated-sampling covariance of .
The original fitted object with uVarList, a named list matching the
dimensions and labels of uList, and uVarMode. With
mode=2, VarU is the joint covariance in term order, with each
uList matrix stacked column by column. Its labels contain term,
covariance-coordinate and main-effect labels. Modes 0 and 1 remove any
previous full VarU; mode 0 also removes uVarList.
postPEV, predict.mmes,
covmatrix_mmes
data(DT_example, package="enhancer") model <- mmes(Yield~Env, random=~Name, data=DT_example, computeCi=0, verbose=FALSE) model <- postVarU(model) head(model$uVarList[[1]]) full <- postVarU(model, mode=2) head(diag(full$VarU)) prediction <- predict(model, D="Name", PEV=TRUE, VarU=TRUE) head(prediction$pvals) prediction$PEV[1:3, 1:3] prediction$VarU[1:3, 1:3] prediction$sampling.vcov[1:3, 1:3]data(DT_example, package="enhancer") model <- mmes(Yield~Env, random=~Name, data=DT_example, computeCi=0, verbose=FALSE) model <- postVarU(model) head(model$uVarList[[1]]) full <- postVarU(model, mode=2) head(diag(full$VarU)) prediction <- predict(model, D="Name", PEV=TRUE, VarU=TRUE) head(prediction$pvals) prediction$PEV[1:3, 1:3] prediction$VarU[1:3, 1:3] prediction$sampling.vcov[1:3, 1:3]
predict method for class "mmes".
## S3 method for class 'mmes' predict(object, Dtable=NULL, D, levels=NULL, sed=FALSE, pairwise=FALSE, adjust="none", df=Inf, PEV=TRUE, VarU=TRUE, ...)## S3 method for class 'mmes' predict(object, Dtable=NULL, D, levels=NULL, sed=FALSE, pairwise=FALSE, adjust="none", df=Inf, PEV=TRUE, VarU=TRUE, ...)
object |
a mixed model of class |
Dtable |
a table specifying the terms to be included or averaged. An "include" term uses the cells matching each prediction row. For categorical random effects these are mapped within the fitted term, including fitted cells without records. Numeric fixed terms retain their evaluated covariate values rather than being replaced by indicators. An "include and average" term means that the included cells of that effect are averaged: each prediction row is divided by the number of cells of the term present with it (for fixed terms this count includes the reference cells absorbed in the intercept). An "average" term alone averages over the selected factor levels. For categorical terms the weights are 1/#levels; numeric fixed terms are evaluated at their covariate settings before averaging. If a term is not considered "include" or "average" is then totally ignored in the BLUP and SE calculation. The default rule to invoke when the user doesn't provide the Dtable is to include and average all terms that match the argument D. The |
D |
a character string specifying the variable used to extract levels for the rows of the D matrix and its construction. Alternatively, the D matrix (of class dgCMatrix) specifying the matrix to be used for the predictions directly. |
levels |
an optional named list whose names are values of |
sed |
if |
pairwise |
|
adjust |
multiplicity adjustment passed to |
df |
degrees of freedom for pairwise tests: |
PEV |
Logical, default |
VarU |
Logical, default |
... |
Further arguments to be passed. |
This function allows to produce predictions specifying those variables that define the margins of the hypertable to be predicted (argument D). Predictions are obtained for each combination of values of the specified variables that is present in the data set used to fit the model. See vignettes for more details.
For categorical structured random terms, the fitted covariance-coordinate
and main-effect levels define the genetic prediction weights, even when a
cell has no observations. The levels argument can additionally request
fitted levels present only in Gu. Unsupported random designs that
cannot be mapped for all prediction rows produce a warning; an explicit
D matrix can be used for these designs.
Numeric fixed terms, including factor-by-covariate interactions, are
evaluated using the fitted fixed formula and contrasts. Unless overridden,
each numeric variable is set to its mean in the retained fitting data.
Factor levels are equally weighted when averaged. Thus an averaged
Env:cov term with one slope per environment uses
mean(cov)/nlevels(Env) for each slope, not 1/nlevels(Env).
Write . The target is and its
predictor is . The existing
prediction PEV and VarU matrices are for the linear
combinations represented by the final returned D, after applying
Dtable and levels, not copies of model-level effect variances.
Each covariance matrix has one row and column per requested prediction.
The existing
vcov, optional PEV, and squared std.error refer to
, not generally to
. They are computed from
where is the original-scale Henderson coefficient matrix defined
in postVarU. The stored system C is solved against
contrast transposes and the result multiplied by Cscale. Arbitrary
contrasts work regardless of computeCi; no stored Ci is used.
With and , the new outputs are
The BLUE and BLUP have zero sampling cross-covariance, whereas the
fixed/random blocks of the inverse Henderson matrix describe error
covariance and generally are not zero. In particular, subtracting the full
target PEV from is incorrect if fixed effects are included.
A fixed-only prediction has zero VarU, but generally nonzero
sampling.vcov and PEV. Random-only predictions satisfy
.
The implementation batches full, random-only and fixed-only contrasts into
one Henderson factorization. Prior products use the term structure
and sparse relationship-precision solves.
Neither the observation covariance nor its inverse is constructed.
Additional matrices require quadratic storage in the number of predictions.
Rotation and factor-score mappings operate in public effect coordinates.
New fits retain relationship precisions; older ordinary fits attempt model
input reconstruction as described in postVarU.
All covariance outputs use the fitted variance components as fixed,
omitting their estimation uncertainty. They are exact for known components
and plug-in approximations for estimated components, for both ML and REML.
SEDs, pairwise tests and std.error retain their PEV-based meaning;
enabling VarU does not change those calculations. Direct and matrix-free
solveOnly fits lack the stored coefficient system required here.
pvals |
the table of predictions according to the specified arguments. |
vcov |
The full target prediction-error covariance, always returned. |
PEV |
When requested, identical to |
VarU |
When requested, sampling covariance of the predicted random
contribution only; its diagonal is |
sampling.vcov |
When |
D |
the model matrix for predictions as defined in Welham et al.(2004). |
Dtable |
the table specifying the terms to include and terms to be averaged, including the |
sed, avsed
|
when |
pairwise |
when requested: a data frame with |
Giovanny Covarrubias-Pazaran
Welham, S., Cullis, B., Gogel, B., Gilmour, A., and Thompson, R. (2004). Prediction in linear mixed models. Australian and New Zealand Journal of Statistics, 46, 325 - 347.
data(DT_yatesoats, package="enhancer") DT <- DT_yatesoats m3 <- mmes(fixed=Y ~ V + N + V:N , random = ~ B + B:MP, rcov=~units, data = DT) m3 <- postPEV(m3, mode = 2) ############################# ## predict means for nitrogen ############################# Dt <- m3$Dtable; Dt # first fixed effect just average Dt[1,"average"] = TRUE # second fixed effect include Dt[2,"include"] = TRUE # third fixed effect include and average Dt[3,"include"] = TRUE Dt[3,"average"] = TRUE Dt pp=predict(object=m3, Dtable=Dt, D="N") pp$pvals ############################# ## predict means for variety ############################# Dt <- m3$Dtable; Dt # first fixed effect include Dt[1,"include"] = TRUE # second fixed effect just average Dt[2,"average"] = TRUE # third fixed effect include and average Dt[3,"include"] = TRUE Dt[3,"average"] = TRUE Dt pp=predict(object=m3, Dtable=Dt, D="V") pp$pvals ############################# ## predict means for nitrogen:variety ############################# # prediction matrix D based on (equivalent to classify in asreml) Dt <- m3$Dtable; Dt # first fixed effect include and average Dt[1,"include"] = TRUE Dt[1,"average"] = TRUE # second fixed effect include and average Dt[2,"include"] = TRUE Dt[2,"average"] = TRUE # third fixed effect include and average Dt[3,"include"] = TRUE Dt[3,"average"] = TRUE Dt pp=predict(object=m3, Dtable=Dt, D="N:V") pp$pvals ############################# ## select levels through the argument or the Dtable ############################# Dt <- m3$Dtable Dt$average[Dt$term %in% c("1", "V", "V:N")] <- TRUE Dt$include[Dt$term %in% c("N", "V:N")] <- TRUE p <- predict(m3, D="N", Dtable=Dt, levels=list(N=c("0.6", "0.2"))) p$pvals p$Dtable$levels[[match("N", p$Dtable$term)]] Dt$levels[[match("N", Dt$term)]] <- c("0.6", "0.2") p2 <- predict(m3, D="N", Dtable=Dt) all.equal(p$D, p2$D) ## Covariances of the requested linear combinations p <- predict(m3, D="N", Dtable=Dt, PEV=TRUE, VarU=TRUE) p$PEV p$VarU p$sampling.vcov randomColumns <- seq.int(nrow(m3$b)+1L, nrow(m3$bu)) randomD <- p$D[,randomColumns,drop=FALSE] full <- postVarU(m3, mode=2) all.equal(unname(p$VarU), unname(as.matrix(randomD %*% full$VarU %*% t(randomD))))data(DT_yatesoats, package="enhancer") DT <- DT_yatesoats m3 <- mmes(fixed=Y ~ V + N + V:N , random = ~ B + B:MP, rcov=~units, data = DT) m3 <- postPEV(m3, mode = 2) ############################# ## predict means for nitrogen ############################# Dt <- m3$Dtable; Dt # first fixed effect just average Dt[1,"average"] = TRUE # second fixed effect include Dt[2,"include"] = TRUE # third fixed effect include and average Dt[3,"include"] = TRUE Dt[3,"average"] = TRUE Dt pp=predict(object=m3, Dtable=Dt, D="N") pp$pvals ############################# ## predict means for variety ############################# Dt <- m3$Dtable; Dt # first fixed effect include Dt[1,"include"] = TRUE # second fixed effect just average Dt[2,"average"] = TRUE # third fixed effect include and average Dt[3,"include"] = TRUE Dt[3,"average"] = TRUE Dt pp=predict(object=m3, Dtable=Dt, D="V") pp$pvals ############################# ## predict means for nitrogen:variety ############################# # prediction matrix D based on (equivalent to classify in asreml) Dt <- m3$Dtable; Dt # first fixed effect include and average Dt[1,"include"] = TRUE Dt[1,"average"] = TRUE # second fixed effect include and average Dt[2,"include"] = TRUE Dt[2,"average"] = TRUE # third fixed effect include and average Dt[3,"include"] = TRUE Dt[3,"average"] = TRUE Dt pp=predict(object=m3, Dtable=Dt, D="N:V") pp$pvals ############################# ## select levels through the argument or the Dtable ############################# Dt <- m3$Dtable Dt$average[Dt$term %in% c("1", "V", "V:N")] <- TRUE Dt$include[Dt$term %in% c("N", "V:N")] <- TRUE p <- predict(m3, D="N", Dtable=Dt, levels=list(N=c("0.6", "0.2"))) p$pvals p$Dtable$levels[[match("N", p$Dtable$term)]] Dt$levels[[match("N", Dt$term)]] <- c("0.6", "0.2") p2 <- predict(m3, D="N", Dtable=Dt) all.equal(p$D, p2$D) ## Covariances of the requested linear combinations p <- predict(m3, D="N", Dtable=Dt, PEV=TRUE, VarU=TRUE) p$PEV p$VarU p$sampling.vcov randomColumns <- seq.int(nrow(m3$b)+1L, nrow(m3$bu)) randomD <- p$D[,randomColumns,drop=FALSE] full <- postVarU(m3, mode=2) all.equal(unname(p$VarU), unname(as.matrix(randomD %*% full$VarU %*% t(randomD))))
Print method for sommer_mme_benchmark
## S3 method for class 'sommer_mme_benchmark' print(x, ...)## S3 method for class 'sommer_mme_benchmark' print(x, ...)
x |
An object of class |
... |
Ignored. |
Print method for sommer_mme_crossover
## S3 method for class 'sommer_mme_crossover' print(x, ...)## S3 method for class 'sommer_mme_crossover' print(x, ...)
x |
An object of class |
... |
Ignored. |
Print method for sommer_mme_profile
## S3 method for class 'sommer_mme_profile' print(x, ...)## S3 method for class 'sommer_mme_profile' print(x, ...)
x |
An object of class |
... |
Ignored. |
Print method for sommer_mmes_control
## S3 method for class 'sommer_mmes_control' print(x, ...)## S3 method for class 'sommer_mmes_control' print(x, ...)
x |
An object of class |
... |
Ignored. |
Fits one workload with phase profiling enabled and tabulates where the time goes.
profile_mme_workload( workload, engine = mmes_control(), nIters = 5L, dominantShare = 0.3 )profile_mme_workload( workload, engine = mmes_control(), nIters = 5L, dominantShare = 0.3 )
workload |
An |
engine |
A |
nIters |
Maximum REML/ML iterations. Default is 5. |
dominantShare |
Share of fit time above which a phase is flagged dominant. Default is 0.3. |
A list of class "sommer_mme_profile" with a per-phase table,
workload counters, per-iteration seconds, and the total elapsed time.
Calculates the reliability of BLUPs in a sommer model.
r2(object, object2=NULL)r2(object, object2=NULL)
object |
Model fitted with the mmes function. |
object2 |
An optional model identical to object in the first argument but fitted with the argument returnParam set to TRUE to access the relationship matrices from the fitted model. |
The reliability method calculated is the classical animal model: R2=(G-PEV)/G
a list with as many elements as random effects fitted containing reliabilities for individual BLUPs.
Mrode, R. A. (2014). Linear models for the prediction of animal breeding values. Cabi.
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
mmes – the core function of the package
####=========================================#### #### Example population ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example head(DT) ans1 <- mmes(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT) ans1 <- postPEV(ans1, mode = 1) rel=r2(ans1)####=========================================#### #### Example population ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example head(DT) ans1 <- mmes(Yield~Env, random= ~ Name + Env:Name, rcov= ~ units, data=DT) ans1 <- postPEV(ans1, mode = 1) rel=r2(ans1)
This function is extracts the random effects from a mixed model fitted by mmer.
randef(object)randef(object)
object |
an mmer object |
a list structure with the random effects or BLUPs.
# randef(model)# randef(model)
residuals method for class "mmes".
## S3 method for class 'mmes' residuals(object, type=c("response", "deviance", "pearson", "working"), ...)## S3 method for class 'mmes' residuals(object, type=c("response", "deviance", "pearson", "working"), ...)
object |
an object of class |
type |
For a non-Gaussian PQL fit, return response residuals (default),
signed deviance residuals, Pearson residuals, or final IRLS working residuals.
Deviance and Pearson residuals use the prior weights (binomial trials, see
|
... |
Further arguments to be passed |
For Gaussian fits, residuals of the form e = y - Xb - Zu. For non-Gaussian PQL fits, residuals on the requested scale.
Giovanny Covarrubias
Back-transforms the selected relationship random effect from the solver eigenbasis to the original relationship-level basis.
rotate_back_mmes(object)rotate_back_mmes(object)
object |
An |
If and denotes the solver-basis effect, the
reported effect is . Fitted mmes objects already expose this
original-basis effect in uList; this function provides the explicit
transformation from the retained engine output.
A matrix of original-basis random effects, with relationship levels in rows and covariance-product coordinates in columns.
Reduced-rank covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
rrm(x, k = 1L, loadings = NULL, fixed = NULL)rrm(x, k = 1L, loadings = NULL, fixed = NULL)
x |
Variable defining q covariance levels. |
k |
Reduced rank, satisfying 1 <= k < q. |
loadings |
Optional finite q by k starting loading matrix. The leading k by k block is made lower triangular and must have positive diagonal entries. Loadings are divided by their first diagonal entry to remove the internal scale. |
fixed |
Logical vector of length |
The reduced-rank structure uses
and vsm() supplies the overall variance scale:
All specific variances are fixed at exactly zero; no diagonal remainder or
numerical nugget is added. This is the same covariance family as ASReml's
default rr(x, k) model. Individual loadings can differ by sign or
rotation, so compare reconstructed covariance matrices when comparing fits.
The leading loading block is lower triangular for rotational
identification and its diagonal entries are positive. There are
free shape parameters plus the overall scale.
Because , the random-effect covariance is positive semidefinite
and singular by design.
The Henderson engine fits this structure through latent factors rather than
inverting the singular environment covariance. The direct-inversion engine
(henderson=FALSE) also supports it, provided the total observation
covariance is positive definite. rrm() is intended for random effects,
not residual covariance structures.
Native latent-factor Henderson fits support solver="ldlt" and
solver="cholmod" (including automatic selection). They use
loading-aware likelihood scores and average-information updates in the
original loading/variance coordinates. The loading derivatives account for
the parameter-dependent latent design; the singular environment covariance
is never inverted. stepWeight damps covariance-parameter proposals,
while blendWeight blends EM/GEM or scalar PX-GEM with
average-information update directions, selected through blend,
as in ordinary mmes() fitting. Parameter standard errors use the unblended
average-information matrix at the final parameter values.
Prediction errors are mapped back from the latent coefficient equations
to the original random effects.
The likelihood trace terms are computed exactly by sharing random-design
and residual-block contractions across covariance parameters. Bounded panels
of Henderson solves avoid constructing a dense record-by-record covariance
or projection matrix. Random trace solves use the loading span (rank k),
rather than every environment direction. Reducing the coefficient dimension does not guarantee
a faster fit for every dataset.
Section-specific spatial residuals supplied by dsumm() are evaluated
on their observed residual blocks, including grids with missing cells and
unlisted sections with independent residuals. Residual covariance derivatives
and trace contractions never expand the full section-by-grid covariance.
engineDiagnostics$residualEvaluation reports "observed-blocks"
and engineDiagnostics$largestResidualBlock records the largest observed
block dimension used by the native RR AI evaluator.
Likelihood and AI calculations share the selected residual precision operator
and the live coefficient factorization, including grid residuals with
missing-cell absorption and eligible block-Schur solves. No separate
coefficient factorization or dense observed-block precision is built for AI.
Random trace panels use the latent Henderson identity to cancel relationship
covariance actions. Grid residual traces use block-local projection panels
rather than repeated full-observation precision applications.
engineDiagnostics$residualEngine identifies the
shared residual engine, and sharedConditionalOperators confirms its
use. aiElapsedSeconds gives elapsed timings for the final AI
evaluation's setup, random traces, residual traces, and information matrix.
The positive-specific-variance Woodbury Schur formulation used for
fam() is unnecessary for exact RR: the specific-effect blocks are
absent, not inverted at zero. The smaller latent coefficient system still
uses the ordinary LDLT/CHOLMOD and eligible block-Schur dispatch.
With verbose=TRUE, the native fit reports its RR path, selected
coefficient solver, and then the progress table. Each accepted iteration
reports likelihood, wall-clock time, cumulative CPU seconds, the scheduled
EMweight, accepted-step trustAlpha and lineAlpha,
and score norm. The step scales describe the update that reached the current
row (both are one at initialization); lineAlpha includes
stepWeight and any backtracking. Boundary-restraint and notPD
columns are omitted because the latent optimizer does not use those
ordinary covariance-update diagnostics. Numeric weights, step scales and
CPU times are retained in engineDiagnostics$iterationProgress.
For native Henderson fits with weights W, let
in observation order. The effective residual
precision is , where is the
unweighted residual covariance. The score and AI use derivatives of the
corresponding covariance .
The native path does not currently support PCG, vcc constraints,
covariance-update acceleration, solveOnly=TRUE, or
factorScoreAugmentation. These combinations produce explicit errors.
The stored coefficient matrix C describes the latent equations;
coefficientMap maps latent coefficients to the original effect space.
Use predict(), postPEV(), and the fitted uPevList for
prediction uncertainty rather than directly indexing C by original
effect indices.
Earlier versions used , estimating a
nonzero common specific variance on the fitted scale. To fit that former
covariance family, use fam(x, k, variance="homogeneous").
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(rrm(environment, k=2), ism(genotype)) # Former rrm() model: an estimated common specific variance vsm(fam(environment, k=2, variance="homogeneous"), ism(genotype)) ## End(Not run)## Not run: vsm(rrm(environment, k=2), ism(genotype)) # Former rrm() model: an estimated common specific variance vsm(fam(environment, k=2, variance="homogeneous"), ism(genotype)) ## End(Not run)
Executes a battery of workloads across candidate solver engines, measuring wall-clock time, iterations, peak memory (if available), active numerical paths, and asserting numerical parity.
run_mme_benchmark( workloads, engines = NULL, replications = 3L, verifyParity = TRUE, tolerance = 1e-05, nIters = 5L, verbose = TRUE )run_mme_benchmark( workloads, engines = NULL, replications = 3L, verifyParity = TRUE, tolerance = 1e-05, nIters = 5L, verbose = TRUE )
workloads |
A list of |
engines |
A named list of |
replications |
Number of timed repetitions (warmup run excluded). Default is 3. |
verifyParity |
Logical; whether to assert that experimental candidates match the reference engine in likelihood, variance components, and BLUPs. Default is TRUE. |
tolerance |
Numerical tolerance for parity verification. Default is 1e-5. |
nIters |
Maximum REML/ML iterations for benchmark fits. Default is 5. |
verbose |
Logical; whether to print progress. Default is TRUE. |
An object of class "sommer_mme_benchmark".
Simultaneous autoregressive spatial covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
sar(x, W, rho = 0.10, fixed = FALSE)sar(x, W, rho = 0.10, fixed = FALSE)
x |
Factor or design defining q spatial levels. |
W |
Square spatial weights matrix aligned to the levels of x. Row/column names are used when available. |
rho |
Starting SAR dependence parameter. |
fixed |
Logical indicating whether rho is fixed. |
The simultaneous autoregressive covariance is constructed from
For a general real weights matrix, rho is restricted to the conservative interval , where is the spectral radius. A bounded-logit working coordinate enforces the interval. The first covariance derivative is supplied analytically to the generic CovarianceFactor engine.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(sar(location, W), ism(genotype)) ## End(Not run)## Not run: vsm(sar(location, W), ism(genotype)) ## End(Not run)
Predicts latent factor scores for each level of the main random-effect term
crossed with a fam() or rrm() covariance-shaping factor,
combining the fitted loadings (see loadings_mmes), the fitted
covariance matrix, and the BLUPs already stored in object$uList.
scores_mmes(object, term = NULL, method = c("regression", "bartlett"), varianceScale=TRUE, rotation=TRUE)scores_mmes(object, term = NULL, method = c("regression", "bartlett"), varianceScale=TRUE, rotation=TRUE)
object |
a fitted model of class |
term |
character name of the random term built with a single
|
method |
|
varianceScale |
a logical argument to indicate if loadings should be returned in variance scale (multiplied by sqrt(sigma2)). |
rotation |
a logical value to indicate if loadings should be rotated by its singular vectors. |
Let be the levels-by-levels BLUP matrix in object$uList[[term]]
and the loadings from loadings_mmes. The
regression (Thomson) scores are
and the Bartlett scores are
Because already contains shrunken (BLUP) effects, the resulting
scores are similarly regularized.
For rrm(), the covariance is singular and the specific variances are
zero. Regression scores instead recover the latent BLUP coordinates using
so that . This uses the returned loading scale
and rotation. Bartlett scores are undefined for this zero-specific-variance
model and produce an informative error.
A matrix with one row per level of the main random-effect term and one column per latent factor.
loadings_mmes, fam, rrm, vsm, mmes.
## Not run: mix <- mmes(BLUEs ~ trial, random = ~ vsm(fam(trial, 2), ism(genotype)), rcov = ~ units, data = dt) scores_mmes(mix) ## End(Not run)## Not run: mix <- mmes(BLUEs ~ trial, random = ~ vsm(fam(trial, 2), ism(genotype)), rcov = ~ units, data = dt) scores_mmes(mix) ## End(Not run)
Auxiliary function used for modelling the spatial or environmental effect as a two-dimensional penalised tensor-product (isotropic approach) based on Lee et al. (2013) and Rodriguez-Alvarez et al. (2018). This is a modified wrapper of some portions of the SpATS package to build a single incidence matrix containing all the columns from tensor products of the x and y coordinates and it fits such matrix as a single random effect. Then the heterogeneous covariances structure capabilities of sommer can be used to enhance the model fit. You may be interested in reading and citing not only sommec but also Wageningen publications if using this 2D spline methodology.
spl2Dc(x.coord,y.coord,at.var=NULL,at.levels=NULL, type="PSANOVA", nsegments = c(10,10), penaltyord = c(2,2), degree = c(3,3), nestorder = c(1,1), thetaC=NULL, theta=NULL, sp=FALSE)spl2Dc(x.coord,y.coord,at.var=NULL,at.levels=NULL, type="PSANOVA", nsegments = c(10,10), penaltyord = c(2,2), degree = c(3,3), nestorder = c(1,1), thetaC=NULL, theta=NULL, sp=FALSE)
x.coord |
vector of coordinates on the x-axis direction (i.e. row) to use in the 2 dimensional spline. |
y.coord |
vector of coordinates on the y-axis direction (i.e. range or column) to use in the 2 dimensional spline. |
at.var |
vector of indication variable where heterogeneous variance is required (e.g., a different spl2D for each field). |
at.levels |
character vector with the names of the leves for the at term that should be used, if missing all levels are used. |
type |
one of the two methods "PSANOVA" or "SAP". See details below. |
nsegments |
numerical vector of length 2 containing the number of segments for each marginal (strictly |
penaltyord |
numerical vector of length 2 containing the penalty order for each marginal. Atomic values are also valid, being recycled. Default set to 2 (second order). Currently, only second order penalties are allowed. |
degree |
numerical vector of length 2 containing the order of the polynomial of the B-spline basis for each marginal. Atomic values are also valid, being recycled. Default set to 3 (cubic B-splines). |
nestorder |
numerical vector of length 2 containing the divisor of the number of segments ( |
thetaC |
an optional matrix for constraints in the variance components. |
theta |
an optional matrix for initial values of the variance components. |
sp |
a TRUE/FALSE statement to indicate if the VC from this structure should be multiplied by the scale parameter added in the mmes function through the addScaleParam argument in the |
The following documentation is taken from the SpATS package. Please refer to this package and associated publications if you are interested in going deeper on this technique:
Within the P-spline framework, anisotropic low-rank tensor-product smoothers have become the general approach for modelling multidimensional surfaces (Eilers and Marx 2003; Wood 2006). In the original SpATS package, was proposed to model the spatial or environmental effect by means of the tensor-product of B-splines basis functions. In other words, was proposed to model the spatial trend as a smooth bivariate surface jointly defined over the the spatial coordinates. Accordingly, the current function has been designed to allow the user to specify the spatial coordinates that the spatial trend is a function of. There is no restriction about how the spatial coordinates shall be specified: these can be the longitude and latitude of the position of the plot on the field or the column and row numbers. The only restriction is that the variables defining the spatial coordinates should be numeric (in contrast to factors).
As far as estimation is concerned, we have used in this package the equivalence between P-splines and linear mixed models (Currie and Durban, 2002). Under this approach, the smoothing parameters are expressed as the ratio between variance components. Moreover, the smooth components are decomposed in two parts: one which is not penalised (and treated as fixed) and one with is penalised (and treated as random). For the two-dimensional case, the mixed model representation leads also to a very interesting decomposition of the penalised part of the bivariate surface in three different components (Lee and Durban, 2011): (a) a component that contains the smooth main effect (smooth trend) along one of the covariates that the surface is a function of (as, e.g, the x-spatial coordinate or column position of the plot in the field), (b) a component that contains the smooth main effect (smooth trend) along the other covariate (i.e., the y-spatial coordinate or row position); and (c) a smooth interaction component (sum of the linear-by-smooth interaction components and the smooth-by-smooth interaction component).
The original implementation of SpATS assumes two different smoothing parameters, i.e., one for each covariate in the smooth component. Accordingly, the same smoothing parameters are used for both, the main effects and the smooth interaction. However, this approach can be extended to deal with the ANOVA-type decomposition presented in Lee and Durban (2011). In their approach, four different smoothing parameters are considered for the smooth surface, that are in concordance with the aforementioned decomposition: (a) two smoothing parameter, one for each of the main effects; and (b) two smoothing parameter for the smooth interaction component.
It should be noted that, the computational burden associated with the estimation of the two-dimensional tensor-product smoother might be prohibitive if the dimension of the marginal bases is large. In these cases, Lee et al. (2013) propose to reduce the computational cost by using nested bases. The idea is to reduce the dimension of the marginal bases (and therefore the associated number of parameters to be estimated), but only for the smooth-by-smooth interaction component. As pointed out by the authors, this simplification can be justified by the fact that the main effects would in fact explain most of the structure (or spatial trend) presented in the data, and so a less rich representation of the smooth-by-smooth interaction component could be needed. In order to ensure that the reduced bivariate surface is in fact nested to the model including only the main effects, Lee et al. (2013) show that the number of segments used for the nested basis should be a divisor of the number of segments used in the original basis (nsegments argument). In the present function, the divisor of the number of segments is specified through the argument nestorder. For a more detailed review on this topic, see Lee (2010) and Lee et al. (2013). The "PSANOVA" approach represents an alternative method. In this case, the smooth bivariate surface (or spatial trend) is decomposed in five different components each of them depending on a single smoothing parameter (see Lee et al., 2013).
—————–
As mentioned at the beginning, the piece of documentation stated above was taken completely from the SpATS package in order to provide a deeper explanation. In practice, sommec uses some pieces of code from SpATS to build the design matrix containing all the columns from tensor products of the x and y coordinates and it fits such matrix as a single random effect. As a result the same variance component is assumed for the linear, linear by linear, linear by spline, and spline by spline interactions. This results in a less flexible approach than the one proposed by Rodriguez-Alvarez et al. (2018) but still makes a pretty good job to model the spatial variation. Use under your own risk.
Rodriguez-Alvarez, M.X, Boer, M.P., van Eeuwijk, F.A., and Eilers, P.H.C. (2018). SpATS: Spatial Analysis of Field Trials with Splines. R package version 1.0-9. https://CRAN.R-project.org/package=SpATS.
Rodriguez-Alvarez, M.X., et al. (2015) Fast smoothng parameter separaton n multdmensonal generalzed P-splnes: the SAP algorthm. Statistics and Computing 25.5: 941-957.
Lee, D.-J., Durban, M., and Eilers, P.H.C. (2013). Efficient two-dimensional smoothing with P-spline ANOVA mixed models and nested bases. Computational Statistics and Data Analysis, 61, 22 - 37.
Gilmour, A.R., Cullis, B.R., and Verbyla, A.P. (1997). Accounting for Natural and Extraneous Variation in the Analysis of Field Experiments. Journal of Agricultural, Biological, and Environmental Statistics, 2, 269 - 293.
## ============================ ## ## example to use spl2Dc() ## ============================ ## data(DT_cpdata, package="enhancer") # DT <- DT_cpdata # GT <- GT_cpdata # MP <- MP_cpdata # A <- A.mat(GT) ## ============================ ## ## mimic 2 fields ## ============================ ## # aa <- DT; bb <- DT # aa$FIELD <- "A";bb$FIELD <- "B" # set.seed(1234) # aa$Yield <- aa$Yield + rnorm(length(aa$Yield),0,4) # DT2 <- rbind(aa,bb) # head(DT2) # mix <- mmes(Yield~1, henderson = F, # random=~ # vsm(dsm(FIELD),ism(Rowf)) + # vsm(dsm(FIELD),ism(Colf)) + # spl2Dc(Row,Col,at.var=FIELD), # rcov=~vsm(dsm(FIELD),ism(units)), # data=DT2) # # # extract spatial effects # blup <- mix$uList$`spl2Dc(Row, Col, at.var = FIELD` # head(blup) # 2 fields # # recreate the incidence matrices # xx=with(DT2, spl2Dc(Row,Col,at.var=FIELD)) # # get fitted values Zu for spatial effects and add them to the dataset # field1 <- xx$Z$`A:all` %*% blup[,1] # field2 <- xx$Z$`B:all` %*% blup[,2] # DT2$spat <- field1+field2 # # plots the spatial effects # lattice::levelplot(spat~Row*Col|FIELD, data=DT2)## ============================ ## ## example to use spl2Dc() ## ============================ ## data(DT_cpdata, package="enhancer") # DT <- DT_cpdata # GT <- GT_cpdata # MP <- MP_cpdata # A <- A.mat(GT) ## ============================ ## ## mimic 2 fields ## ============================ ## # aa <- DT; bb <- DT # aa$FIELD <- "A";bb$FIELD <- "B" # set.seed(1234) # aa$Yield <- aa$Yield + rnorm(length(aa$Yield),0,4) # DT2 <- rbind(aa,bb) # head(DT2) # mix <- mmes(Yield~1, henderson = F, # random=~ # vsm(dsm(FIELD),ism(Rowf)) + # vsm(dsm(FIELD),ism(Colf)) + # spl2Dc(Row,Col,at.var=FIELD), # rcov=~vsm(dsm(FIELD),ism(units)), # data=DT2) # # # extract spatial effects # blup <- mix$uList$`spl2Dc(Row, Col, at.var = FIELD` # head(blup) # 2 fields # # recreate the incidence matrices # xx=with(DT2, spl2Dc(Row,Col,at.var=FIELD)) # # get fitted values Zu for spatial effects and add them to the dataset # field1 <- xx$Z$`A:all` %*% blup[,1] # field2 <- xx$Z$`B:all` %*% blup[,2] # DT2$spat <- field1+field2 # # plots the spatial effects # lattice::levelplot(spat~Row*Col|FIELD, data=DT2)
spl2Dmats gets Tensor-Product P-Spline Mixed Model Incidence Matrices
for use with sommer and its main function mmes. We thank Sue Welham for making the TPSbits package available to the community. If you're using this function for your research please cite her TPSbits package :) this is mostly a wrapper of her tpsmmb function to enable the use in sommer.
spl2Dmats( x.coord.name, y.coord.name, data, at.name, at.levels, nsegments=NULL, minbound=NULL, maxbound=NULL, degree = c(3, 3), penaltyord = c(2,2), nestorder = c(1,1), method = "Lee" )spl2Dmats( x.coord.name, y.coord.name, data, at.name, at.levels, nsegments=NULL, minbound=NULL, maxbound=NULL, degree = c(3, 3), penaltyord = c(2,2), nestorder = c(1,1), method = "Lee" )
x.coord.name |
A string. Gives the name of |
y.coord.name |
A string. Gives the name of |
data |
A dataframe. Holds the dataset to be used for fitting. |
at.name |
name of a variable defining if the 2D spline matrices should be created at different units (e.g., at different environments). |
at.levels |
a vector of names indicating which levels of the at.name variable should be used for fitting the 2D spline function. |
nsegments |
A list of length 2. Number of segments to split column and row ranges into, respectively (= number of internal knots + 1). If only one number is specified, that value is used in both dimensions. If not specified, (number of unique values - 1) is used in each dimension; for a grid layout (equal spacing) this gives a knot at each data value. |
minbound |
A list of length 2. The lower bound to be used for column and row dimensions respectively; default calculated as the minimum value for each dimension. |
maxbound |
A list of length 2. The upper bound to be used for column and row dimensions respectively; default calculated as the maximum value for each dimension. |
degree |
A list of length 2. The degree of polynomial spline to be used for column and row dimensions respectively; default=3. |
penaltyord |
A list of length 2. The order of differencing for column and row dimensions, respectively; default=2. |
nestorder |
A list of length 2. The order of nesting for column and row dimensions, respectively; default=1 (no nesting). A value of 2 generates a spline with half the number of segments in that dimension, etc. The number of segments in each direction must be a multiple of the order of nesting. |
method |
A string. Method for forming the penalty; default= |
List of length 7 elements:
data = the input data frame augmented with structures required
to fit tensor product splines in asreml-R. This data frame can be used
to fit the TPS model.
Added columns:
TP.col, TP.row = column and row coordinates
TP.CxR = combined index for use with smooth x smooth term
TP.C.n for n=1:(diff.c) = X parts of column spline for use
in random model (where diff.c is the order of column differencing)
TP.R.n for n=1:(diff.r) = X parts of row spline for use in
random model (where diff.r is the order of row differencing)
TP.CR.n for n=1:((diff.c*diff.r)) = interaction between the
two X parts for use in fixed model. The first variate is
a constant term which should be omitted from the model when the constant
(1) is present. If all elements are
included in the model then the constant term should be omitted,
eg. y ~ -1 + TP.CR.1 + TP.CR.2 + TP.CR.3 + TP.CR.4 + other terms...
when asreml="grp" or "sepgrp", the spline basis
functions are also added into the data frame. Column numbers for each
term are given in the grp list structure.
fR = Xr1:Zc
fC = Xr2:Zc
fR.C = Zr:Xc1
R.fC = Zr:Xc2
fR.fC = Zc:Zr
all = Xr1:Zc | Xr2:Zc | Zr:Xc1 | Zr:Xc2 | Zc:Zr
data("DT_cpdata", package="enhancer") DT <- DT_cpdata GT <- GT_cpdata MP <- MP_cpdata #### create the variance-covariance matrix A <- A.mat(GT) # additive relationship matrix M <- spl2Dmats(x.coord.name = "Col", y.coord.name = "Row", data=DT, nseg =c(14,21)) head(M$data) # m1g <- mmes(Yield~1+TP.CR.2+TP.CR.3+TP.CR.4, # random=~Rowf+Colf+vsm(ism(M$fC))+vsm(ism(M$fR))+ # vsm(ism(M$fC.R))+vsm(ism(M$C.fR))+vsm(ism(M$fC.fR))+ # vsm(ism(id),Gu=A), # data=M$data, tolpar = 1e-6, # iters=30) # # summary(m1g)$varcompdata("DT_cpdata", package="enhancer") DT <- DT_cpdata GT <- GT_cpdata MP <- MP_cpdata #### create the variance-covariance matrix A <- A.mat(GT) # additive relationship matrix M <- spl2Dmats(x.coord.name = "Col", y.coord.name = "Row", data=DT, nseg =c(14,21)) head(M$data) # m1g <- mmes(Yield~1+TP.CR.2+TP.CR.3+TP.CR.4, # random=~Rowf+Colf+vsm(ism(M$fC))+vsm(ism(M$fR))+ # vsm(ism(M$fC.R))+vsm(ism(M$C.fR))+vsm(ism(M$fC.fR))+ # vsm(ism(id),Gu=A), # data=M$data, tolpar = 1e-6, # iters=30) # # summary(m1g)$varcomp
Converts a wide data frame (one column per trait) into the long format used by
multi-trait mmes models: one row per record and trait, a factor
identifying the trait, a single response column and a record key that pairs
the traits measured on the same experimental unit.
stackTraits(data, traits, keep = NULL, trait = "trait", value = "value", record = "record")stackTraits(data, traits, keep = NULL, trait = "trait", value = "value", record = "record")
data |
A data frame in wide format. |
traits |
Character vector with the names of the trait columns to stack. Their order defines the levels of the trait factor. |
keep |
Columns of |
trait |
Name of the new trait factor column. |
value |
Name of the new response column. |
record |
Name of the new record-key factor column. |
Rows are stacked trait by trait, so row of trait is row
of the output. The record key is taken from the row names of
data when these are unique and not the default 1..n; otherwise
it is "r1", "r2", .... Missing trait values are kept as NA (they
are handled by the naMethodY rules of mmes, so incomplete records
are allowed).
Using the record key in the residual,
rcov = ~ vsm(usm(trait), ism(record)), pairs the residuals of the traits
of each unit explicitly. With ism(units) the pairing is implied by the
order of the rows within each trait instead.
A data frame with the keep columns and the record,
trait and value columns, with length(traits) * nrow(data)
rows.
set.seed(17) n <- 60 DT <- data.frame(id = factor(rep(seq_len(n), each = 3))) u <- matrix(rnorm(n * 2), n) DT$trait_a <- u[DT$id, 1] + rnorm(nrow(DT), sd = 0.7) DT$trait_b <- u[DT$id, 2] + rnorm(nrow(DT), sd = 1) DTL <- stackTraits(DT, traits = c("trait_a", "trait_b"), keep = "id") head(DTL) table(DTL$trait) # bivariate model with the residual paired through the record key fit <- mmes(value ~ trait, random = ~ vsm(usm(trait), ism(id)), rcov = ~ vsm(usm(trait), ism(record)), data = DTL, verbose = FALSE) covmatrix_mmes(fit, 1)$correlation # genetic correlationset.seed(17) n <- 60 DT <- data.frame(id = factor(rep(seq_len(n), each = 3))) u <- matrix(rnorm(n * 2), n) DT$trait_a <- u[DT$id, 1] + rnorm(nrow(DT), sd = 0.7) DT$trait_b <- u[DT$id, 2] + rnorm(nrow(DT), sd = 1) DTL <- stackTraits(DT, traits = c("trait_a", "trait_b"), keep = "id") head(DTL) table(DTL$trait) # bivariate model with the residual paired through the record key fit <- mmes(value ~ trait, random = ~ vsm(usm(trait), ism(id)), rcov = ~ vsm(usm(trait), ism(record)), data = DTL, verbose = FALSE) covmatrix_mmes(fit, 1)$correlation # genetic correlation
Combines two or more random terms built with vsm into one
random structure with an estimated covariance between the terms. Typical uses are
direct-maternal animal models, correlated
permanent-environment effects and indirect genetic effects.
strm(..., cov = usm, Gu = NULL, labels = NULL, sigma2 = NULL, fixedSigma2 = FALSE)strm(..., cov = usm, Gu = NULL, labels = NULL, sigma2 = NULL, fixedSigma2 = FALSE)
... |
Two or more random |
cov |
A covariance constructor applied to the term index, e.g.
|
Gu |
Precision matrix shared by all terms ( |
labels |
Term labels; default the argument names or |
sigma2 |
Starting overall variance scale; |
fixedSigma2 |
Fix the overall variance scale. |
For terms with incidence matrices
the structure is
where is given by cov, is the Kronecker
product of the covariance factors used inside the terms (e.g.
dsm(env)), and is the relationship matrix. The requirements are
those of a direct product: all terms share the
coefficient levels (their levels are aligned on the union, or on the levels of
Gu), the same Gu, and the same inner covariance constructors with
the same levels; the parameters of the inner factors are shared. The
sigma2 of individual terms is ignored. BLUPs are returned in one
uList element with a column per term (and inner level).
covm(ran1, ran2) is the two-term special case with cov = usm.
The terms do not need to be adjacent in the model formula and their order is checked by level names rather than assumed.
A random structure for the random formula of mmes.
set.seed(3) ids <- paste0("i", 1:30) A <- diag(30) + diag(0.2, 30); dimnames(A) <- list(ids, ids) Ai <- solve(A); attr(Ai, "inverse") <- TRUE d <- data.frame(id = factor(sample(ids, 200, TRUE), levels = ids), dam = factor(sample(ids[1:15], 200, TRUE), levels = ids)) d$y <- rnorm(200) fit <- mmes(y ~ 1, random = ~ strm(dir = vsm(ism(id)), mat = vsm(ism(dam)), Gu = Ai), data = d, verbose = FALSE) covparams_mmes(fit, 1)set.seed(3) ids <- paste0("i", 1:30) A <- diag(30) + diag(0.2, 30); dimnames(A) <- list(ids, ids) Ai <- solve(A); attr(Ai, "inverse") <- TRUE d <- data.frame(id = factor(sample(ids, 200, TRUE), levels = ids), dam = factor(sample(ids[1:15], 200, TRUE), levels = ids)) d$y <- rnorm(200) fit <- mmes(y ~ 1, random = ~ strm(dir = vsm(ism(id)), mat = vsm(ism(dam)), Gu = Ai), data = d, verbose = FALSE) covparams_mmes(fit, 1)
summary method for class "mmer".
## S3 method for class 'mmer' summary(object, ...)## S3 method for class 'mmer' summary(object, ...)
object |
an object of class |
... |
Further arguments to be passed |
vector of summary
Giovanny Covarrubias-Pazaran
summary method for class "mmes".
## S3 method for class 'mmes' summary(object, ...)## S3 method for class 'mmes' summary(object, ...)
object |
an object of class |
... |
Further arguments to be passed |
vector of summary
Giovanny Covarrubias-Pazaran
General positive-definite Toeplitz correlation structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
toeplitzm(x, pacf = NULL, fixed = NULL)toeplitzm(x, pacf = NULL, fixed = NULL)
x |
Ordered factor or design defining q covariance levels. |
pacf |
Optional q-1 starting reflection coefficients / partial autocorrelations. Defaults to 0.10. |
fixed |
Logical vector of length q-1. |
A full q by q Toeplitz correlation matrix is parameterized by q-1 reflection coefficients. Each PACF is mapped from an unconstrained working coordinate with tanh; the reflection coefficients are converted to a stable autoregressive representation and then to the implied Toeplitz correlation sequence. This parameterization preserves positive definiteness while allowing every lag correlation to vary indirectly.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(toeplitzm(time), ism(id)) ## End(Not run)## Not run: vsm(toeplitzm(time), ism(id)) ## End(Not run)
tpsmmbwrapper is a wrapper of tpsmmb function from the TPSbits package to avoid version dependencies but if you're using this function for your research please cite the TPSbits package. This function is internally used by the spl2Dmatrices function to get Tensor-Product P-Spline Mixed Model Bits
(design matrices) for use with sommer.
tpsmmbwrapper( columncoordinates, rowcoordinates, data, nsegments=NULL, minbound=NULL, maxbound=NULL, degree = c(3, 3), penaltyord = c(2, 2), nestorder = c(1, 1), asreml = "mbf", eigenvalues = "include", method = "Lee", stub = NULL )tpsmmbwrapper( columncoordinates, rowcoordinates, data, nsegments=NULL, minbound=NULL, maxbound=NULL, degree = c(3, 3), penaltyord = c(2, 2), nestorder = c(1, 1), asreml = "mbf", eigenvalues = "include", method = "Lee", stub = NULL )
columncoordinates |
A string. Gives the name of |
rowcoordinates |
A string. Gives the name of |
data |
A dataframe. Holds the dataset to be used for fitting. |
nsegments |
A list of length 2. Number of segments to split column and row ranges into, respectively (= number of internal knots + 1). If only one number is specified, that value is used in both dimensions. If not specified, (number of unique values - 1) is used in each dimension; for a grid layout (equal spacing) this gives a knot at each data value. |
minbound |
A list of length 2. The lower bound to be used for column and row dimensions respectively; default calculated as the minimum value for each dimension. |
maxbound |
A list of length 2. The upper bound to be used for column and row dimensions respectively; default calculated as the maximum value for each dimension. |
degree |
A list of length 2. The degree of polynomial spline to be used for column and row dimensions respectively; default=3. |
penaltyord |
A list of length 2. The order of differencing for column and row dimensions, respectively; default=2. |
nestorder |
A list of length 2. The order of nesting for column and row dimensions, respectively; default=1 (no nesting). A value of 2 generates a spline with half the number of segments in that dimension, etc. The number of segments in each direction must be a multiple of the order of nesting. |
asreml |
A string. Indicates the types of structures to be generated
for use in asreml models; default
|
eigenvalues |
A string. Indicates whether eigenvalues should be
included within the Z design matrices |
method |
A string. Method for forming the penalty; default= |
stub |
A string. Stub to be attached to names in the |
List of length 7, 8 or 9 (according to the asreml and
eigenvalues parameter settings).
data = the input data frame augmented with structures required
to fit tensor product splines in asreml-R. This data frame can be used
to fit the TPS model.
Added columns:
TP.col, TP.row = column and row coordinates
TP.CxR = combined index for use with smooth x smooth term
TP.C.n for n=1:(diff.c) = X parts of column spline for use
in random model (where diff.c is the order of column differencing)
TP.R.n for n=1:(diff.r) = X parts of row spline for use in
random model (where diff.r is the order of row differencing)
TP.CR.n for n=1:((diff.c*diff.r)) = interaction between the
two X parts for use in fixed model. The first variate is
a constant term which should be omitted from the model when the constant
(1) is present. If all elements are
included in the model then the constant term should be omitted,
eg. y ~ -1 + TP.CR.1 + TP.CR.2 + TP.CR.3 + TP.CR.4 + other terms...
when asreml="grp" or "sepgrp", the spline basis
functions are also added into the data frame. Column numbers for each
term are given in the grp list structure.
mbflist = list that can be used in call to asreml (so long as Z
matrix data frames extracted with right names, eg BcZ<stub>.df)
BcZ.df = mbf data frame mapping onto smooth part of column
spline, last column (labelled TP.col) gives column index
BrZ.df = mbf data frame mapping onto smooth part of row spline,
last column (labelled TP.row) gives row index
BcrZ.df = mbf data frame mapping onto smooth x smooth term, last
column (labelled TP.CxR) maps onto col x row combined index
dim = list structure, holding dimension values relating to the
model:
"diff.c" = order of differencing used in column dimension
"nbc" = number of random basis functions in column dimension
"nbcn" = number of nested random basis functions in column dimension
used in smooth x smooth term
"diff.r" = order of differencing used in column dimension
"nbr" = number of random basis functions in column dimension
"nbrn" = number of nested random basis functions in column dimension
used in smooth x smooth term
trace = list of trace values for ZGZ' for the random TPspline
terms, where Z is the design matrix and G
is the known diagonal variance matrix derived from eigenvalues. This can
be used to rescale the spline design matrix (or equivalently variance
components).
grp = list structure, only added for settings
asreml="grp", asreml="sepgrp" or asreml="own".
For asreml="grp", provides column indexes for each of the 5
random components of the 2D splines.
For asreml="sepgrp", provides column indexes for each of the X and
Z component matrices for the 1D splines, plus the composite smooth x
smooth interaction term. For asreml="own", provides column indexes
for the composite random model.
Dimensions of the components can be derived from the values in the
dim item. The Z terms are scaled by the associated
eigenvalues when eigenvalues="include", but not when
eigenvalues="omit".
eigen = list structure, only added for option setting
eigenvalues="omit". Holds the diagonal elements of the inverse
variance matrix for the terms Xc:Zr (called diagr), Zc:Xr
(called diagc) and Zc:Zr (called diagcr).
unsm creates a square matrix with ones in the diagonals and 2's in the off-diagonals to quickly specify an unstructured constraint in the Gtc argument of the vsm function.
unsm(x, reps=NULL)unsm(x, reps=NULL)
x |
integer specifying the number of traits to be fitted for a given random effect. |
reps |
integer specifying the number of times the matrix should be repeated in a list format to provide easily the constraints in complex models that use the ds(), us() or cs() structures. |
a matrix or a list of matrices with the constraints to be provided in the Gtc argument of the vsm function.
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
unsm(3) unsm(3,2)unsm(3) unsm(3,2)
Unstructured positive-definite covariance structure. The returned dimensionless covariance shape is intended for use inside vsm, which supplies the single overall variance scale.
usm(x, theta = NULL, fixed = NULL)usm(x, theta = NULL, fixed = NULL)
x |
Variable or design defining q covariance levels. |
theta |
Optional positive-definite q by q starting covariance matrix. |
fixed |
Logical vector of length q(q+1)/2 - 1 controlling the estimable normalized-Cholesky parameters. |
The covariance shape is parameterized as
with lower-triangular and . Diagonal elements after the first are positive and represented on log scales; lower off-diagonal elements are unrestricted. This guarantees positive definiteness without repeatedly repairing an unconstrained covariance matrix.
A list containing the incidence/design matrix in Z and a compiled CovarianceFactor v2 descriptor in covFactor, for use inside vsm.
## Not run: vsm(usm(environment), ism(genotype)) ## End(Not run)## Not run: vsm(usm(environment), ism(genotype)) ## End(Not run)
mmer and vsr
Creates an unstructured variance-covariance component pattern for use by the mmer covariance-model interface, typically inside vsr.
usr(x)usr(x)
x |
A factor, character vector, numeric vector, or design/incidence matrix defining the covariance dimension. Factor and character inputs are expanded to incidence columns. A matrix is used directly. |
usr() is part of the covariance-structure interface used by mmer/vsr; it is distinct from usm, which belongs to the newer mmes/vsm CovarianceFactor interface.
After constructing the design matrix , the function calls unsm(q), where is the number of columns of , to create the thetaC pattern for an unstructured covariance matrix. Thus the associated covariance model permits a separate variance for every level and a separate covariance for every pair of levels:
The exact component coding is stored in the matrix returned by unsm(q) and passed to the vsr machinery through thetaC.
For a factor or character vector, missing observations are retained through the construction of the incidence matrix. For a numeric non-factor input, x is treated as a single design column.
A list with components:
Z: the design/incidence matrix associated with the covariance dimension.
thetaC: the unstructured covariance-component pattern produced by unsm().
# Unstructured covariance pattern across three levels U <- usr(factor(c("A","B","A","C"))) U$Z U$thetaC# Unstructured covariance pattern across three levels U <- usr(factor(c("A","B","A","C"))) U$Z U$thetaC
The vcc argument of mmes constrains groups of covariance
parameters to be equal or to keep fixed ratios.
Parameters are identified through the vcParams table.
Parameters are estimated on transformed scales that guarantee valid
covariance matrices (log for variances, atanh or bounded logits for
correlations). A constraint is enforced exactly when it is affine on that
scale, which covers equalities of any parameter and ratios of positive
parameters (a log-scale offset). Relations such as
are not affine on the log scale and are not supported.
Internally the free working parameters are written as . Each
average-information update is projected onto this set in the information
metric, which equals the constrained Newton step, and then repaired exactly;
both the Henderson and the direct engines support constraints. The covariance
of the estimates is , so constrained
parameters share their standard errors.
mmes(..., returnParam = TRUE)$vcParams (before fitting) and
fit$vcParams (after fitting) list every covariance parameter with
columns index, term, parameter, kind,
start (natural scale), free, structure and position
(and group when constraints were used). kind is "scale"
for the variance scale (sigma2) owned by each vsm() term, or the
transform used to estimate the parameter: "exp" (positive quantities
such as ranges and variance ratios), "identity" (e.g. Cholesky or
factor-analytic loadings), "tanh" or "bounded_logit"
(correlation-type parameters).
vcc is a data frame with columns
the index of the parameter, or its name
"term:parameter" (e.g. "vsm(ism(B)):sigma2"); the
parameter name alone is accepted when unique.
parameters with the same group value are constrained together.
optional, default 1: each member equals scale times the
first member of its group (natural scale). Scaling is allowed for
"scale", "exp" and "identity" parameters; correlation-type
parameters can only be equated.
All members of a group must have the same kind: variance scales can be
constrained with other variance scales, and other parameters with parameters
estimated through the same transform. If any member of a group is fixed, the
whole group is fixed at the value implied by that member. Starting values of
the members are made consistent with the first (or fixed) member.
data(DT_yatesoats, package = "enhancer") DT <- DT_yatesoats p <- mmes(Y ~ V * N, random = ~ B + B:MP, rcov = ~ units, data = DT, returnParam = TRUE) p$vcParams # block and whole-plot variances equal m1 <- mmes(Y ~ V * N, random = ~ B + B:MP, rcov = ~ units, data = DT, vcc = data.frame(parameter = c(1, 2), group = 1), verbose = FALSE) # block variance twice the whole-plot variance m2 <- mmes(Y ~ V * N, random = ~ B + B:MP, rcov = ~ units, data = DT, vcc = data.frame(parameter = c("vsm(ism(B:MP)):sigma2", "vsm(ism(B)):sigma2"), group = 1, scale = c(1, 2)), verbose = FALSE) unlist(m2$covPar)data(DT_yatesoats, package = "enhancer") DT <- DT_yatesoats p <- mmes(Y ~ V * N, random = ~ B + B:MP, rcov = ~ units, data = DT, returnParam = TRUE) p$vcParams # block and whole-plot variances equal m1 <- mmes(Y ~ V * N, random = ~ B + B:MP, rcov = ~ units, data = DT, vcc = data.frame(parameter = c(1, 2), group = 1), verbose = FALSE) # block variance twice the whole-plot variance m2 <- mmes(Y ~ V * N, random = ~ B + B:MP, rcov = ~ units, data = DT, vcc = data.frame(parameter = c("vsm(ism(B:MP)):sigma2", "vsm(ism(B)):sigma2"), group = 1, scale = c(1, 2)), verbose = FALSE) unlist(m2$covPar)
vpredict method for class "mmes".
Post-analysis procedure to calculate linear combinations of variance components. Its intended use is when the variance components are either simple variances or are variances and covariances in an unstructured matrix. The functions covered are linear combinations of the variance components (for example, phenotypic variance), a ratio of two components (for example, heritabilities) and the correlation based on three components (for example, genetic correlation).
The calculations are based on the estimated variance parameters and their variance matrix as represented by the inverse of the Fisher or Average information matrix. Note that this matrix has zero values for fixed variance parameters including those near the parameter space boundary.
The transform is specified with a formula. On the left side of the formula is a name for the transformation. On the right side of the formula is a transformation specified with shortcut names like 'V1', 'V2', etc. The easiest way to identify these shortcut names is to use 'summary(object)$varcomp'. The rows of this object can referred to with shortcuts 'V1', 'V2', etc. See the example below.
vpredict(object, transform) ## S3 method for class 'mmes' vpredict(object, transform)vpredict(object, transform) ## S3 method for class 'mmes' vpredict(object, transform)
object |
a model fitted with the mmes function. |
transform |
a formula to calculate the function. |
The delta method (e.g., Lynch and Walsh 1998, Appendix 1; Ver Hoef 2012) uses
a Taylor series expansion to approximate the moments of a function of
parameters. Here, a second-order Taylor series expansion is implemented to
approximate the standard error for a function of (co)variance parameters.
Partial first derivatives of the function are calculated by algorithmic
differentiation with deriv.
Though vpredict can calculate standard errors for non-linear functions
of (co)variance parameters from a fitted mmes model, it is limited
to non-linear functions constructed by mathematical operations such as the
arithmetic operators +, -, *, / and ^,
and single-variable functions such as exp and log. See
deriv for more information.
dd |
the parameter and its standard error. |
Giovanny Covarrubias
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
Lynch, M. and B. Walsh 1998. Genetics and Analysis of Quantitative Traits. Sinauer Associates, Inc., Sunderland, MA, USA.
Ver Hoef, J.M. 2012. Who invented the delta method? The American Statistician 66:124-127. DOI: 10.1080/00031305.2012.687494
####=========================================#### ####=========================================#### #### EXAMPLE 1 #### simple example with univariate models ####=========================================#### ####=========================================#### # data(DT_cpdata, package="enhancer") # DT <- DT_cpdata # GT <- GT_cpdata # MP <- MP_cpdata # #### create the variance-covariance matrix # A <- A.mat(GT) # #### look at the data and fit the model # head(DT) # mix1 <- mmes(Yield~1, # random=~vsm(ism(id),Gu=A), # data=DT) # summary(mix1)$varcomp # #### run the vpredict function # vpredict(mix1, h2 ~ V1 / ( V1 + V2 ) )####=========================================#### ####=========================================#### #### EXAMPLE 1 #### simple example with univariate models ####=========================================#### ####=========================================#### # data(DT_cpdata, package="enhancer") # DT <- DT_cpdata # GT <- GT_cpdata # MP <- MP_cpdata # #### create the variance-covariance matrix # A <- A.mat(GT) # #### look at the data and fit the model # head(DT) # mix1 <- mmes(Yield~1, # random=~vsm(ism(id),Gu=A), # data=DT) # summary(mix1)$varcomp # #### run the vpredict function # vpredict(mix1, h2 ~ V1 / ( V1 + V2 ) )
vs DEPRECATED NOW. was the main function to build the variance-covariance structure for the random effects to be fitted in the mmer solver.
vs(..., Gu=NULL, Gti=NULL, Gtc=NULL, reorderGu=TRUE, buildGu=TRUE)vs(..., Gu=NULL, Gti=NULL, Gtc=NULL, reorderGu=TRUE, buildGu=TRUE)
... |
variance structure to be specified following the logic desired in the internal kronecker product. For example, if user wants to define a diagonal variance structure for the random effect 'genotypes'(g) with respect to a random effect 'environments'(e), this is:
being
One strength of sommer is the ability to specify very complex structures with as many kronecker products as desired. For example:
is equivalent to
where different covariance structures can be applied to the levels of |
Gu |
matrix with the known variance-covariance values for the levels of the u.th random effect (i.e. relationship matrix among individuals or any other known covariance matrix). If |
Gti |
matrix with dimensions t x t (t equal to number of traits) with initial values of the variance-covariance components for the random effect specified in the .... argument. If |
Gtc |
matrix with dimensions t x t (t equal to number of traits) of constraints for the variance-covariance components for the random effect specified in the ... argument according to the following rules:
In the multi-response scenario if the user doesn't specify this argument the default is to build an unstructured matrix (using the |
reorderGu |
a |
buildGu |
a |
When providing initial values in the Gti argument the user has to provide scaled variance component values. The user can provide values from a previous model by accessing the sigma_scaled output from an mmer model or if an specific value is desired the user can obtain the scaled value as:
m = x/var(y)
where x is the desired initial value and y is the response variable. You can find an example in the DT_cpdata dataset.
a list with all neccesary elements (incidence matrices, known var-cov structures, unknown covariance structures to be estimated and constraints) to be used in the mmer solver.
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
Covarrubias-Pazaran G (2018) Software update: Moving the R package sommer to multivariate mixed models for genome-assisted prediction. doi: https://doi.org/10.1101/354639
The core function of the package: mmer
data(DT_example, package="enhancer") DT <- DT_example A <- A_example ## ============================ ## ## example to without structure ## ============================ ## mix <- mmer(Yield~Env, random= ~ vs(Name), rcov=~ vs(units), data=DT)data(DT_example, package="enhancer") DT <- DT_example A <- A_example ## ============================ ## ## example to without structure ## ============================ ## mix <- mmer(Yield~Env, random= ~ vs(Name), rcov=~ vs(units), data=DT)
vsm constructs random-effect or residual covariance structures for
mmes. Covariance-shaping terms are represented by CovarianceFactor v2
descriptors and may be combined in an arbitrary-depth Kronecker product. A
single product-level variance, , is owned by vsm, which
avoids scale confounding among the individual covariance factors.
vsm(..., Gu = NULL, sigma2 = NULL, fixedSigma2 = FALSE, rotation = FALSE, isFixed = FALSE, verbose = TRUE)vsm(..., Gu = NULL, sigma2 = NULL, fixedSigma2 = FALSE, rotation = FALSE, isFixed = FALSE, verbose = TRUE)
... |
One or more covariance-constructor terms. The last term supplies
the main-effect incidence matrix. All preceding terms are covariance-shaping
factors. Examples include |
Gu |
Optional known precision matrix for the levels of the final
main-effect term. For
|
sigma2 |
Positive starting value for the single overall covariance
scale of this |
fixedSigma2 |
Logical indicating whether the product-level
|
rotation |
Logical indicating whether the supplied |
isFixed |
Logical retained for compatibility. If |
verbose |
Logical controlling messages, including notification when
levels present in |
Let be the dimensionless covariance shapes supplied by
the covariance constructors. The covariance represented by one vsm
term is
For a random effect with known relationship precision Gu, the factor
product determines the covariance among the crossed covariance coordinates and
Gu determines the relationship structure among the levels of the final
main effect.
The final argument in ... is the main-effect incidence term. Every term
before it is a covariance-shaping factor. Thus
vsm(dsm(location), ar1m(row), ism(genotype), Gu=Ainv) represents a
location-by-row covariance shape crossed with genotype. Kronecker ordering is
left to right: earlier factors are the slow index and later factors are the fast
index.
All optimizer coordinates are stored on unconstrained working scales. Each
CovarianceFactor descriptor also carries its evaluator, derivative strategy,
reporting transformation, and trust-region caps. Built-in high-use structures
may use native C++ covariance primitives, while newer or user-defined
structures can use generic R callbacks without requiring changes to
ai_mme_sp2.
For residual covariance models, the covariance-shaping factors must define
exactly one product coordinate for each observation. mmes combines
that local coordinate with an independently constructed residual block index,
so a large observation-level identity design is not materialized.
When rotation=TRUE, Gu is decomposed as
where is diagonal. The aligned original precision, diagonal
precision, and eigenvectors are retained in the returned descriptor. The
mmes front end validates the observation layout and applies the
engine-specific rotation after observation filtering. Residual covariance
must satisfy , where index
relationship levels and index rotation blocks, so that
; otherwise mmes stops with an error.
A list containing the random-effect design blocks in Z, the precision
matrix in Gu, the flattened Kronecker descriptor in covStruct,
the product design, and, for residual models, the local covariance-coordinate
index. When rotation is requested, GuRot contains the diagonal
precision and rotation contains its eigen metadata. The
covStruct object contains descriptor version 2
CovarianceFactor objects.
mmes, ism, dsm, atm, usm,
csm, ar1m, ar2m, ar3m,
mam,
corgm, fam, antem, rrm,
maternm, toeplitzm, sar, car,
and ownm. See dsumm for section-specific (direct-sum)
residual structures.
####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example head(DT) str(with(DT, vsm(dsm(Env),ism(Name)))) str(with(DT, vsm(csm(Env),ism(Name)))) str(with(DT, vsm(toeplitzm(Env),ism(Name)))) ## Gu in 3-column (row, column, value) format with level names in rowNames Ainv <- data.frame(Row=c(1,2,2,3), Column=c(1,1,2,3), Ainverse=c(2,-1,2,1)) attr(Ainv, "rowNames") <- c("a","b","c") id <- factor(c("a","b","c","a")) str(vsm(ism(id), Gu=Ainv)$Gu)####=========================================#### #### For CRAN time limitations most lines in the #### examples are silenced with one '#' mark, #### remove them and run the examples ####=========================================#### data(DT_example, package="enhancer") DT <- DT_example head(DT) str(with(DT, vsm(dsm(Env),ism(Name)))) str(with(DT, vsm(csm(Env),ism(Name)))) str(with(DT, vsm(toeplitzm(Env),ism(Name)))) ## Gu in 3-column (row, column, value) format with level names in rowNames Ainv <- data.frame(Row=c(1,2,2,3), Column=c(1,1,2,3), Ainverse=c(2,-1,2,1)) attr(Ainv, "rowNames") <- c("a","b","c") id <- factor(c("a","b","c","a")) str(vsm(ism(id), Gu=Ainv)$Gu)
vsr DEPRECATED NOW. was the main function to build the variance-covariance structure for the random effects to be fitted in the mmer solver.
vsr(..., Gu=NULL, Gti=NULL, Gtc=NULL, reorderGu=TRUE, buildGu=TRUE)vsr(..., Gu=NULL, Gti=NULL, Gtc=NULL, reorderGu=TRUE, buildGu=TRUE)
... |
variance structure to be specified following the logic desired in the internal kronecker product. For example, if user wants to define a diagonal variance structure for the random effect 'genotypes'(g) with respect to a random effect 'environments'(e), this is:
being
One strength of sommer is the ability to specify very complex structures with as many kronecker products as desired. For example:
is equivalent to
where different covariance structures can be applied to the levels of |
Gu |
matrix with the known variance-covariance values for the levels of the u.th random effect (i.e. relationship matrix among individuals or any other known covariance matrix). If |
Gti |
matrix with dimensions t x t (t equal to number of traits) with initial values of the variance-covariance components for the random effect specified in the .... argument. If |
Gtc |
matrix with dimensions t x t (t equal to number of traits) of constraints for the variance-covariance components for the random effect specified in the ... argument according to the following rules:
In the multi-response scenario if the user doesn't specify this argument the default is to build an unstructured matrix (using the |
reorderGu |
a |
buildGu |
a |
When providing initial values in the Gti argument the user has to provide scaled variance component values. The user can provide values from a previous model by accessing the sigma_scaled output from an mmer model or if an specific value is desired the user can obtain the scaled value as:
m = x/var(y)
where x is the desired initial value and y is the response variable. You can find an example in the DT_cpdata dataset.
a list with all neccesary elements (incidence matrices, known var-cov structures, unknown covariance structures to be estimated and constraints) to be used in the mmer solver.
Giovanny Covarrubias-Pazaran
Covarrubias-Pazaran G (2016) Genome assisted prediction of quantitative traits using the R package sommer. PLoS ONE 11(6): doi:10.1371/journal.pone.0156744
Covarrubias-Pazaran G (2018) Software update: Moving the R package sommer to multivariate mixed models for genome-assisted prediction. doi: https://doi.org/10.1101/354639
data(DT_example, package="enhancer") DT <- DT_example A <- A_example ## ============================ ## ## example to without structure ## ============================ ## mix <- mmer(Yield~Env, random= ~ vsr(Name), rcov=~ vsr(units), data=DT)data(DT_example, package="enhancer") DT <- DT_example A <- A_example ## ============================ ## ## example to without structure ## ============================ ## mix <- mmer(Yield~Env, random= ~ vsr(Name), rcov=~ vsr(units), data=DT)
Pseudo analysis of variance for the fixed terms of an mmes fit,
based on incremental or conditional Wald statistics, with chi-square,
residual, Satterthwaite or Kenward-Roger reference distributions.
wald_mmes(object, ssType = c("incremental", "conditional"), denDF = c("none", "residual", "satterthwaite", "kr"), terms = NULL)wald_mmes(object, ssType = c("incremental", "conditional"), denDF = c("none", "residual", "satterthwaite", "kr"), terms = NULL)
object |
a model of class |
ssType |
|
denDF |
|
terms |
optional subset of fixed terms (as named in |
Let be the covariance of the fixed effects and .
For a given order of the terms, the upper Cholesky factor of
defines ; the incremental Wald statistic of a term is the sum of the
squared elements of belonging to it, i.e. a test of with
the corresponding rows of . Conditional tests use the order
[terms not containing the tested term, tested term, terms containing it].
For Satterthwaite and Kenward-Roger df the model inputs are rebuilt from the
stored call and is re-evaluated at perturbed covariance
parameters (on the reported scale of covPar); its numerical first and
second derivatives give the quantities and the Kenward-Roger
adjustment. The covariance of the covariance parameters is theta_se,
the inverse average information. The second-derivative term of
enters through the Hessian of ; it vanishes for
variance-component models, where the method is the exact Kenward-Roger
approximation. Because the average (rather than expected) information is
used, df can differ slightly from software using the expected information.
The re-evaluation requires the data and objects used in the original call
to be available, REML estimation, and a Gaussian fit.
anova(object) with a single model returns wald_mmes(object, ...).
A data frame of class "wald.mmes" with columns Df,
denDF, Wald, F.value and p.value, one row per term.
Kenward MG and Roger JH (1997). Small sample inference for fixed effects from restricted maximum likelihood. Biometrics 53: 983-997.
mmes, predict.mmes, anova.mmes
data(DT_yatesoats, package = "enhancer") m <- mmes(Y ~ V * N, random = ~ B + B:MP, rcov = ~ units, data = DT_yatesoats, verbose = FALSE) wald_mmes(m) wald_mmes(m, ssType = "conditional", denDF = "kr")data(DT_yatesoats, package = "enhancer") m <- mmes(Y ~ V * N, random = ~ B + B:MP, rcov = ~ units, data = DT_yatesoats, verbose = FALSE) wald_mmes(m) wald_mmes(m, ssType = "conditional", denDF = "kr")