Fit a model using DLR's (1977) Expectation-Maximization (EM) algorithm
The EM algorithm constitutes the following steps: Start with an initial parameter vector. Predict the missing data to form a completed data model. Optimize the completed data model to obtain a new parameter vector. Repeat these steps until convergence criteria are met.
mxComputeEM( expectation = NULL, predict = NA_character_, mstep, observedFit = "fitfunction", ..., maxIter = 500L, tolerance = 1e-09, verbose = 0L, freeSet = NA_character_, accel = "varadhan2008", information = NA_character_, infoArgs = list(), estep = NULL )
expectation |
|
predict |
|
mstep |
a compute plan to optimize the completed data model |
observedFit |
the name of the observed data fit function (defaults to "fitfunction") |
... |
Not used. Forces remaining arguments to be specified by name. |
maxIter |
maximum number of iterations |
tolerance |
optimization is considered converged when the maximum relative change in fit is less than tolerance |
verbose |
integer. Level of run-time diagnostic output. Set to zero to disable |
freeSet |
names of matrices containing free variables |
accel |
name of acceleration method ("varadhan2008" or "ramsay1975") |
information |
name of information matrix approximation method |
infoArgs |
arguments to control the information matrix method |
estep |
a compute plan to perform the expectation step |
The arguments to this function have evolved. The old style
mxComputeEM(e,p,mstep=m)
is equivalent to the new style
mxComputeEM(estep=mxComputeOnce(e,p), mstep=m)
. This change
allows the API to more closely match the literature on the E-M
method. You might use mxAlgebra(..., recompute='onDemand')
to
contain the results of the E-step and then cause this algebra to
be recomputed using mxComputeOnce
.
This compute plan does not work with any and all expectations. It requires a special kind of expectation that can predict its missing data to create a completed data model.
The EM algorithm does not produce a parameter covariance matrix for standard errors. The Oakes (1999) direct method and S-EM, an implementation of Meng & Rubin (1991), are included.
Ramsay (1975) was recommended in Bock, Gibbons, & Muraki (1988).
Bock, R. D., Gibbons, R., & Muraki, E. (1988). Full-information item factor analysis. Applied Psychological Measurement, 6(4), 431-444.
Dempster, A. P., Laird, N. M., & Rubin, D. B. (1977). Maximum likelihood from incomplete data via the EM algorithm. Journal of the Royal Statistical Society. Series B (Methodological), 1-38.
Meng, X.-L. & Rubin, D. B. (1991). Using EM to obtain asymptotic variance-covariance matrices: The SEM algorithm. Journal of the American Statistical Association, 86 (416), 899-909.
Oakes, D. (1999). Direct calculation of the information matrix via the EM algorithm. Journal of the Royal Statistical Society: Series B (Statistical Methodology), 61(2), 479-482.
Ramsay, J. O. (1975). Solving implicit equations in psychometric data analysis. Psychometrika, 40 (3), 337-360.
Varadhan, R. & Roland, C. (2008). Simple and globally convergent methods for accelerating the convergence of any EM algorithm. Scandinavian Journal of Statistics, 35, 335-353.
library(OpenMx) set.seed(190127) N <- 200 x <- matrix(c(rnorm(N/2,0,1), rnorm(N/2,3,1)),ncol=1,dimnames=list(NULL,"x")) data4mx <- mxData(observed=x,type="raw") class1 <- mxModel("Class1", mxMatrix(type="Full",nrow=1,ncol=1,free=TRUE,values=0,name="Mu"), mxMatrix(type="Full",nrow=1,ncol=1,free=TRUE,values=4,name="Sigma"), mxExpectationNormal(covariance="Sigma",means="Mu",dimnames="x"), mxFitFunctionML(vector=TRUE)) class2 <- mxRename(class1, "Class2") mm <- mxModel( "Mixture", data4mx, class1, class2, mxAlgebra((1-Posteriors) * Class1.fitfunction, name="PL1"), mxAlgebra(Posteriors * Class2.fitfunction, name="PL2"), mxAlgebra(PL1 + PL2, name="PL"), mxAlgebra(PL2 / PL, recompute='onDemand', initial=matrix(runif(N,.4,.6), nrow=N, ncol = 1), name="Posteriors"), mxAlgebra(-2*sum(log(PL)), name="FF"), mxFitFunctionAlgebra(algebra="FF"), mxComputeEM( estep=mxComputeOnce("Mixture.Posteriors"), mstep=mxComputeGradientDescent(fitfunction="Mixture.fitfunction"))) mm <- mxOption(mm, "Max minutes", 1/20) # remove this line to find optimum mmfit <- mxRun(mm) summary(mmfit)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.