% File src/library/stats/man/anova.mlm.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2014 R Core Team
% Distributed under GPL 2 or later

\name{anova.mlm}
\alias{anova.mlm}
%\alias{anova.mlmlist}
\title{Comparisons between Multivariate Linear Models}
\description{
  Compute a (generalized) analysis of variance table for one or more
  multivariate linear models.
}
\usage{
\method{anova}{mlm}(object, \dots,
      test = c("Pillai", "Wilks", "Hotelling-Lawley", "Roy",
               "Spherical"),
      Sigma = diag(nrow = p), T = Thin.row(proj(M) - proj(X)),
      M = diag(nrow = p), X = ~0,
      idata = data.frame(index = seq_len(p)), tol = 1e-7)
}
\arguments{
  \item{object}{an object of class \code{"mlm"}.}
  \item{\dots}{further objects of class \code{"mlm"}.}
  \item{test}{choice of test statistic (see below).  Can be abbreviated.}
  \item{Sigma}{(only relevant if  \code{test == "Spherical"}).  Covariance
    matrix assumed proportional to \code{Sigma}.}
  \item{T}{transformation matrix.  By default computed from \code{M} and
    \code{X}.}
  \item{M}{formula or matrix describing the outer projection (see below).}
  \item{X}{formula or matrix describing the inner projection (see below).}
  \item{idata}{data frame describing intra-block design.}
  % avoid Matrix's grab of qr.
  \item{tol}{tolerance to be used in deciding if the residuals are
    rank-deficient: see \code{\link{qr}}.}
}
\details{
  The \code{anova.mlm} method uses either a multivariate test statistic for
  the summary table, or a test based on sphericity assumptions (i.e.
  that the covariance is proportional to a given matrix).

  For the multivariate test, Wilks' statistic is most popular in the
  literature, but the default Pillai--Bartlett statistic is
  recommended by Hand and Taylor (1987).  See
  \code{\link{summary.manova}} for further details.

  For the \code{"Spherical"} test, proportionality is usually with the
  identity matrix but a different matrix can be specified using \code{Sigma}.
  Corrections for asphericity known as the Greenhouse--Geisser,
  respectively Huynh--Feldt, epsilons are given and adjusted \eqn{F} tests are
  performed.

  It is common to transform the observations prior to testing. This
  typically involves
  transformation to intra-block differences, but more complicated
  within-block designs can be encountered,
  making more elaborate transformations necessary.  A
  transformation matrix \code{T} can be given directly or specified as
  the difference between two projections onto the spaces spanned by
  \code{M} and \code{X}, which in turn can be given as matrices or as
  model formulas with respect to \code{idata} (the tests will be
  invariant to parametrization of the quotient space \code{M/X}).

  As with \code{anova.lm}, all test statistics use the SSD matrix from
  the largest model considered as the (generalized) denominator.

  Contrary to other \code{anova} methods, the intercept is not excluded
  from the display in the single-model case.  When contrast
  transformations are involved, it often makes good sense to test for a
  zero intercept.
}
\value{
   An object of class \code{"anova"} inheriting from class \code{"data.frame"}
}
\note{
  The Huynh--Feldt epsilon differs from that calculated by SAS (as of
  v.\sspace{}8.2) except when the DF is equal to the number of observations
  minus one.  This is believed to be a bug in SAS, not in \R.
}

\references{
  Hand, D. J. and Taylor, C. C.  (1987)
  \emph{Multivariate Analysis of Variance and Repeated Measures.}
  Chapman and Hall.
}

%% Probably use example from Baron/Li
\seealso{
  \code{\link{summary.manova}}
}
\examples{
require(graphics)
utils::example(SSD) # Brings in the mlmfit and reacttime objects

mlmfit0 <- update(mlmfit, ~0)

### Traditional tests of intrasubj. contrasts
## Using MANOVA techniques on contrasts:
anova(mlmfit, mlmfit0, X = ~1)

## Assuming sphericity
anova(mlmfit, mlmfit0, X = ~1, test = "Spherical")


### tests using intra-subject 3x2 design
idata <- data.frame(deg = gl(3, 1, 6, labels = c(0, 4, 8)),
                    noise = gl(2, 3, 6, labels = c("A", "P")))

anova(mlmfit, mlmfit0, X = ~ deg + noise,
      idata = idata, test = "Spherical")
anova(mlmfit, mlmfit0, M = ~ deg + noise, X = ~ noise,
      idata = idata, test = "Spherical" )
anova(mlmfit, mlmfit0, M = ~ deg + noise, X = ~ deg,
      idata = idata, test = "Spherical" )

f <- factor(rep(1:2, 5)) # bogus, just for illustration
mlmfit2 <- update(mlmfit, ~f)
anova(mlmfit2, mlmfit, mlmfit0, X = ~1, test = "Spherical")
anova(mlmfit2, X = ~1, test = "Spherical")
# one-model form, eqiv. to previous

### There seems to be a strong interaction in these data
plot(colMeans(reacttime))
}
\keyword{regression}
\keyword{models}
\keyword{multivariate}
