Provides sampling and density functions for matrix variate normal, *t*, and inverted *t* distributions; ML estimation

using the EM algorithm for matrix variate normal and *t* distributions including some restrictions on the parameters; and classification by linear and quadratic discriminant analysis for matrix variate normal and *t* distributions. Performs clustering with matrix variate normal and *t* mixture models.

See the vignettes for an example of how it works.

It is currently possible to constrain the mean matrices for normal and *t* distributed matrices to have a common mean across rows, columns, or both, as well as AR(1), compound symmetric, on identity covariance matrices across rows, columns, or both in the maximum likelihood estimation functions and the LDA and QDA functions. In the mixture model function, it is possible to have a common mean within groups across rows, columns, or both.

There are some other R packages you may be interested in if you are working with matrix-variate distributions. The excellent matrixsampling package has sampling and distribution functions for these and many other matrix distributions, as does LaplacesDemon. The MatrixLDA package performs LDA for normal distributions with penalized likelihood.

Install from CRAN by running:

`install.packages('MixMatrix')`

The development version of the software can be installed by running:

`devtools::install_github("gzt/MixMatrix")`

The various `r*`

and `d*`

functions return or take as input an array indexed by the third dimension.

```
meanmatrix = matrix(1:12, nrow = 3)
A = rmatrixnorm(n = 10, mean = meanmatrix, U = diag(3), V = diag(4))
A[,,1:2]
dmatrixnorm(A, mean = meanmatrix, U = diag(3), V = diag(4), log = TRUE)
```

The package presents a method of maximum likelihood estimation of the parameters of the matrix variate *t* distribution using ECME.

```
X = rmatrixt(n = 100, mean = meanmatrix, U = diag(3), V = diag(4), df = 10)
MLmatrixt(X, fixed = FALSE) # fixed = FALSE indicates to estimate the DF parameter
```

Because it might be useful in conjunction with the `r*`

and `d*`

functions, the package also includes some convenience functions for generating AR(1) and compound symmetry correlation matrices.

```
ARgenerate(5, .5)
CSgenerate(5, .5)
```

The package also presents linear discriminant analysis and quadratic discriminant analysis for matrix variate distributions in the case of the normal and the *t*-distribution. In the case of the *t*, linear and quadratic refer whether the covariance matrices are constrained to be the same between classes rather than the form of the classifier.

```
A <- rmatrixnorm(30,mean=matrix(0,nrow=3,ncol=4))
B <- rmatrixnorm(30,mean=matrix(1,nrow=3,ncol=4), U = 2 * ARgenerate(3, .8))
C <- array(c(A,B), dim=c(3,4,60))
groups <- c(rep(1,30),rep(2,30))
prior <- c(.5,.5)
D <- matrixqda(C, groups, prior)
predict(D)$posterior[1:10,]
```

In the future, this will include a more comprehensive treatment of matrix variate mixture modeling, including complete specification of covariance matrices in mixture modeling after the style of Mclust, t-Eigen, and other similar work.

```
### set two different matrix variate populations and combine into one array
A <- rmatrixnorm(30,mean=matrix(0,nrow=3,ncol=4))
B <- rmatrixnorm(30,mean=matrix(1,nrow=3,ncol=4), U = 2 * ARgenerate(3, .8))
C <- array(c(A,B), dim=c(3,4,60))
groups <- c(rep(1,30),rep(2,30))
prior <- c(.5,.5)
### set up the mixture model
D <- matrixmixture(C, prior, row.mean = TRUE, tolerance = 1e-2)
### print the results, the final mixing proportion, the log-likelihood,
### the BIC, and a plot of the log-likelihood.
print(D$centers) # the final centers
print(D$pi) # the final mixing proportion
logLik(D)
BIC(logLik(D))
plot(D) # the log likelihood by iteration
```

Please let me know if you have any issues or suggestions here: https://github.com/gzt/MixMatrix/issues

Please note that the `MixMatrix`

project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.