From 67889247ad30d25463e5f0b7e5c123952f7509e9 Mon Sep 17 00:00:00 2001 From: Marius Date: Thu, 11 Jul 2019 12:10:36 +0200 Subject: [PATCH] Create package structure and upload code --- .Rbuildignore | 3 + .gitignore | 6 + DESCRIPTION | 50 ++++ NAMESPACE | 19 ++ R/FData.R | 39 ++++ R/ModelSNMoE.R | 76 ++++++ R/ModelStMoE.R | 76 ++++++ R/ModelTMoE.R | 76 ++++++ R/ParamSNMoE.R | 147 ++++++++++++ R/ParamStMoE.R | 165 +++++++++++++ R/ParamTMoE.R | 149 ++++++++++++ R/RcppExports.R | 11 + R/StatSNMoE.R | 193 +++++++++++++++ R/StatStMoE.R | 244 +++++++++++++++++++ R/StatTMoE.R | 186 +++++++++++++++ R/emSNMoE.R | 118 ++++++++++ R/emStMoE.R | 122 ++++++++++ R/emTMoE.R | 121 ++++++++++ R/meteorit-package.R | 9 + R/utils.R | 109 +++++++++ README.Rmd | 67 ++++++ data/simulatedstructureddata.rda | Bin 0 -> 7078 bytes inst/CITATION | 97 ++++++++ man/FData-class.Rd | 23 ++ man/ModelSNMoE-class.Rd | 23 ++ man/ModelStMoE-class.Rd | 23 ++ man/ModelTMoE-class.Rd | 23 ++ man/ParamSNMoE-class.Rd | 41 ++++ man/ParamStMoE-class.Rd | 52 +++++ man/ParamTMoE-class.Rd | 39 ++++ man/StatSNMoE-class.Rd | 95 ++++++++ man/StatStMoE-class.Rd | 103 ++++++++ man/StatTMoE-class.Rd | 90 +++++++ man/emSNMoE.Rd | 62 +++++ man/emStMoE.Rd | 65 ++++++ man/emTMoE.Rd | 65 ++++++ man/figures/README-unnamed-chunk-5-1.png | Bin 0 -> 61270 bytes man/figures/README-unnamed-chunk-5-2.png | Bin 0 -> 67952 bytes man/figures/README-unnamed-chunk-5-3.png | Bin 0 -> 66559 bytes man/figures/README-unnamed-chunk-5-4.png | Bin 0 -> 28085 bytes man/figures/README-unnamed-chunk-5-5.png | Bin 0 -> 27666 bytes meteorit.Rproj | 20 ++ src/.gitignore | 3 + src/IRLS.cpp | 284 +++++++++++++++++++++++ src/Makevars | 2 + src/Makevars.win | 3 + src/RcppExports.cpp | 48 ++++ src/multinomialLogit.cpp | 117 ++++++++++ src/multinomialLogit.h | 9 + vignettes/.gitignore | 2 + vignettes/A-quick-tour-of-SNMoE.Rmd | 94 ++++++++ vignettes/A-quick-tour-of-StMoE.Rmd | 93 ++++++++ vignettes/A-quick-tour-of-tMoE.Rmd | 92 ++++++++ 53 files changed, 3554 insertions(+) create mode 100644 .Rbuildignore create mode 100644 .gitignore create mode 100644 DESCRIPTION create mode 100644 NAMESPACE create mode 100644 R/FData.R create mode 100644 R/ModelSNMoE.R create mode 100644 R/ModelStMoE.R create mode 100644 R/ModelTMoE.R create mode 100755 R/ParamSNMoE.R create mode 100755 R/ParamStMoE.R create mode 100755 R/ParamTMoE.R create mode 100644 R/RcppExports.R create mode 100755 R/StatSNMoE.R create mode 100755 R/StatStMoE.R create mode 100755 R/StatTMoE.R create mode 100755 R/emSNMoE.R create mode 100755 R/emStMoE.R create mode 100755 R/emTMoE.R create mode 100644 R/meteorit-package.R create mode 100644 R/utils.R create mode 100644 README.Rmd create mode 100644 data/simulatedstructureddata.rda create mode 100644 inst/CITATION create mode 100644 man/FData-class.Rd create mode 100644 man/ModelSNMoE-class.Rd create mode 100644 man/ModelStMoE-class.Rd create mode 100644 man/ModelTMoE-class.Rd create mode 100644 man/ParamSNMoE-class.Rd create mode 100644 man/ParamStMoE-class.Rd create mode 100644 man/ParamTMoE-class.Rd create mode 100644 man/StatSNMoE-class.Rd create mode 100644 man/StatStMoE-class.Rd create mode 100644 man/StatTMoE-class.Rd create mode 100644 man/emSNMoE.Rd create mode 100644 man/emStMoE.Rd create mode 100644 man/emTMoE.Rd create mode 100644 man/figures/README-unnamed-chunk-5-1.png create mode 100644 man/figures/README-unnamed-chunk-5-2.png create mode 100644 man/figures/README-unnamed-chunk-5-3.png create mode 100644 man/figures/README-unnamed-chunk-5-4.png create mode 100644 man/figures/README-unnamed-chunk-5-5.png create mode 100644 meteorit.Rproj create mode 100644 src/.gitignore create mode 100644 src/IRLS.cpp create mode 100644 src/Makevars create mode 100644 src/Makevars.win create mode 100644 src/RcppExports.cpp create mode 100644 src/multinomialLogit.cpp create mode 100644 src/multinomialLogit.h create mode 100644 vignettes/.gitignore create mode 100644 vignettes/A-quick-tour-of-SNMoE.Rmd create mode 100644 vignettes/A-quick-tour-of-StMoE.Rmd create mode 100644 vignettes/A-quick-tour-of-tMoE.Rmd diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..931662b --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,3 @@ +^.*\.Rproj$ +^\.Rproj\.user$ +^README\.Rmd$ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53b5c81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +.Rproj.user +.Rhistory +.RData +.Ruserdata +inst/doc diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..e7d949f --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,50 @@ +Type: Package +Package: meteorit +Title: Mixtures-of-ExperTs modEling for cOmplex and non-noRmal dIsTributions +Version: 0.1.0 +Authors@R: c(person("Faicel", "Chamroukhi", role = c("aut"), + email = "faicel.chamroukhi@unicaen.fr", + comment = c(ORCID = "0000-0002-5894-3103")), + person("Marius", "Bartcus", role = c("aut"), + email = "marius.bartcus@gmail.com"), + person("Florian", "Lecocq", role = c("aut", "cre"), + email = "florian.lecocq@outlook.com")) +Description: MEteoritS is a toolbox containg several original and flexible mixtures-of-experts models to model, + cluster and classify heteregenous data in many complex situations where the data are distributed according non-normal, + possibly skewed distributions, and when they might be corrupted by atypical observations. + The toolbox contains in particular sparse mixture-of-experts models for high-dimensional data. +License: GPL (>= 3) +Depends: + R (>= 2.10) +Imports: + methods, + stats, + Rcpp +Suggests: + knitr, + rmarkdown +LinkingTo: + Rcpp, + RcppArmadillo +Collate: + meteorit-package.R + RcppExports.R + utils.R + FData.R + ParamSNMoE.R + ParamStMoE.R + ParamTMoE.R + StatSNMoE.R + StatStMoE.R + StatTMoE.R + ModelSNMoE.R + ModelStMoE.R + ModelTMoE.R + emSNMoE.R + emStMoE.R + emTMoE.R +VignetteBuilder: knitr +Encoding: UTF-8 +LazyData: true +Roxygen: list(markdown = TRUE) +RoxygenNote: 6.1.1 diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..54722a6 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,19 @@ +# Generated by roxygen2: do not edit by hand + +export(emSNMoE) +export(emStMoE) +export(emTMoE) +exportClasses(FData) +exportClasses(ModelSNMoE) +exportClasses(ModelStMoE) +exportClasses(ModelTMoE) +exportClasses(ParamSNMoE) +exportClasses(ParamStMoE) +exportClasses(ParamTMoE) +exportClasses(StatSNMoE) +exportClasses(StatStMoE) +exportClasses(StatTMoE) +import(methods) +importFrom(Rcpp,sourceCpp) +importFrom(pracma,fzero) +useDynLib(meteorit, .registration = TRUE) diff --git a/R/FData.R b/R/FData.R new file mode 100644 index 0000000..0c46ebf --- /dev/null +++ b/R/FData.R @@ -0,0 +1,39 @@ +#' A Reference Class which represents functional data. +#' +#' FData is a reference class which represents general independent and +#' identically distributed (i.i.d.) functional objects. The data can be +#' ordered by time (functional time series). In the last case, the field `X` +#' represents the time. +#' +#' @field X Numeric vector of length \emph{m}. +#' @field Y Matrix of size \eqn{(n, m)} representing \emph{n} +#' functions of `X` observed at points \eqn{1,\dots,m}. +#' @export +FData <- setRefClass( + "FData", + fields = list( + X = "numeric", # Covariates + Y = "matrix", # Response + m = "numeric", + n = "numeric", + vecY = "matrix" + ), + methods = list( + + initialize = function(X = numeric(1), Y = matrix(1)) { + + X <<- X + Y <<- as.matrix(Y) + + n <<- nrow(Y) + m <<- ncol(Y) + + vecY <<- matrix(t(Y), ncol = 1) + + if (n == 1) { + Y <<- t(Y) + } + + } + ) +) diff --git a/R/ModelSNMoE.R b/R/ModelSNMoE.R new file mode 100644 index 0000000..4314940 --- /dev/null +++ b/R/ModelSNMoE.R @@ -0,0 +1,76 @@ +#' A Reference Class which represents a fitted SNMoE model. +#' +#' ModelSNMoE represents a [SNMoE][ModelSNMoE] model for which parameters have +#' been estimated. +#' +#' @usage NULL +#' @field param A [ParamSNMoE][ParamSNMoE] object. It contains the estimated values of the parameters. +#' @field stat A [StatSNMoE][StatSNMoE] object. It contains all the statistics associated to the SNMoE model. +#' @seealso [ParamSNMoE], [StatSNMoE] +#' @export +ModelSNMoE <- setRefClass( + "ModelSNMoE", + fields = list( + param = "ParamSNMoE", + stat = "StatSNMoE" + ), + methods = list( + plot = function(what = c("meancurve", "confregions", "clusters", "loglikelihood"), ...) { + + what <- match.arg(what, several.ok = TRUE) + + oldpar <- par(no.readonly = TRUE) + on.exit(par(oldpar), add = TRUE) + + colorsvec = rainbow(param$K) + + if (any(what == "meancurve")) { + par(mfrow = c(2, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated mean and experts") + for (k in 1:param$K) { + lines(param$fData$X, stat$Ey_k[, k], col = "red", lty = "dotted", lwd = 1.5, ...) + } + lines(param$fData$X, stat$Ey, col = "red", lwd = 1.5, ...) + + plot.default(param$fData$X, stat$piik[, 1], type = "l", xlab = "x", ylab = "Mixing probabilities", col = colorsvec[1], ...) + title(main = "Mixing probabilities") + for (k in 2:param$K) { + lines(param$fData$X, stat$piik[, k], col = colorsvec[k], ...) + } + } + + if (any(what == "confregions")) { + # Data, Estimated mean functions and 2*sigma confidence regions + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated mean and confidence regions") + lines(param$fData$X, stat$Ey, col = "red", lwd = 1.5, ...) + lines(param$fData$X, stat$Ey - 2 * sqrt(stat$Vary), col = "red", lty = "dotted", lwd = 1.5, ...) + lines(param$fData$X, stat$Ey + 2 * sqrt(stat$Vary), col = "red", lty = "dotted", lwd = 1.5, ...) + } + + if (any(what == "clusters")) { + # Obtained partition + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated experts and clusters") + for (k in 1:param$K) { + lines(param$fData$X, stat$Ey_k[, k], col = colorsvec[k], lty = "dotted", lwd = 1.5, ...) + } + for (k in 1:param$K) { + index <- stat$klas == k + points(param$fData$X[index], param$fData$Y[index, ], col = colorsvec[k], cex = 0.7, pch = 3, ...) + } + } + + if (any(what == "loglikelihood")) { + # Observed data log-likelihood + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(unlist(stat$stored_loglik), type = "l", col = "blue", xlab = "EM iteration number", ylab = "Observed data log-likelihood", ...) + title(main = "Log-Likelihood") + } + + } + ) +) diff --git a/R/ModelStMoE.R b/R/ModelStMoE.R new file mode 100644 index 0000000..116c249 --- /dev/null +++ b/R/ModelStMoE.R @@ -0,0 +1,76 @@ +#' A Reference Class which represents a fitted StMoE model. +#' +#' ModelStMoE represents a [StMoE][ModelStMoE] model for which parameters have +#' been estimated. +#' +#' @usage NULL +#' @field param A [ParamStMoE][ParamStMoE] object. It contains the estimated values of the parameters. +#' @field stat A [StatStMoE][StatStMoE] object. It contains all the statistics associated to the StMoE model. +#' @seealso [ParamStMoE], [StatStMoE] +#' @export +ModelStMoE <- setRefClass( + "ModelStMoE", + fields = list( + param = "ParamStMoE", + stat = "StatStMoE" + ), + methods = list( + plot = function(what = c("meancurve", "confregions", "clusters", "loglikelihood"), ...) { + + what <- match.arg(what, several.ok = TRUE) + + oldpar <- par(no.readonly = TRUE) + on.exit(par(oldpar), add = TRUE) + + colorsvec = rainbow(param$K) + + if (any(what == "meancurve")) { + par(mfrow = c(2, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated mean and experts") + for (k in 1:param$K) { + lines(param$fData$X, stat$Ey_k[, k], col = "red", lty = "dotted", lwd = 1.5, ...) + } + lines(param$fData$X, stat$Ey, col = "red", lwd = 1.5, ...) + + plot.default(param$fData$X, stat$piik[, 1], type = "l", xlab = "x", ylab = "Mixing probabilities", col = colorsvec[1], ...) + title(main = "Mixing probabilities") + for (k in 2:param$K) { + lines(param$fData$X, stat$piik[, k], col = colorsvec[k], ...) + } + } + + if (any(what == "confregions")) { + # Data, Estimated mean functions and 2*sigma confidence regions + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated mean and confidence regions") + lines(param$fData$X, stat$Ey, col = "red", lwd = 1.5) + lines(param$fData$X, stat$Ey - 2 * sqrt(stat$Vary), col = "red", lty = "dotted", lwd = 1.5, ...) + lines(param$fData$X, stat$Ey + 2 * sqrt(stat$Vary), col = "red", lty = "dotted", lwd = 1.5, ...) + } + + if (any(what == "clusters")) { + # Obtained partition + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated experts and clusters") + for (k in 1:param$K) { + lines(param$fData$X, stat$Ey_k[, k], col = colorsvec[k], lty = "dotted", lwd = 1.5, ...) + } + for (k in 1:param$K) { + index <- stat$klas == k + points(param$fData$X[index], param$fData$Y[index, ], col = colorsvec[k], cex = 0.7, pch = 3, ...) + } + } + + if (any(what == "loglikelihood")) { + # Observed data log-likelihood + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(unlist(stat$stored_loglik), type = "l", col = "blue", xlab = "EM iteration number", ylab = "Observed data log-likelihood", ...) + title(main = "Log-Likelihood") + } + + } + ) +) diff --git a/R/ModelTMoE.R b/R/ModelTMoE.R new file mode 100644 index 0000000..4934fe5 --- /dev/null +++ b/R/ModelTMoE.R @@ -0,0 +1,76 @@ +#' A Reference Class which represents a fitted TMoE model. +#' +#' ModelMRHLP represents a [TMoE][ModelTMoE] model for which parameters have +#' been estimated. +#' +#' @usage NULL +#' @field param A [ParamTMoE][ParamTMoE] object. It contains the estimated values of the parameters. +#' @field stat A [StatTMoE][StatTMoE] object. It contains all the statistics associated to the TMoE model. +#' @seealso [ParamTMoE], [StatTMoE] +#' @export +ModelTMoE <- setRefClass( + "ModelTMoE", + fields = list( + param = "ParamTMoE", + stat = "StatTMoE" + ), + methods = list( + plot = function(what = c("meancurve", "confregions", "clusters", "loglikelihood"), ...) { + + what <- match.arg(what, several.ok = TRUE) + + oldpar <- par(no.readonly = TRUE) + on.exit(par(oldpar), add = TRUE) + + colorsvec = rainbow(param$K) + + if (any(what == "meancurve")) { + par(mfrow = c(2, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated mean and experts") + for (k in 1:param$K) { + lines(param$fData$X, stat$Ey_k[, k], col = "red", lty = "dotted", lwd = 1.5, ...) + } + lines(param$fData$X, stat$Ey, col = "red", lwd = 1.5, ...) + + plot.default(param$fData$X, stat$piik[, 1], type = "l", xlab = "x", ylab = "Mixing probabilities", col = colorsvec[1], ...) + title(main = "Mixing probabilities") + for (k in 2:param$K) { + lines(param$fData$X, stat$piik[, k], col = colorsvec[k], ...) + } + } + + if (any(what == "confregions")) { + # Data, Estimated mean functions and 2*sigma confidence regions + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated mean and confidence regions") + lines(param$fData$X, stat$Ey, col = "red", lwd = 1.5) + lines(param$fData$X, stat$Ey - 2 * sqrt(stat$Vary), col = "red", lty = "dotted", lwd = 1.5, ...) + lines(param$fData$X, stat$Ey + 2 * sqrt(stat$Vary), col = "red", lty = "dotted", lwd = 1.5, ...) + } + + if (any(what == "clusters")) { + # Obtained partition + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(param$fData$X, param$fData$Y, ylab = "y", xlab = "x", cex = 0.7, pch = 3, ...) + title(main = "Estimated experts and clusters") + for (k in 1:param$K) { + lines(param$fData$X, stat$Ey_k[, k], col = colorsvec[k], lty = "dotted", lwd = 1.5, ...) + } + for (k in 1:param$K) { + index <- stat$klas == k + points(param$fData$X[index], param$fData$Y[index, ], col = colorsvec[k], cex = 0.7, pch = 3, ...) + } + } + + if (any(what == "loglikelihood")) { + # Observed data log-likelihood + par(mfrow = c(1, 1), mai = c(0.6, 1, 0.5, 0.5), mgp = c(2, 1, 0)) + plot.default(unlist(stat$stored_loglik), type = "l", col = "blue", xlab = "EM iteration number", ylab = "Observed data log-likelihood", ...) + title(main = "Log-Likelihood") + } + + } + ) +) diff --git a/R/ParamSNMoE.R b/R/ParamSNMoE.R new file mode 100755 index 0000000..3083180 --- /dev/null +++ b/R/ParamSNMoE.R @@ -0,0 +1,147 @@ +#' A Reference Class which contains parameters of a SNMoE model. +#' +#' ParamSNMoE contains all the parameters of a SNMoE model. +#' +#' @field fData [FData][FData] object representing the sample. +#' @field K The number of mixture components. +#' @field p The order of the polynomial regression. +#' @field q The dimension of the logistic regression. For the purpose of +#' segmentation, it must be set to 1. +#' @field nu degree of freedom +#' @field alpha is the parameter vector of the logistic model with \eqn{alpha_K} being the null vector. +#' @field beta is the vector of regression coefficients of component k, +#' the updates for each of the expert component parameters consist in analytically solving a weighted +#' Gaussian linear regression problem. +#' @field sigma The variances for the \emph{K} mixture component. +#' @field lambda skewness parameter +#' @field delta the skewness parameter lambda (by equivalence delta) +#' @seealso [FData] +#' @export +ParamSNMoE <- setRefClass( + "ParamSNMoE", + fields = list( + fData = "FData", + phiBeta = "list", + phiAlpha = "list", + + K = "numeric", + # number of regimes + p = "numeric", + # dimension of beta (order of polynomial regression) + q = "numeric", + # dimension of w (order of logistic regression) + nu = "numeric", # degree of freedom + + alpha = "matrix", + beta = "matrix", + sigma = "matrix", + lambda = "matrix", + delta = "matrix" + ), + methods = list( + initialize = function(fData = FData(numeric(1), matrix(1)), K = 1, p = 3, q = 1) { + + fData <<- fData + + phiBeta <<- designmatrix(x = fData$X, p = p) + phiAlpha <<- designmatrix(x = fData$X, p = q) + + nu <<- (p + q + 3) * K - (q + 1) + K <<- K + p <<- p + q <<- q + + alpha <<- matrix(0, q + 1, K - 1) + beta <<- matrix(NA, p + 1, K) + sigma <<- matrix(NA, 1, K) + lambda <<- matrix(NA, K) + delta <<- matrix(NA, K) + }, + + initParam = function(try_EM, segmental = FALSE) { + alpha <<- matrix(runif((q + 1) * (K - 1)), nrow = q + 1, ncol = K - 1) #initialisation al??atoire du vercteur param???tre du IRLS + + #Initialise the regression parameters (coeffecients and variances): + if (segmental == FALSE) { + Zik <- zeros(fData$n, K) + + klas <- floor(K * matrix(runif(fData$n), fData$n)) + 1 + + Zik[klas %*% ones(1, K) == ones(fData$n, 1) %*% seq(K)] <- 1 + + Tauik <- Zik + + + #beta <<- matrix(0, modelRHLP$p + 1, modelRHLP$K) + #sigma <<- matrix(0, modelRHLP$K) + + for (k in 1:K) { + Xk <- phiBeta$XBeta * (sqrt(Tauik[, k] %*% ones(1, p + 1))) + yk <- fData$Y * sqrt(Tauik[, k]) + + beta[, k] <<- solve(t(Xk) %*% Xk) %*% t(Xk) %*% yk + + sigma[k] <<- sum(Tauik[, k] * ((fData$Y - phiBeta$XBeta %*% beta[, k]) ^ 2)) / sum(Tauik[, k]) + } + } + else{ + #segmental : segment uniformly the data and estimate the parameters + nk <- round(fData$n / K) - 1 + + for (k in 1:K) { + i <- (k - 1) * nk + 1 + j <- (k * nk) + yk <- matrix(fData$Y[i:j]) + Xk <- phiBeta$XBeta[i:j,] + + beta[, k] <<- solve(t(Xk) %*% Xk) %*% (t(Xk) %*% yk) + + muk <- Xk %*% beta[, k] + + sigma[k] <<- t(yk - muk) %*% (yk - muk) / length(yk) + } + } + + if (try_EM == 1) { + alpha <<- zeros(q + 1, K - 1) + } + + # Initialize the skewness parameter Lambdak (by equivalence delta) + delta <<- -1 + 2 * rand(1, K) + + lambda <<- delta / sqrt(1 - delta ^ 2) + }, + + MStep = function(statSNMoE, verbose_IRLS) { + # M-Step + res_irls <- IRLS(phiAlpha$XBeta, statSNMoE$tik, ones(nrow(statSNMoE$tik), 1), alpha, verbose_IRLS) + statSNMoE$piik <- res_irls$piik + reg_irls <- res_irls$reg_irls + + alpha <<- res_irls$W + + for (k in 1:K) { + #update the regression coefficients + + tauik_Xbeta <- (statSNMoE$tik[, k] %*% ones(1, p + 1)) * phiBeta$XBeta + beta[, k] <<- solve((t(tauik_Xbeta) %*% phiAlpha$XBeta)) %*% (t(tauik_Xbeta) %*% (fData$Y - delta[k] * statSNMoE$E1ik[, k])) + + # update the variances sigma2k + + sigma[k] <<- sum(statSNMoE$tik[, k] * ((fData$Y - phiBeta$XBeta %*% beta[, k]) ^ 2 - 2 * delta[k] * statSNMoE$E1ik[, k] * (fData$Y - phiBeta$XBeta %*% beta[, k]) + statSNMoE$E2ik[, k])) / (2 * (1 - delta[k] ^ 2) * sum(statSNMoE$tik[, k])) + + # update the deltak (the skewness parameter) + delta[k] <<- uniroot(f <- function(dlt) { + sigma[k] * dlt * (1 - dlt ^ 2) * sum(statSNMoE$tik[, k]) + (1 + dlt ^ 2) * sum(statSNMoE$tik[, k] * (fData$Y - phiBeta$XBeta %*% beta[, k]) * statSNMoE$E1ik[, k]) + - dlt * sum(statSNMoE$tik[, k] * (statSNMoE$E2ik[, k] + (fData$Y - phiBeta$XBeta %*% beta[, k]) ^ 2)) + }, c(-1, 1))$root + + + lambda[k] <<- delta[k] / sqrt(1 - delta[k] ^ 2) + + } + + return(reg_irls) + } + ) +) diff --git a/R/ParamStMoE.R b/R/ParamStMoE.R new file mode 100755 index 0000000..29b886f --- /dev/null +++ b/R/ParamStMoE.R @@ -0,0 +1,165 @@ +#' A Reference Class which contains parameters of a MRHLP model. +#' +#' ParamMRHLP contains all the parameters of a MRHLP model. +#' +#' @field fData [FData][FData] object representing the sample. +#' @field K The number of mixture components. +#' @field p The order of the polynomial regression. +#' @field q The dimension of the logistic regression. For the purpose of +#' segmentation, it must be set to 1. +#' @field nu degree of freedom +#' @field alpha is the parameter vector of the logistic model with \eqn{alpha_K} being the null vector. +#' @field beta is the vector of regression coefficients of component k, +#' the updates for each of the expert component parameters consist in analytically solving a weighted +#' Gaussian linear regression problem. +#' @field sigma The variances for the \emph{K} mixture component. +#' @field lambda skewness parameter +#' @field delta the skewness parameter lambda (by equivalence delta) +#' @field nuk degrees of freedom +#' @seealso [FData] +#' @export +ParamStMoE <- setRefClass( + "ParamStMoE", + fields = list( + fData = "FData", + phiBeta = "list", + phiAlpha = "list", + + K = "numeric", + # number of components + p = "numeric", + # dimension of beta (order of polynomial regression) + q = "numeric", + # dimension of w (order of logistic regression) + nu = "numeric", # degree of freedom + + alpha = "matrix", + beta = "matrix", + sigma = "matrix", + lambda = "matrix", + delta = "matrix", + nuk = "matrix" + ), + methods = list( + initialize = function(fData = FData(numeric(1), matrix(1)), K = 1, p = 3, q = 1) { + + fData <<- fData + + phiBeta <<- designmatrix(x = fData$X, p = p) + phiAlpha <<- designmatrix(x = fData$X, p = q) + + nu <<- (p + q + 3) * K - (q + 1) + K <<- K + p <<- p + q <<- q + + alpha <<- matrix(0, q + 1, K - 1) + beta <<- matrix(NA, p + 1, K) + sigma <<- matrix(NA, 1, K) + lambda <<- matrix(NA, K) + delta <<- matrix(NA, K) + }, + + initParam = function(try_EM, segmental = FALSE) { + "Method to initialize parameters \\code{alpha}, \\code{beta} and + \\code{sigma}." + + alpha <<- matrix(runif((q + 1) * (K - 1)), nrow = q + 1, ncol = K - 1) #initialisation al??atoire du vercteur param???tre du IRLS + + #Initialise the regression parameters (coeffecients and variances): + if (segmental == FALSE) { + Zik <- zeros(fData$n, K) + + klas <- floor(K * matrix(runif(fData$n), fData$n)) + 1 + + Zik[klas %*% ones(1, K) == ones(fData$n, 1) %*% seq(K)] <- 1 + + Tauik <- Zik + + + #beta <<- matrix(0, modelRHLP$p + 1, modelRHLP$K) + #sigma <<- matrix(0, modelRHLP$K) + + for (k in 1:K) { + Xk <- phiBeta$XBeta * (sqrt(Tauik[, k] %*% ones(1, p + 1))) + yk <- fData$Y * sqrt(Tauik[, k]) + + beta[, k] <<- solve(t(Xk) %*% Xk) %*% t(Xk) %*% yk + + sigma[k] <<- sum(Tauik[, k] * ((fData$Y - phiBeta$XBeta %*% beta[, k]) ^ 2)) / sum(Tauik[, k]) + } + } + else{ + #segmental : segment uniformly the data and estimate the parameters + nk <- round(fData$n / K) - 1 + + for (k in 1:K) { + i <- (k - 1) * nk + 1 + j <- (k * nk) + yk <- matrix(fData$Y[i:j]) + Xk <- phiBeta$XBeta[i:j,] + + beta[, k] <<- solve(t(Xk) %*% Xk) %*% (t(Xk) %*% yk) + + muk <- Xk %*% beta[, k] + + sigma[k] <<- t(yk - muk) %*% (yk - muk) / length(yk) + } + } + + if (try_EM == 1) { + alpha <<- rand(q + 1, K - 1) + } + + # Initialize the skewness parameter Lambdak (by equivalence delta) + delta <<- -0.9 + 1.8 * rand(1, K) + + lambda <<- delta / sqrt(1 - delta ^ 2) + + # Intitialization of the degrees of freedm + nuk <<- 1 + 5 * rand(1, K) + }, + + MStep = function(statStMoE, verbose_IRLS) { + "Method used in the EM algorithm to learn the parameters of the StMoE model + based on statistics provided by \\code{statStMoE}." + # M-Step + res_irls <- IRLS(phiAlpha$XBeta, statStMoE$tik, ones(nrow(statStMoE$tik), 1), alpha, verbose_IRLS) + # statStMoE$piik <- res_irls$piik + reg_irls <- res_irls$reg_irls + + alpha <<- res_irls$W + + for (k in 1:K) { + #update the regression coefficients + TauikWik <- (statStMoE$tik[,k] * statStMoE$wik[,k]) %*% ones(1, p+1) + TauikX <- phiBeta$XBeta * (statStMoE$tik[,k] %*% ones(1, p+1)) + betak <- solve((t(TauikWik * phiBeta$XBeta) %*% phiAlpha$XBeta)) %*% (t(TauikX) %*% ( (statStMoE$wik[,k] * fData$Y) - (delta[k] * statStMoE$E1ik[ ,k]) )) + + beta[,k] <<- betak; + # update the variances sigma2k + + sigma[k] <<- sum(statStMoE$tik[, k]*(statStMoE$wik[,k] * ((fData$Y-phiBeta$XBeta%*%betak)^2) - 2 * delta[k] * statStMoE$E1ik[,k] * (fData$Y - phiBeta$XBeta %*% betak) + statStMoE$E2ik[,k]))/(2*(1-delta[k]^2) * sum(statStMoE$tik[,k])) + + sigmak <- sqrt(sigma[k]) + + # update the deltak (the skewness parameter) + delta[k] <<- uniroot(f <- function(dlt) { + return(dlt*(1-dlt^2)*sum(statStMoE$tik[, k]) + + (1+ dlt^2)*sum(statStMoE$tik[, k] * statStMoE$dik[,k]*statStMoE$E1ik[,k]/sigmak) + - dlt * sum(statStMoE$tik[, k] * (statStMoE$wik[,k] * (statStMoE$dik[,k]^2) + statStMoE$E2ik[,k]/(sigmak^2)))) + }, c(-1, 1))$root + + + lambda[k] <<- delta[k] / sqrt(1 - delta[k] ^ 2) + + + nuk[k] <<- uniroot(f <- function(nnu) { + return(- psigamma((nnu)/2) + log((nnu)/2) + 1 + sum(statStMoE$tik[,k] * (statStMoE$E3ik[,k] - statStMoE$wik[,k]))/sum(statStMoE$tik[,k])) + }, c(0.1, 200))$root + } + + return(reg_irls) + } + ) +) diff --git a/R/ParamTMoE.R b/R/ParamTMoE.R new file mode 100755 index 0000000..cf3fb4a --- /dev/null +++ b/R/ParamTMoE.R @@ -0,0 +1,149 @@ +#' A Reference Class which contains parameters of a TMoE model. +#' +#' ParamTMoE contains all the parameters of a TMoE model. +#' +#' @field fData [FData][FData] object representing the sample. +#' @field K The number of mixture components. +#' @field p The order of the polynomial regression. +#' @field q The dimension of the logistic regression. For the purpose of +#' segmentation, it must be set to 1. +#' @field nu degree of freedom +#' @field alpha is the parameter vector of the logistic model with \eqn{alpha_K} being the null vector. +#' @field beta is the vector of regression coefficients of component k, +#' the updates for each of the expert component parameters consist in analytically solving a weighted +#' Gaussian linear regression problem. +#' @field sigma The variances for the \emph{K} mixture component. +#' @field delta the skewness parameter lambda (by equivalence delta) +#' @seealso [FData] +#' @importFrom pracma fzero +#' @export +ParamTMoE <- setRefClass( + "ParamTMoE", + fields = list( + fData = "FData", + phiBeta = "list", + phiAlpha = "list", + + K = "numeric", + # number of regimes + p = "numeric", + # dimension of beta (order of polynomial regression) + q = "numeric", + # dimension of w (order of logistic regression) + nu = "numeric", # degree of freedom + + alpha = "matrix", + beta = "matrix", + sigma = "matrix", + delta = "matrix" + ), + methods = list( + initialize = function(fData = FData(numeric(1), matrix(1)), K = 1, p = 3, q = 1) { + + fData <<- fData + + phiBeta <<- designmatrix(x = fData$X, p = p) + phiAlpha <<- designmatrix(x = fData$X, p = q) + + K <<- K + p <<- p + q <<- q + + nu <<- (p + q + 3) * K - (q + 1) + + alpha <<- matrix(0, q + 1, K - 1) + beta <<- matrix(NA, p + 1, K) + sigma <<- matrix(NA, 1, K) + delta <<- matrix(NA, K) + }, + + initParam = function(try_EM, segmental = FALSE) { + alpha <<- matrix(runif((q + 1) * (K - 1)), nrow = q + 1, ncol = K - 1) #initialisation aleatoire du vercteur parametre du IRLS + + #Initialise the regression parameters (coeffecients and variances): + if (segmental == FALSE) { + Zik <- zeros(n, K) + + klas <- floor(K * matrix(runif(fData$n), fData$n)) + 1 + + Zik[klas %*% ones(1, K) == ones(fData$n, 1) %*% seq(K)] <- 1 + + Tauik <- Zik + + #beta <<- matrix(0, modelRHLP$p + 1, modelRHLP$K) + #sigma <<- matrix(0, modelRHLP$K) + + for (k in 1:K) { + Xk <- phiBeta$XBeta * (sqrt(Tauik[, k] %*% ones(1, p + 1))) + yk <- fData$Y * sqrt(Tauik[, k]) + + beta[, k] <<- solve(t(Xk) %*% Xk) %*% t(Xk) %*% yk + + sigma[k] <<- sum(Tauik[, k] * ((fData$Y - phiBeta$XBeta %*% beta[, k]) ^ 2)) / sum(Tauik[, k]) + } + } + else{ + #segmental : segment uniformly the data and estimate the parameters + nk <- round(fData$n / K) - 1 + + for (k in 1:K) { + i <- (k - 1) * nk + 1 + j <- (k * nk) + yk <- matrix(fData$Y[i:j]) + Xk <- phiBeta$XBeta[i:j,] + + beta[, k] <<- solve(t(Xk) %*% Xk) %*% (t(Xk) %*% yk) + + muk <- Xk %*% beta[, k] + + sigma[k] <<- t(yk - muk) %*% (yk - muk) / length(yk) + } + } + + if (try_EM == 1) { + alpha <<- zeros(q + 1, K - 1) + } + + # Initialize the skewness parameter Lambdak (by equivalence delta) + delta <<- 50 * rand(1, K) + + }, + + MStep = function(statTMoE, verbose_IRLS) { + # M-Step + res_irls <- IRLS(phiAlpha$XBeta, statTMoE$tik, ones(nrow(statTMoE$tik), 1), alpha, verbose_IRLS) + statTMoE$piik <- res_irls$piik + reg_irls <- res_irls$reg_irls + + alpha <<- res_irls$W + + for (k in 1:K) { + #update the regression coefficients + + Xbeta <- phiBeta$XBeta * (matrix( sqrt(statTMoE$tik[,k] * statTMoE$Wik[,k] )) %*% ones(1, p + 1)) + yk <- fData$Y * sqrt(statTMoE$tik[,k] * statTMoE$Wik[,k]) + + #update the regression coefficients + beta[, k] <<- solve((t(Xbeta) %*% Xbeta)) %*% (t(Xbeta) %*% yk) + + # update the variances sigma2k + sigma[k] <<- sum(statTMoE$tik[, k] * statTMoE$Wik[,k] * ((fData$Y - phiBeta$XBeta %*% beta[, k])^2)) / sum(statTMoE$tik[,k]) + + # if ECM (use an additional E-Step with the updatated betak and sigma2k + dik <- (fData$Y - phiBeta$XBeta %*% beta[, k]) / sqrt(sigma[k]) + + + # update the deltak (the skewness parameter) + + + delta[k] <<- fzero(f <- function(dlt) { + return(-psigamma(dlt/2) + log(dlt/2) + 1 + (1 / sum(statTMoE$tik[, k])) * sum(statTMoE$tik[, k] * (log(statTMoE$Wik[,k]) - statTMoE$Wik[,k])) + + psigamma((delta[k] + 1)/2) - log((delta[k] + 1)/2)) + }, delta[k])$x + + } + + return(reg_irls) + } + ) +) diff --git a/R/RcppExports.R b/R/RcppExports.R new file mode 100644 index 0000000..b5a8233 --- /dev/null +++ b/R/RcppExports.R @@ -0,0 +1,11 @@ +# Generated by using Rcpp::compileAttributes() -> do not edit by hand +# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +IRLS <- function(X, Tau, Gamma, Winit, verbose = FALSE) { + .Call(`_meteorit_IRLS`, X, Tau, Gamma, Winit, verbose) +} + +multinomialLogit <- function(W, X, Y, Gamma) { + .Call(`_meteorit_multinomialLogit`, W, X, Y, Gamma) +} + diff --git a/R/StatSNMoE.R b/R/StatSNMoE.R new file mode 100755 index 0000000..fda2100 --- /dev/null +++ b/R/StatSNMoE.R @@ -0,0 +1,193 @@ +#' A Reference Class which contains statistics of a SNMoE model. +#' +#' StatMRHLP contains all the parameters of a [SNMoE][ParamSNMoE] model. +#' +#' @field piik Matrix of size \eqn{(n, K)} representing the probabilities +#' \eqn{P(zi = k; W) = P(z_{ik} = 1; W)}{P(zi = k; W) = P(z_ik = 1; W)} of the +#' latent variable \eqn{zi,\ i = 1,\dots,m}{zi, i = 1,\dots,n}. +#' @field z_ik Hard segmentation logical matrix of dimension \eqn{(n, K)} +#' obtained by the Maximum a posteriori (MAP) rule: +#' \eqn{z_{ik} = 1 \ \textrm{if} \ z_{ik} = \textrm{arg} \ \textrm{max}_{k} \ +#' P(z_i = k | Y, W, \beta);\ 0 \ \textrm{otherwise}}{z_ik = 1 if z_ik = +#' arg max_k P(z_i = k | Y, W, \beta); 0 otherwise}, \eqn{k = 1,\dots,K}. +#' @field klas Column matrix of the labels issued from `z_ik`. Its elements are +#' \eqn{klas(i) = k}, \eqn{k = 1,\dots,K}. +#' @field Ey_k Matrix of dimension \emph{(n,K)}. +#' @field Ey Column matrix of dimension \emph{n}. +#' @field Var_yk Column matrix of dimension \emph{K}. +#' @field Vary Column matrix of dimension \emph{n}. +#' @field log\_lik Numeric. Log-likelihood of the SNMoE model. +#' @field com_loglik Numeric. Complete log-likelihood of the SNMoE model. +#' @field stored_loglik List. Stored values of the log-likelihood at each EM +#' iteration. +#' @field BIC Numeric. Value of the BIC (Bayesian Information Criterion) +#' criterion. The formula is \eqn{BIC = log\_lik - nu \times +#' \textrm{log}(n) / 2}{BIC = log\_lik - nu x log(n) / 2} with \emph{nu} the +#' degree of freedom of the SNMoE model. +#' @field ICL Numeric. Value of the ICL (Integrated Completed Likelihood) +#' criterion. The formula is \eqn{ICL = com\_loglik - nu \times +#' \textrm{log}(n) / 2}{ICL = com_loglik - nu x log(n) / 2} with \emph{nu} the +#' degree of freedom of the SNMoE model. +#' @field AIC Numeric. Value of the AIC (Akaike Information Criterion) +#' criterion. The formula is \eqn{AIC = log\_lik - nu}{AIC = log\_lik - nu}. +#' @field log_piik_fik Matrix of size \eqn{(n, K)} giving the values of the +#' logarithm of the joint probability +#' \eqn{P(Y_{i}, \ zi = k)}{P(Yi, zi = k)}, \eqn{i = 1,\dots,n}. +#' @field log_sum_piik_fik Column matrix of size \emph{n} giving the values of +#' \eqn{\sum_{k = 1}^{K} \textrm{log} P(Y_{i}, \ zi = k)}{\sum_{k = 1}^{K} log +#' P(Yi, zi = k)}, \eqn{i = 1,\dots,n}. +#' @field tik Matrix of size \eqn{(n, K)} giving the posterior probability that +#' \eqn{Y_{i}}{Yi} originates from the \eqn{k}-th regression model +#' \eqn{P(zi = k | Y, W, \beta)}. +#' @field E1ik To define. +#' @field E2ik To define. +#' @seealso [ParamSNMoE], [FData] +#' @export +StatSNMoE <- setRefClass( + "StatSNMoE", + fields = list( + piik = "matrix", + z_ik = "matrix", + klas = "matrix", + # Ex = "matrix", + Ey_k = "matrix", + Ey = "matrix", + Var_yk = "matrix", + Vary = "matrix", + log_lik = "numeric", + com_loglik = "numeric", + stored_loglik = "list", + BIC = "numeric", + ICL = "numeric", + AIC = "numeric", + log_piik_fik = "matrix", + log_sum_piik_fik = "matrix", + tik = "matrix", + E1ik = "matrix", + E2ik = "matrix" + ), + methods = list( + initialize = function(paramSNMoE = ParamSNMoE()) { + piik <<- matrix(NA, paramSNMoE$fData$n, paramSNMoE$K) + z_ik <<- matrix(NA, paramSNMoE$fData$n, paramSNMoE$K) + klas <<- matrix(NA, paramSNMoE$fData$n, 1) + Ey_k <<- matrix(NA, paramSNMoE$fData$n, paramSNMoE$K) + Ey <<- matrix(NA, paramSNMoE$fData$n, 1) + Var_yk <<- matrix(NA, 1, paramSNMoE$K) + Vary <<- matrix(NA, paramSNMoE$fData$n, 1) + log_lik <<- -Inf + com_loglik <<- -Inf + stored_loglik <<- list() + BIC <<- -Inf + ICL <<- -Inf + AIC <<- -Inf + log_piik_fik <<- matrix(0, paramSNMoE$fData$n, paramSNMoE$K) + log_sum_piik_fik <<- matrix(NA, paramSNMoE$fData$n, 1) + tik <<- matrix(0, paramSNMoE$fData$n, paramSNMoE$K) + E1ik <<- matrix(0, paramSNMoE$fData$m * paramSNMoE$fData$n, paramSNMoE$K) + E2ik <<- matrix(0, paramSNMoE$fData$m * paramSNMoE$fData$n, paramSNMoE$K) + }, + + MAP = function() { + " + calcule une partition d'un echantillon par la regle du Maximum A Posteriori ?? partir des probabilites a posteriori + Entrees : post_probas , Matrice de dimensions [n x K] des probabibiltes a posteriori (matrice de la partition floue) + n : taille de l'echantillon + K : nombres de classes + klas(i) = arg max (post_probas(i,k)) , for all i=1,...,n + 1<=k<=K + = arg max p(zi=k|xi;theta) + 1<=k<=K + = arg max p(zi=k;theta)p(xi|zi=k;theta)/sum{l=1}^{K}p(zi=l;theta) p(xi|zi=l;theta) + 1<=k<=K + Sorties : classes : vecteur collones contenant les classe (1:K) + Z : Matrice de dimension [nxK] de la partition dure : ses elements sont zik, avec zik=1 si xi + appartient ?? la classe k (au sens du MAP) et zero sinon. + " + N <- nrow(piik) + K <- ncol(piik) + ikmax <- max.col(piik) + ikmax <- matrix(ikmax, ncol = 1) + z_ik <<- ikmax %*% ones(1, K) == ones(N, 1) %*% (1:K) # partition_MAP + klas <<- ones(N, 1) + for (k in 1:K) { + klas[z_ik[, k] == 1] <<- k + } + }, + ####### + # compute loglikelihood + ####### + computeLikelihood = function(reg_irls) { + log_lik <<- sum(log_sum_piik_fik) + reg_irls + + }, + ####### + # + ####### + ####### + # compute the final solution stats + ####### + computeStats = function(paramSNMoE) { + + # E[yi|zi=k] + Ey_k <<- paramSNMoE$phiBeta$XBeta[1:paramSNMoE$fData$n, ] %*% paramSNMoE$beta + ones(paramSNMoE$fData$n, 1) %*% (sqrt(2 / pi) * paramSNMoE$delta * paramSNMoE$sigma) + + # E[yi] + Ey <<- matrix(apply(piik * Ey_k, 1, sum)) + + # Var[yi|zi=k] + Var_yk <<- (1 - (2 / pi) * (paramSNMoE$delta ^ 2)) * (paramSNMoE$sigma ^ 2) + + # Var[yi] + Vary <<- apply(piik * (Ey_k ^ 2 + ones(paramSNMoE$fData$n, 1) %*% Var_yk), 1, sum) - Ey ^ 2 + + + ### BIC AIC et ICL + + BIC <<- log_lik - (paramSNMoE$nu * log(paramSNMoE$fData$n * paramSNMoE$fData$m) / 2) + AIC <<- log_lik - paramSNMoE$nu + ## CL(theta) : complete-data loglikelihood + zik_log_piik_fk <- (repmat(z_ik, paramSNMoE$fData$m, 1)) * log_piik_fik + sum_zik_log_fik <- apply(zik_log_piik_fk, 1, sum) + com_loglik <<- sum(sum_zik_log_fik) + + ICL <<- com_loglik - (paramSNMoE$nu * log(paramSNMoE$fData$n * paramSNMoE$fData$m) / 2) + # solution.XBeta = XBeta(1:m,:); + # solution.XAlpha = XAlpha(1:m,:); + }, + ####### + # EStep + ####### + EStep = function(paramSNMoE) { + "Method used in the EM algorithm to update statistics based on parameters + provided by \\code{paramSNMoE} (prior and posterior probabilities)." + piik <<- multinomialLogit(paramSNMoE$alpha, paramSNMoE$phiAlpha$XBeta, ones(paramSNMoE$fData$n, paramSNMoE$K), ones(paramSNMoE$fData$n, 1))$piik + + piik_fik <- zeros(paramSNMoE$fData$m * paramSNMoE$fData$n, paramSNMoE$K) + + for (k in (1:paramSNMoE$K)) { + muk <- paramSNMoE$phiBeta$XBeta %*% paramSNMoE$beta[, k] + + sigma2k <- paramSNMoE$sigma[k] + sigmak <- sqrt(sigma2k) + dik <- (paramSNMoE$fData$Y - muk) / sigmak + + mu_uk <- (paramSNMoE$delta[k] * abs(paramSNMoE$fData$Y - muk)) + sigma2_uk <- (1 - paramSNMoE$delta[k] ^ 2) * paramSNMoE$sigma[k] + sigma_uk <- sqrt(sigma2_uk) + + E1ik[, k] <<- mu_uk + sigma_uk * dnorm(paramSNMoE$lambda[k] * dik, 0, 1) / pnorm(paramSNMoE$lambda[k] * dik, 0, 1) + E2ik[, k] <<- mu_uk ^ 2 + sigma_uk ^ 2 + sigma_uk * mu_uk * dnorm(paramSNMoE$lambda[k] * dik, 0, 1) / pnorm(paramSNMoE$lambda[k] * dik, 0, 1) + + # weighted skew normal linear expert likelihood + piik_fik[, k] <- piik[, k] * (2 / sigmak) * dnorm(dik, 0, 1) * pnorm(paramSNMoE$lambda[k] * dik) + } + + log_piik_fik <<- log(piik_fik) + + log_sum_piik_fik <<- matrix(log(rowSums(piik_fik))) + + tik <<- piik_fik / (rowSums(piik_fik) %*% ones(1, paramSNMoE$K)) + } + ) +) diff --git a/R/StatStMoE.R b/R/StatStMoE.R new file mode 100755 index 0000000..98c18ad --- /dev/null +++ b/R/StatStMoE.R @@ -0,0 +1,244 @@ +#' A Reference Class which contains statistics of a StMoE model. +#' +#' StatMRHLP contains all the parameters of a [StMoE][ParamStMoE] model. +#' +#' @field piik Matrix of size \eqn{(n, K)} representing the probabilities +#' \eqn{P(zi = k; W) = P(z_{ik} = 1; W)}{P(zi = k; W) = P(z_ik = 1; W)} of the +#' latent variable \eqn{zi,\ i = 1,\dots,m}{zi, i = 1,\dots,n}. +#' @field z_ik Hard segmentation logical matrix of dimension \eqn{(n, K)} +#' obtained by the Maximum a posteriori (MAP) rule: +#' \eqn{z_{ik} = 1 \ \textrm{if} \ z_{ik} = \textrm{arg} \ \textrm{max}_{k} \ +#' P(z_i = k | Y, W, \beta);\ 0 \ \textrm{otherwise}}{z_ik = 1 if z_ik = +#' arg max_k P(z_i = k | Y, W, \beta); 0 otherwise}, \eqn{k = 1,\dots,K}. +#' @field klas Column matrix of the labels issued from `z_ik`. Its elements are +#' \eqn{klas(i) = k}, \eqn{k = 1,\dots,K}. +#' @field Ey_k Matrix of dimension \emph{(n,K)}. +#' @field Ey Column matrix of dimension \emph{n}. +#' @field Var_yk Column matrix of dimension \emph{K}. +#' @field Var_y Column matrix of dimension \emph{n}. +#' @field log\_lik Numeric. Log-likelihood of the StMoE model. +#' @field com_loglik Numeric. Complete log-likelihood of the StMoE model. +#' @field stored_loglik List. Stored values of the log-likelihood at each EM +#' iteration. +#' @field BIC Numeric. Value of the BIC (Bayesian Information Criterion) +#' criterion. The formula is \eqn{BIC = log\_lik - nu \times +#' \textrm{log}(n) / 2}{BIC = log\_lik - nu x log(n) / 2} with \emph{nu} the +#' degree of freedom of the StMoE model. +#' @field ICL Numeric. Value of the ICL (Integrated Completed Likelihood) +#' criterion. The formula is \eqn{ICL = com\_loglik - nu \times +#' \textrm{log}(n) / 2}{ICL = com_loglik - nu x log(n) / 2} with \emph{nu} the +#' degree of freedom of the StMoE model. +#' @field AIC Numeric. Value of the AIC (Akaike Information Criterion) +#' criterion. The formula is \eqn{AIC = log\_lik - nu}{AIC = log\_lik - nu}. +#' @field log_piik_fik Matrix of size \eqn{(n, K)} giving the values of the +#' logarithm of the joint probability +#' \eqn{P(Y_{i}, \ zi = k)}{P(Yi, zi = k)}, \eqn{i = 1,\dots,n}. +#' @field log_sum_piik_fik Column matrix of size \emph{n} giving the values of +#' \eqn{\sum_{k = 1}^{K} \textrm{log} P(Y_{i}, \ zi = k)}{\sum_{k = 1}^{K} log +#' P(Yi, zi = k)}, \eqn{i = 1,\dots,n}. +#' @field tik Matrix of size \eqn{(n, K)} giving the posterior probability that +#' \eqn{Y_{i}}{Yi} originates from the \eqn{k}-th regression model +#' \eqn{P(zi = k | Y, W, \beta)}. +#' @field wik To define. +#' @field dik To define. +#' @field stme_pdf skew-t mixture of experts density +#' @field E1ik To define. +#' @field E2ik To define. +#' @field E3ik To define. +#' @seealso [ParamStMoE], [FData] +#' @export +StatStMoE <- setRefClass( + "StatStMoE", + fields = list( + piik = "matrix", + z_ik = "matrix", + klas = "matrix", + # Ex = "matrix", + Ey_k = "matrix", + Ey = "matrix", + Var_yk = "matrix", + Vary = "matrix", + log_lik = "numeric", + com_loglik = "numeric", + stored_loglik = "list", + BIC = "numeric", + ICL = "numeric", + AIC = "numeric", + log_piik_fik = "matrix", + log_sum_piik_fik = "matrix", + tik = "matrix", + wik = "matrix", + dik = "matrix", + stme_pdf = "matrix", + E1ik = "matrix", + E2ik = "matrix", + E3ik = "matrix" + ), + methods = list( + initialize = function(paramStMoE = ParamStMoE()) { + piik <<- matrix(NA, paramStMoE$fData$n, paramStMoE$K) + z_ik <<- matrix(NA, paramStMoE$fData$n, paramStMoE$K) + klas <<- matrix(NA, paramStMoE$fData$n, 1) + Ey_k <<- matrix(NA, paramStMoE$fData$n, paramStMoE$K) + Ey <<- matrix(NA, paramStMoE$fData$n, 1) + Var_yk <<- matrix(NA, 1, paramStMoE$K) + Vary <<- matrix(NA, paramStMoE$fData$n, 1) + log_lik <<- -Inf + com_loglik <<- -Inf + stored_loglik <<- list() + BIC <<- -Inf + ICL <<- -Inf + AIC <<- -Inf + log_piik_fik <<- matrix(0, paramStMoE$fData$n, paramStMoE$K) + log_sum_piik_fik <<- matrix(NA, paramStMoE$fData$n, 1) + tik <<- matrix(0, paramStMoE$fData$n, paramStMoE$K) + wik <<- matrix(0, paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + dik <<- matrix(0, paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + stme_pdf <<- matrix(0, paramStMoE$fData$n, 1) + E1ik <<- matrix(0, paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + E2ik <<- matrix(0, paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + E3ik <<- matrix(0, paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + }, + + MAP = function() { + " + calcule une partition d'un echantillon par la regle du Maximum A Posteriori ?? partir des probabilites a posteriori + Entrees : post_probas , Matrice de dimensions [n x K] des probabibiltes a posteriori (matrice de la partition floue) + n : taille de l'echantillon + K : nombres de classes + klas(i) = arg max (post_probas(i,k)) , for all i=1,...,n + 1<=k<=K + = arg max p(zi=k|xi;theta) + 1<=k<=K + = arg max p(zi=k;theta)p(xi|zi=k;theta)/sum{l=1}^{K}p(zi=l;theta) p(xi|zi=l;theta) + 1<=k<=K + Sorties : classes : vecteur collones contenant les classe (1:K) + Z : Matrice de dimension [nxK] de la partition dure : ses elements sont zik, avec zik=1 si xi + appartient et la classe k (au sens du MAP) et zero sinon. + " + N <- nrow(piik) + K <- ncol(piik) + ikmax <- max.col(piik) + ikmax <- matrix(ikmax, ncol = 1) + z_ik <<- ikmax %*% ones(1, K) == ones(N, 1) %*% (1:K) # partition_MAP + klas <<- ones(N, 1) + for (k in 1:K) { + klas[z_ik[, k] == 1] <<- k + } + }, + ####### + # compute loglikelihood + ####### + computeLikelihood = function(reg_irls) { + log_lik <<- sum(log_sum_piik_fik) + reg_irls + + }, + ####### + # + ####### + ####### + # compute the final solution stats + ####### + computeStats = function(paramStMoE) { + + Xi_nuk = sqrt(paramStMoE$nuk/pi) * (gamma(paramStMoE$nuk/2 - 1/2)) / (gamma(paramStMoE$nuk/2)); + + # E[yi|zi=k] + Ey_k <<- paramStMoE$phiBeta$XBeta[1:paramStMoE$fData$n, ] %*% paramStMoE$beta + ones(paramStMoE$fData$n, 1) %*% (paramStMoE$delta * sqrt(paramStMoE$sigma) * Xi_nuk) + + # E[yi] + Ey <<- matrix(apply(piik * Ey_k, 1, sum)) + + # Var[yi|zi=k] + Var_yk <<- (paramStMoE$nuk/(paramStMoE$nuk-2) - (paramStMoE$delta^2) * (Xi_nuk^2)) * paramStMoE$sigma + + # Var[yi] + Vary <<- apply(piik * (Ey_k ^ 2 + ones(paramStMoE$fData$n, 1) %*% Var_yk), 1, sum) - Ey ^2 + + + ### BIC AIC et ICL + + BIC <<- log_lik - (paramStMoE$nu * log(paramStMoE$fData$n * paramStMoE$fData$m) / 2) + AIC <<- log_lik - paramStMoE$nu + ## CL(theta) : complete-data loglikelihood + zik_log_piik_fk <- (repmat(z_ik, paramStMoE$fData$m, 1)) * log_piik_fik + sum_zik_log_fik <- apply(zik_log_piik_fk, 1, sum) + com_loglik <<- sum(sum_zik_log_fik) + + ICL <<- com_loglik - (paramStMoE$nu * log(paramStMoE$fData$n * paramStMoE$fData$m) / 2) + # solution.XBeta = XBeta(1:m,:); + # solution.XAlpha = XAlpha(1:m,:); + }, + + ####### + # Intial value for STMoE density + ####### + univStMoEpdf = function(paramStMoE){ + piik <<- multinomialLogit(paramStMoE$alpha, paramStMoE$phiAlpha$XBeta, ones(paramStMoE$fData$n, paramStMoE$K), ones(paramStMoE$fData$n, 1))$piik + + piik_fik <- zeros(paramStMoE$fData$n, paramStMoE$K) + dik <<- zeros(paramStMoE$fData$n, paramStMoE$K) + mik <- zeros(paramStMoE$fData$n, paramStMoE$K) + + for (k in (1:paramStMoE$K)){ + dik[,k] <<- (paramStMoE$fData$Y - paramStMoE$phiBeta$XBeta %*% paramStMoE$beta[, k])/ paramStMoE$sigma[k] + mik[,k] <- paramStMoE$lambda[k] %*% dik[,k] * sqrt(paramStMoE$nuk[k]+1)/(paramStMoE$nuk[k] + dik[,k]^2) + + piik_fik[,k] <- piik[,k]*(2/paramStMoE$sigma[k])*dt(dik[,k], paramStMoE$nuk[k])*pt(mik[,k], paramStMoE$nuk[k]+1) + } + + stme_pdf <<- matrix(rowSums(piik_fik)) # skew-t mixture of experts density + }, + + ####### + # EStep + ####### + EStep = function(paramStMoE) { + "Method used in the EM algorithm to update statistics based on parameters + provided by \\code{paramStMoE} (prior and posterior probabilities)." + piik <<- multinomialLogit(paramStMoE$alpha, paramStMoE$phiAlpha$XBeta, ones(paramStMoE$fData$n, paramStMoE$K), ones(paramStMoE$fData$n, 1))$piik + + piik_fik <- zeros(paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + + dik <<- zeros(paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + mik <- zeros(paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + wik <<- zeros(paramStMoE$fData$m * paramStMoE$fData$n, paramStMoE$K) + + + for (k in (1:paramStMoE$K)) { + muk <- paramStMoE$phiBeta$XBeta %*% paramStMoE$beta[, k] + + sigma2k <- paramStMoE$sigma[k] + sigmak <- sqrt(sigma2k) + dik[,k] <<- (paramStMoE$fData$Y - muk) / sigmak + + mik[,k] <- paramStMoE$lambda[k] %*% dik[,k] * sqrt((paramStMoE$nuk[k] +1)/(paramStMoE$nuk[k] + dik[,k]^2)) + + # E[Wi|yi,zik=1] + wik[,k] <<- ((paramStMoE$nuk[k] + 1)/(paramStMoE$nuk[k] + dik[,k]^2)) * pt(mik[,k]*sqrt((paramStMoE$nuk[k] + 3)/(paramStMoE$nuk[k] + 1)), paramStMoE$nuk[k] + 3)/pt(mik[,k], paramStMoE$nuk[k] + 1) + + # E[Wi Ui |yi,zik=1] + deltak <- paramStMoE$delta[k] + + E1ik[, k] <<- deltak * abs(paramStMoE$fData$Y - muk) * wik[,k] + (sqrt(1 - deltak^2)/(pi * stme_pdf)) * ((dik[,k]^2/(paramStMoE$nuk[k]*(1 - deltak^2)) + 1)^(-(paramStMoE$nuk[k]/2 + 1))) + E2ik[, k] <<- deltak^2 * ((paramStMoE$fData$Y - muk)^2) * wik[,k] + (1 - deltak^2) * sigmak^2 + ((deltak * (paramStMoE$fData$Y - muk) * sqrt(1 - deltak^2))/(pi * stme_pdf)) * (((dik[,k]^2)/(paramStMoE$nuk[k] * (1 - deltak^2)) + 1)^(-(paramStMoE$nuk[k]/2 + 1))) + + Integgtx <- 0 + E3ik[, k] <<- wik[,k] - log((paramStMoE$nuk[k] + dik[,k]^2)/2) -(paramStMoE$nuk[k] + 1)/(paramStMoE$nuk[k] + dik[,k]^2) + psigamma((paramStMoE$nuk[k] + 1)/2) + ((paramStMoE$lambda[k] * dik[,k] * (dik[,k]^2 - 1)) / sqrt((paramStMoE$nuk[k] + 1)*((paramStMoE$nuk[k] + dik[,k]^2)^3))) * dt(mik[,k], paramStMoE$nuk[k]+1) / pt(mik[,k], paramStMoE$nuk[k] + 1) + (1./pt(mik[,k], paramStMoE$nuk[k] + 1)) * Integgtx; + + # weighted skew normal linear expert likelihood + piik_fik[, k] <- piik[, k] * (2 / sigmak) * dt(dik[, k], paramStMoE$nuk[k]) * pt(mik[,k], paramStMoE$nuk[k] + 1); + } + + + stme_pdf <<- matrix(rowSums(piik_fik)) # skew-t mixture of experts density + + log_piik_fik <<- log(piik_fik) + + log_sum_piik_fik <<- matrix(log(rowSums(piik_fik))) + + #E[Zi=k|yi] + tik <<- piik_fik / (stme_pdf %*% ones(1,paramStMoE$K)) + } + ) +) diff --git a/R/StatTMoE.R b/R/StatTMoE.R new file mode 100755 index 0000000..5797a58 --- /dev/null +++ b/R/StatTMoE.R @@ -0,0 +1,186 @@ +#' A Reference Class which contains statistics of a TMoE model. +#' +#' StatTMoE contains all the parameters of a [TMoE][ParamTMoE] model. +#' +#' @field piik Matrix of size \eqn{(n, K)} representing the probabilities +#' \eqn{P(zi = k; W) = P(z_{ik} = 1; W)}{P(zi = k; W) = P(z_ik = 1; W)} of the +#' latent variable \eqn{zi,\ i = 1,\dots,m}{zi, i = 1,\dots,n}. +#' @field z_ik Hard segmentation logical matrix of dimension \eqn{(n, K)} +#' obtained by the Maximum a posteriori (MAP) rule: +#' \eqn{z_{ik} = 1 \ \textrm{if} \ z_{ik} = \textrm{arg} \ \textrm{max}_{k} \ +#' P(z_i = k | Y, W, \beta);\ 0 \ \textrm{otherwise}}{z_ik = 1 if z_ik = +#' arg max_k P(z_i = k | Y, W, \beta); 0 otherwise}, \eqn{k = 1,\dots,K}. +#' @field klas Column matrix of the labels issued from `z_ik`. Its elements are +#' \eqn{klas(i) = k}, \eqn{k = 1,\dots,K}. +#' @field Wik Matrix of dimension \emph{(nm,K)}. +#' @field Ey_k Matrix of dimension \emph{(n,K)}. +#' @field Ey Column matrix of dimension \emph{n}. +#' @field Var_yk Column matrix of dimension \emph{K}. +#' @field Vary Column matrix of dimension \emph{n}. +#' @field log\_lik Numeric. Log-likelihood of the StMoE model. +#' @field com_loglik Numeric. Complete log-likelihood of the StMoE model. +#' @field stored_loglik List. Stored values of the log-likelihood at each EM +#' iteration. +#' @field BIC Numeric. Value of the BIC (Bayesian Information Criterion) +#' criterion. The formula is \eqn{BIC = log\_lik - nu \times +#' \textrm{log}(n) / 2}{BIC = log\_lik - nu x log(n) / 2} with \emph{nu} the +#' degree of freedom of the StMoE model. +#' @field ICL Numeric. Value of the ICL (Integrated Completed Likelihood) +#' criterion. The formula is \eqn{ICL = com\_loglik - nu \times +#' \textrm{log}(n) / 2}{ICL = com_loglik - nu x log(n) / 2} with \emph{nu} the +#' degree of freedom of the StMoE model. +#' @field AIC Numeric. Value of the AIC (Akaike Information Criterion) +#' criterion. The formula is \eqn{AIC = log\_lik - nu}{AIC = log\_lik - nu}. +#' @field log_piik_fik Matrix of size \eqn{(n, K)} giving the values of the +#' logarithm of the joint probability +#' \eqn{P(Y_{i}, \ zi = k)}{P(Yi, zi = k)}, \eqn{i = 1,\dots,n}. +#' @field log_sum_piik_fik Column matrix of size \emph{n} giving the values of +#' \eqn{\sum_{k = 1}^{K} \textrm{log} P(Y_{i}, \ zi = k)}{\sum_{k = 1}^{K} log +#' P(Yi, zi = k)}, \eqn{i = 1,\dots,n}. +#' @field tik Matrix of size \eqn{(n, K)} giving the posterior probability that +#' \eqn{Y_{i}}{Yi} originates from the \eqn{k}-th regression model +#' \eqn{P(zi = k | Y, W, \beta)}. +#' @seealso [ParamStMoE], [FData] +#' @export +StatTMoE <- setRefClass( + "StatTMoE", + fields = list( + piik = "matrix", + z_ik = "matrix", + klas = "matrix", + Wik = "matrix", + # Ex = "matrix", + Ey_k = "matrix", + Ey = "matrix", + Var_yk = "matrix", + Vary = "matrix", + log_lik = "numeric", + com_loglik = "numeric", + stored_loglik = "list", + BIC = "numeric", + ICL = "numeric", + AIC = "numeric", + log_piik_fik = "matrix", + log_sum_piik_fik = "matrix", + tik = "matrix" + ), + methods = list( + initialize = function(paramTMoE = ParamTMoE()) { + piik <<- matrix(NA, paramTMoE$fData$n, paramTMoE$K) + z_ik <<- matrix(NA, paramTMoE$fData$n, paramTMoE$K) + klas <<- matrix(NA, paramTMoE$fData$n, 1) + Wik <<- matrix(0, paramTMoE$fData$n * paramTMoE$fData$m, paramTMoE$K) + Ey_k <<- matrix(NA, paramTMoE$fData$n, paramTMoE$K) + Ey <<- matrix(NA, paramTMoE$fData$n, 1) + Var_yk <<- matrix(NA, 1, paramTMoE$K) + Vary <<- matrix(NA, paramTMoE$fData$n, 1) + log_lik <<- -Inf + com_loglik <<- -Inf + stored_loglik <<- list() + BIC <<- -Inf + ICL <<- -Inf + AIC <<- -Inf + log_piik_fik <<- matrix(0, paramTMoE$fData$n, paramTMoE$K) + log_sum_piik_fik <<- matrix(NA, paramTMoE$fData$n, 1) + tik <<- matrix(0, paramTMoE$fData$n, paramTMoE$K) + }, + + MAP = function() { + " + calcule une partition d'un echantillon par la regle du Maximum A Posteriori ?? partir des probabilites a posteriori + Entrees : post_probas , Matrice de dimensions [n x K] des probabibiltes a posteriori (matrice de la partition floue) + n : taille de l'echantillon + K : nombres de classes + klas(i) = arg max (post_probas(i,k)) , for all i=1,...,n + 1<=k<=K + = arg max p(zi=k|xi;theta) + 1<=k<=K + = arg max p(zi=k;theta)p(xi|zi=k;theta)/sum{l=1}^{K}p(zi=l;theta) p(xi|zi=l;theta) + 1<=k<=K + Sorties : classes : vecteur collones contenant les classe (1:K) + Z : Matrice de dimension [nxK] de la partition dure : ses elements sont zik, avec zik=1 si xi + appartient ?? la classe k (au sens du MAP) et zero sinon. + " + N <- nrow(piik) + K <- ncol(piik) + ikmax <- max.col(piik) + ikmax <- matrix(ikmax, ncol = 1) + z_ik <<- ikmax %*% ones(1, K) == ones(N, 1) %*% (1:K) # partition_MAP + klas <<- ones(N, 1) + for (k in 1:K) { + klas[z_ik[, k] == 1] <<- k + } + }, + ####### + # compute loglikelihood + ####### + computeLikelihood = function(reg_irls) { + log_lik <<- sum(log_sum_piik_fik) + reg_irls + + }, + ####### + # + ####### + ####### + # compute the final solution stats + ####### + computeStats = function(paramTMoE) { + + # E[yi|zi=k] + Ey_k <<- paramTMoE$phiBeta$XBeta[1:paramTMoE$fData$n, ] %*% paramTMoE$beta + + # E[yi] + Ey <<- matrix(apply(piik * Ey_k, 1, sum)) + + # Var[yi|zi=k] + Var_yk <<- paramTMoE$delta/(paramTMoE$delta - 2) * paramTMoE$sigma + + # Var[yi] + Vary <<- apply(piik * (Ey_k ^ 2 + ones(paramTMoE$fData$n, 1) %*% Var_yk), 1, sum) - Ey ^ 2 + + + ### BIC AIC et ICL + + BIC <<- log_lik - (paramTMoE$nu * log(paramTMoE$fData$n * paramTMoE$fData$m) / 2) + AIC <<- log_lik - paramTMoE$nu + ## CL(theta) : complete-data loglikelihood + zik_log_piik_fk <- (repmat(z_ik, paramTMoE$fData$m, 1)) * log_piik_fik + sum_zik_log_fik <- apply(zik_log_piik_fk, 1, sum) + com_loglik <<- sum(sum_zik_log_fik) + + ICL <<- com_loglik - (paramTMoE$nu * log(paramTMoE$fData$n * paramTMoE$fData$m) / 2) + # solution.XBeta = XBeta(1:m,:); + # solution.XAlpha = XAlpha(1:m,:); + }, + ####### + # EStep + ####### + EStep = function(paramTMoE) { + piik <<- multinomialLogit(paramTMoE$alpha, paramTMoE$phiAlpha$XBeta, ones(paramTMoE$fData$n, paramTMoE$K), ones(paramTMoE$fData$n, 1))$piik + piik_fik <- zeros(paramTMoE$fData$m * paramTMoE$fData$n, paramTMoE$K) + + for (k in (1:paramTMoE$K)) { + muk <- paramTMoE$phiBeta$XBeta %*% paramTMoE$beta[, k] + + sigma2k <- paramTMoE$sigma[k] + sigmak <- sqrt(sigma2k) + dik <- (paramTMoE$fData$Y - muk) / sigmak + + + nuk <- paramTMoE$delta[k] + Wik[,k] <<- (nuk + 1)/(nuk + dik^2) + + + # weighted t linear expert likelihood + + piik_fik[, k] <- piik[, k] * (1/sigmak * dt((paramTMoE$fData$Y - muk)/sigmak, nuk)) #pdf('tlocationscale', y, muk, sigmak, nuk); + } + + log_piik_fik <<- log(piik_fik) + + log_sum_piik_fik <<- matrix(log(rowSums(piik_fik))) + + tik <<- piik_fik / (rowSums(piik_fik) %*% ones(1, paramTMoE$K)) + } + ) +) diff --git a/R/emSNMoE.R b/R/emSNMoE.R new file mode 100755 index 0000000..ef064c4 --- /dev/null +++ b/R/emSNMoE.R @@ -0,0 +1,118 @@ +#' emSNMoE is used to fit a SNMoE model. +#' +#' emSNMoE is used to fit a SNMoE model. The estimation method is performed by +#' the Expectation-Maximization algorithm. +#' +#' @details emSNMoE function is based on the EM algorithm. This functions starts +#' with an initialization of the parameters done by the method `initParam` of +#' the class [ParamSNMoE][ParamSNMoE], then it alternates between a E-Step +#' (method of the class [StatSNMoE][StatSNMoE]) and a M-Step (method of the class +#' [ParamSNMoE][ParamSNMoE]) until convergence (until the absolute difference of +#' log-likelihood between two steps of the EM algorithm is less than the +#' `threshold` parameter). +#' +#' @param X Numeric vector of length \emph{m} representing the covariates. +#' @param Y Matrix of size \eqn{(n, m)} representing \emph{n} functions of `X` +#' observed at points \eqn{1,\dots,m}. +#' @param K The number of mixture components. +#' @param p The order of the polynomial regression. +#' @param q The dimension of the logistic regression. For the purpose of +#' segmentation, it must be set to 1. +#' @param n_tries Number of times EM algorithm will be launched. +#' The solution providing the highest log-likelihood will be returned. +#' +#' If `n_tries` > 1, then for the first pass, parameters are initialized +#' by uniformly segmenting the data into K segments, and for the next passes, +#' parameters are initialized by randomly segmenting the data into K contiguous +#' segments. +#' @param max_iter The maximum number of iterations for the EM algorithm. +#' @param threshold A numeric value specifying the threshold for the relative +#' difference of log-likelihood between two steps of the EM as stopping +#' criteria. +#' @param verbose A logical value indicating whether values of the +#' log-likelihood should be printed during EM iterations. +#' @param verbose_IRLS A logical value indicating whether values of the +#' criterion optimized by IRLS should be printed at each step of the EM +#' algorithm. +#' @return EM returns an object of class [ModelSNMoE][ModelSNMoE]. +#' @seealso [ModelSNMoE], [ParamSNMoE], [StatSNMoE] +#' @export +emSNMoE <- function(X, Y, K, p = 3, q = 1, n_tries = 1, max_iter = 1500, threshold = 1e-6, verbose = FALSE, verbose_IRLS = FALSE) { + + fData <- FData(X, Y) + + top <- 0 + try_EM <- 0 + best_loglik <- -Inf + + while (try_EM < n_tries) { + try_EM <- try_EM + 1 + message("EM try nr ", try_EM) + + # Initializations + param <- ParamSNMoE$new(fData = fData, K = K, p = p, q = q) + param$initParam(try_EM, segmental = TRUE) + + + + iter <- 0 + converge <- FALSE + prev_loglik <- -Inf + + stat <- StatSNMoE(paramSNMoE = param) + + while (!converge && (iter <= max_iter)) { + stat$EStep(param) + + reg_irls <- param$MStep(stat, verbose_IRLS) + + stat$computeLikelihood(reg_irls) + # FIN EM + + iter <- iter + 1 + if (verbose) { + message("EM : Iteration : ", iter," log-likelihood : " , stat$log_lik) + } + if (prev_loglik - stat$log_lik > 1e-5) { + message("!!!!! EM log-likelihood is decreasing from ", prev_loglik, "to ", stat$log_lik) + top <- top + 1 + if (top > 20) + break + } + + # TEST OF CONVERGENCE + converge <- abs((stat$log_lik - prev_loglik) / prev_loglik) <= threshold + if (is.na(converge)) { + converge <- FALSE + } # Basically for the first iteration when prev_loglik is Inf + + prev_loglik <- stat$log_lik + stat$stored_loglik[iter] <- stat$log_lik + }# FIN EM LOOP + + # at this point we have computed param and stat that contains all the information + + if (stat$log_lik > best_loglik) { + statSolution <- stat$copy() + paramSolution <- param$copy() + + best_loglik <- stat$log_lik + } + if (n_tries > 1) { + message("max value: ", stat$log_lik) + } + } + + # Computation of c_ig the hard partition of the curves and klas + statSolution$MAP() + + if (n_tries > 1) { + message("max value: ", statSolution$log_lik) + } + + + # FINISH computation of statSolution + statSolution$computeStats(paramSolution) + + return(ModelSNMoE(param = paramSolution, stat = statSolution)) + } diff --git a/R/emStMoE.R b/R/emStMoE.R new file mode 100755 index 0000000..54bc80e --- /dev/null +++ b/R/emStMoE.R @@ -0,0 +1,122 @@ +#' emStMoE is used to fit a StMoE model. +#' +#' emStMoE is used to fit a StMoE model. The estimation method is performed by +#' the Expectation-Maximization algorithm. +#' +#' @details emStMoE function is based on the EM algorithm. This functions starts +#' with an initialization of the parameters done by the method `initParam` of +#' the class [ParamStMoE][ParamStMoE], then it alternates between a E-Step +#' (method of the class [StatStMoE][StatStMoE]) and a M-Step (method of the class +#' [ParamStMoE][ParamStMoE]) until convergence (until the absolute difference of +#' log-likelihood between two steps of the EM algorithm is less than the +#' `threshold` parameter). +#' +#' @param X Numeric vector of length \emph{m} representing the covariates. +#' @param Y Matrix of size \eqn{(n, m)} representing \emph{n} functions of `X` +#' observed at points \eqn{1,\dots,m}. +#' @param K The number of mixture components. +#' @param p The order of the polynomial regression. +#' @param q The dimension of the logistic regression. For the purpose of +#' segmentation, it must be set to 1. +#' @param variance_type Numeric indicating if the model is homoskedastic +#' (`variance_type` = 1) or heteroskedastic (`variance_type` = 2). +#' @param n_tries Number of times EM algorithm will be launched. +#' The solution providing the highest log-likelihood will be returned. +#' +#' If `n_tries` > 1, then for the first pass, parameters are initialized +#' by uniformly segmenting the data into K segments, and for the next passes, +#' parameters are initialized by randomly segmenting the data into K contiguous +#' segments. +#' @param max_iter The maximum number of iterations for the EM algorithm. +#' @param threshold A numeric value specifying the threshold for the relative +#' difference of log-likelihood between two steps of the EM as stopping +#' criteria. +#' @param verbose A logical value indicating whether values of the +#' log-likelihood should be printed during EM iterations. +#' @param verbose_IRLS A logical value indicating whether values of the +#' criterion optimized by IRLS should be printed at each step of the EM +#' algorithm. +#' @return EM returns an object of class [ModelStMoE][ModelStMoE]. +#' @seealso [ModelStMoE], [ParamStMoE], [StatStMoE] +#' @export +emStMoE <- function(X, Y, K, p = 3, q = 1, n_tries = 1, max_iter = 1500, threshold = 1e-6, verbose = FALSE, verbose_IRLS = FALSE) { + + fData <- FData(X, Y) + + top <- 0 + try_EM <- 0 + best_loglik <- -Inf + + while (try_EM < n_tries) { + try_EM <- try_EM + 1 + message("EM try nr ", try_EM) + + # Initializations + param <- ParamStMoE$new(fData = fData, K = K, p = p, q = q) + param$initParam(try_EM, segmental = FALSE) + + + + iter <- 0 + converge <- FALSE + prev_loglik <- -Inf + + stat <- StatStMoE(paramStMoE = param) + stat$univStMoEpdf(param) + + while (!converge && (iter <= max_iter)) { + stat$EStep(param) + + reg_irls <- param$MStep(stat, verbose_IRLS) + + stat$computeLikelihood(reg_irls) + # FIN EM + + iter <- iter + 1 + if (verbose) { + message("EM : Iteration : ", iter," log-likelihood : " , stat$log_lik) + } + if (prev_loglik - stat$log_lik > 1e-5) { + message("!!!!! EM log-likelihood is decreasing from ", prev_loglik, "to ", stat$log_lik) + top <- top + 1 + if (top > 20) + break + } + + # TEST OF CONVERGENCE + converge <- abs((stat$log_lik - prev_loglik) / prev_loglik) <= threshold + if (is.na(converge)) { + converge <- FALSE + } # Basically for the first iteration when prev_loglik is -Inf + + prev_loglik <- stat$log_lik + stat$stored_loglik[iter] <- stat$log_lik + }# FIN EM LOOP + + # end of computation of all estimates (param and stat) + + if (stat$log_lik > best_loglik) { + statSolution <- stat$copy() + paramSolution <- param$copy() + + best_loglik <- stat$log_lik + } + if (n_tries > 1) { + message("max value: ", stat$log_lik) + } + } + + # Computation of c_ig the hard partition of the curves and klas + statSolution$MAP() + + if (n_tries > 1) { + message("max value: ", statSolution$log_lik) + } + + + # FINISH computation of statSolution + statSolution$computeStats(paramSolution) + + return(ModelStMoE(param = paramSolution, stat = statSolution)) + + } diff --git a/R/emTMoE.R b/R/emTMoE.R new file mode 100755 index 0000000..297f1dd --- /dev/null +++ b/R/emTMoE.R @@ -0,0 +1,121 @@ +#' emTMoE is used to fit a TMoE model. +#' +#' emTMoE is used to fit a TMoE model. The estimation method is performed by +#' the Expectation-Maximization algorithm. +#' +#' @details emStMoE function is based on the EM algorithm. This functions starts +#' with an initialization of the parameters done by the method `initParam` of +#' the class [ParamTMoE][ParamTMoE], then it alternates between a E-Step +#' (method of the class [StatTMoE][StatTMoE]) and a M-Step (method of the class +#' [ParamTMoE][ParamTMoE]) until convergence (until the absolute difference of +#' log-likelihood between two steps of the EM algorithm is less than the +#' `threshold` parameter). +#' +#' @param X Numeric vector of length \emph{m} representing the covariates. +#' @param Y Matrix of size \eqn{(n, m)} representing \emph{n} functions of `X` +#' observed at points \eqn{1,\dots,m}. +#' @param K The number of mixture components. +#' @param p The order of the polynomial regression. +#' @param q The dimension of the logistic regression. For the purpose of +#' segmentation, it must be set to 1. +#' @param variance_type Numeric indicating if the model is homoskedastic +#' (`variance_type` = 1) or heteroskedastic (`variance_type` = 2). +#' @param n_tries Number of times EM algorithm will be launched. +#' The solution providing the highest log-likelihood will be returned. +#' +#' If `n_tries` > 1, then for the first pass, parameters are initialized +#' by uniformly segmenting the data into K segments, and for the next passes, +#' parameters are initialized by randomly segmenting the data into K contiguous +#' segments. +#' @param max_iter The maximum number of iterations for the EM algorithm. +#' @param threshold A numeric value specifying the threshold for the relative +#' difference of log-likelihood between two steps of the EM as stopping +#' criteria. +#' @param verbose A logical value indicating whether values of the +#' log-likelihood should be printed during EM iterations. +#' @param verbose_IRLS A logical value indicating whether values of the +#' criterion optimized by IRLS should be printed at each step of the EM +#' algorithm. +#' @return EM returns an object of class [ModelTMoE][ModelTMoE]. +#' @seealso [ModelTMoE], [ParamTMoE], [StatTMoE] +#' @export +emTMoE <- function(X, Y, K, p = 3, q = 1, n_tries = 1, max_iter = 1500, threshold = 1e-6, verbose = FALSE, verbose_IRLS = FALSE) { + + fData <- FData(X, Y) + + top <- 0 + try_EM <- 0 + best_loglik <- -Inf + + while (try_EM < n_tries) { + try_EM <- try_EM + 1 + message("EM try nr ", try_EM) + + # Initializations + param <- ParamTMoE$new(fData = fData, K = K, p = p, q = q) + param$initParam(try_EM, segmental = TRUE) + + + + iter <- 0 + converge <- FALSE + prev_loglik <- -Inf + + stat <- StatTMoE(paramTMoE = param) + + while (!converge && (iter <= max_iter)) { + stat$EStep(param) + + reg_irls <- param$MStep(stat, verbose_IRLS) + + stat$computeLikelihood(reg_irls) + # FIN EM + + iter <- iter + 1 + if (verbose) { + message("EM : Iteration : ", iter," log-likelihood : " , stat$log_lik) + } + if (prev_loglik - stat$log_lik > 1e-5) { + message("!!!!! EM log-likelihood is decreasing from ", prev_loglik, "to ", stat$log_lik) + top <- top + 1 + if (top > 20) + break + } + + # TEST OF CONVERGENCE + converge <- abs((stat$log_lik - prev_loglik) / prev_loglik) <= threshold + if (is.na(converge)) { + converge <- FALSE + } # Basically for the first iteration when prev_loglik is Inf + + prev_loglik <- stat$log_lik + stat$stored_loglik[iter] <- stat$log_lik + }# FIN EM LOOP + + # at this point we have computed param and stat that contains all the information + + if (stat$log_lik > best_loglik) { + statSolution <- stat$copy() + paramSolution <- param$copy() + + best_loglik <- stat$log_lik + } + if (n_tries > 1) { + message("max value: ", stat$log_lik) + } + } + + # Computation of c_ig the hard partition of the curves and klas + statSolution$MAP() + + if (n_tries > 1) { + message("max value: ", statSolution$log_lik) + } + + + # FINISH computation of statSolution + statSolution$computeStats(paramSolution) + + return(ModelTMoE(param = paramSolution, stat = statSolution)) + + } diff --git a/R/meteorit-package.R b/R/meteorit-package.R new file mode 100644 index 0000000..beae311 --- /dev/null +++ b/R/meteorit-package.R @@ -0,0 +1,9 @@ +#' @import methods +## usethis namespace: start +#' @useDynLib meteorit, .registration = TRUE +## usethis namespace: end +NULL +## usethis namespace: start +#' @importFrom Rcpp sourceCpp +## usethis namespace: end +NULL diff --git a/R/utils.R b/R/utils.R new file mode 100644 index 0000000..19c146c --- /dev/null +++ b/R/utils.R @@ -0,0 +1,109 @@ +designmatrix = function(x, p, q = NULL, n = 1) { + + order_max <- p + if (!is.null(q)) { + order_max <- max(p, q) + } + + X <- matrix(NA, length(x), order_max + 1) + for (i in 0:(order_max)) { + X[, i + 1] <- x ^ i + } + + XBeta <- X[, 1:(p + 1)] + # design matrix for Beta (the polynomial regressions) + if (!is.null(q)) { + Xw <- X[, 1:(q + 1)] + Xw <- repmat(Xw, n, 1) + # design matrix for w (the logistic regression) + } else { + Xw <- NULL + } + + XBeta <- repmat(XBeta, n, 1) + + return(list(Xw = Xw, XBeta = XBeta)) +} + +ones <- function(n, d, g = 1) { + if (g == 1) { + return(matrix(1, n, d)) + } + else{ + return(array(1, dim = c(n, d, g))) + } +} + +zeros <- function(n, d, g = 1) { + if (g == 1) { + return(matrix(0, n, d)) + } + else{ + return(array(0, dim = c(n, d, g))) + } +} + +rand <- function(n, d, g = 1) { + if (g == 1) { + return(matrix(stats::runif(n * d), n, d)) + } + else{ + return(array(stats::runif(n * d), dim = c(n, d, g))) + } +} + +repmat <- function(M, n, d) { + return(kronecker(matrix(1, n, d), M)) +} + +drnorm <- function(n, d, mean, sd) { + A <- matrix(nrow = n, ncol = d) + for (i in 1:d) { + A[, i] <- stats::rnorm(n, mean, sd) + } + return(A) +} + +lognormalize <- function(M) { + if (!is.matrix(M)) { + M <- matrix(M) + } + n <- nrow(M) + d <- ncol(M) + a <- apply(M, 1, max) + return(M - repmat(a + log(rowSums(exp(M - repmat(a, 1, d)))), 1, d)) +} + +normalize <- function(A, dim) { + # Normalize makes the entries of a (multidimensional <= 2) array sum to 1. + # Input + # A = Array to be normalized + # dim = dimension is specified to normalize. + # Output + # M = Array after normalize. + # z is the normalize constant + # Note: + # If dim is specified, we normalize the specified dimension only, + # Otherwise we normalize the whole array. + # Dim = 1 normalize each column + # Dim = 2 normalize each row + + if (nargs() < 2) { + z <- sum(A) + # Set any zeros to one before dividing + # This is valid, since c = 0 ==> all i.A[i] = 0 ==> the anser should be 0/1 = 0. + s <- z + (z == 0) + M <- A / s + } else if (dim == 1) { + # normalize each column + z <- colSums(A) + s <- z + (z == 0) + M <- A / matrix(s, nrow = dim(A)[1], ncol = length(s), byrow = TRUE) + } else{ + z <- rowSums(A) + s <- z + (z == 0) + M <- A / matrix(s, ncol = dim(A)[2], nrow = length(s), byrow = FALSE) + } + output <- list(M = M, z = z) + return(output) +} diff --git a/README.Rmd b/README.Rmd new file mode 100644 index 0000000..12e2e11 --- /dev/null +++ b/README.Rmd @@ -0,0 +1,67 @@ +--- +output: github_document +--- + + + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + fig.align = "center", + fig.path = "man/figures/README-" +) +``` +## Overview + + + + +User-friendly and flexible algorithm for modeling, sampling, inference, and clustering heteregenous data with the Skew-Normal Mixture-of-Experts (SNMoE) model. + +## Installation + +You can install the development version of STMoE from [GitHub](https://github.com/) with: + +```{r, eval = FALSE} +# install.packages("devtools") +devtools::install_github("fchamroukhi/SNMoE") +``` + +To build *vignettes* for examples of usage, type the command below instead: + +```{r, eval = FALSE} +# install.packages("devtools") +devtools::install_github("fchamroukhi/SNMoE", + build_opts = c("--no-resave-data", "--no-manual"), + build_vignettes = TRUE) +``` + +Use the following command to display vignettes: + +```{r, eval = FALSE} +browseVignettes("SNMoE") +``` + +## Usage + +```{r, message = FALSE} +library(SNMoE) + +data("simulatedstructureddata") + +K <- 2 # Number of regimes (mixture components) +p <- 1 # Dimension of beta (order of the polynomial regressors) +q <- 1 # Dimension of w (order of the logistic regression: to be set to 1 for segmentation) + +n_tries <- 1 +max_iter <- 1500 +threshold <- 1e-6 +verbose <- TRUE +verbose_IRLS <- FALSE + +snmoe <- emSNMoE(simulatedstructureddata$X, matrix(simulatedstructureddata$Y), + K, p, q, n_tries, max_iter, threshold, verbose, verbose_IRLS) + +snmoe$plot() +``` diff --git a/data/simulatedstructureddata.rda b/data/simulatedstructureddata.rda new file mode 100644 index 0000000000000000000000000000000000000000..d73dd128117ba746877515c156b541e07639ae79 GIT binary patch literal 7078 zcmV;X8(HK+T4*^jL0KkKSzhQw0ssW8|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|Nr0;{|mOLt=ZnZxf}@RZO><(_3qy8?`OPcUfb^bk9|A3eSP!aAv<4Ce3SqH z1G~>34Miq2(1LoJp3u~3>SUgo6AebuiK*&ol=LIi8`PRVQxpSHN}s0EPbul4p(fPz8zV!|Q)FnGZBJ9v zOjGn}rm5{o`f8pHCa0ziG^dR+r;(AQ@{H1KYHA)+%4m9?Mv!Kwsp6hfPbBi6s(956 zq~4-!Pf4e!^*o>+4NW5n>TMI$BATI1`Wi}pO;hyKKT1rdnorR@hD{hrw9uN5LVBK> zCyIJa4X3F#CPdp*^HlXcKy4$@9#Q2snx3ZGqta=ZqiEF0>O9pmNcBBWLOi3?%$kPM zXldvs(lqpB^+%+7hp06?krAntHiJ{uJg4X>>86@ZG{pT+RNjoK>ODOYd8rR5-li$# zHq_I}sp^l_JX6GNOsDB4)ZUtmQ))Juq)#aFnt4I&q|^0HsP#OVCfcWpJX6H)ZJtwt1Ng6*?^)d#E5E_jdWin(kr@c)cQl2ttrkba*Pboi7RXyrxU_jGM)YBjn z8W{#nG@D9zYEM(zr{zy4s(VPu1bMp9hy}vT~w}1s8{Im@c7+n|}8Q6ObH(zHnzDzU#z}3V(1Ipg0 zv=x1)$Ty`vJZcw5+#CCE%avH>g5QBzlRDUXSEa;5Bb@;3e?FTuU9UJ+mUl0{aZu>w z@D5#~L(1#s93b0UF+b{;_6`6*{fX&rb-d*=dCh=BXch5lE&y23NBcVheUWIC8FK~c z1t5~}5JEB2(Qcxe?ahzK6lt{AZM_=QyCM@S+0t+VF|*s_av^KCBc>5s(P3QyzH_UL z!RDAO#C#wRPBO;7x#ILryGLh8V2-X0ewJdXJWa9y$Ze=Oa|k;^hEPx=T9&+9)kxm* z=)ToZfTRz3dL^41*Dy8QmE|Q&$pwmr2fan<=6GfQ1qv;fb*BwW&@YMUw zN(S;(?^BI!VbFd%#L15tlcRje#x%Hj#;G`0!?{4g~ z;G~4t+TNf&LYFqP{ihAc+wV@#qH6QQ?X~%H9UVd3FG|<&O_5W>f!yVP6V{r?go3eE5={73E)1l=-K4H%qg_bMC_@D$4#XW4KJT{gQw-NbV0q< z0+X`Qb)<)G8xF<4`XksW4O*;$lr|P#^~?Bmgk~ z2`D8oOF_^Df0cMm|xS ztNl1CL(=RhGMJ1^I5a@Oy~QfHpNjx+cF@04m$nX5(1rlFz; z(4pMxMZkN_D$ajt%s1CP*9Km_JS*(zG9E08YlNp%4A0-C+BqcZfl$4+?Ydkm1gfT~ z_R!$sSAvo1O(VxcocjixJdc;kx^uMQt9t&D%HevKPo7}UuzJ_(yY!Ba2do&hvyL6CZp*I62F8AZ zZ~VZ1)HCB8lS=&X+0@iG38j;M@l<Q5R@PD0AY@iDN8o8KW`67vjR*%V%DQpbgPs6&L00-e1JnW z)2QE2p+Ki;gGpv(SQE#ZOH!FAnTA1D680S;=p)-&~V>uD|x_) zcbJ}S)>~K~!9&k7IseDh1=jf8=xsbUtt{ZRwvEv@4QxokCA>G%S8pJZuh2ePu2SGH z=efIcWgxgXZ-AgcOOJ45=tJG|8g^jlzfZKiUq_2Lftr^leDUZ53=fp@2-0d60YsTZ z&NAwB6I$R(yA1R9YmQdtrH9PN1%5`F*RZhR^Ymc4t{#AS5Q&a=8@uorI_B*!+tg&@ z0#_k>&f=;s7!4{)96i8V1PZ<6{X4yf74TgF?@6+(k=W^ja9~c{(A?@*I)Sp8?139S zo|x9Q06Dd1pwwb1ASjUpGbidEoKRx{NEU26mM8UdY}pL>DJHM^2^?zu?UwQtjKG!) z_HNne$==U%^MyJI19;8HSESrz)C8`}4YyJ605-|0S#)vLFRt=(R)TO=Q`g-`DI>Tk z5lW!eOu^#vH=VJPAVUC{#~txhAqJ4jQS`uu0HbM>dhI5IuaJdXYwjzZ#jn7t2TZwW z0{kJ7u61=9262wx8uo8rs|ViC3J)Lr=~h~VyD6N?ryFLWyPJT1i=L7fyiEAtj~xoC z9(F1NMkT~pB@|CG(ME#9Jg3k}6;^RNcKnX2@JSdEXZ$!k9h!`=S?e`1rq!T&t#v~t zVb2`S#gkJ5{{f7%&R!@C)U@v#b#wr2eC}_Eat1h}lokN2t+6lhcoFSrZ@#otp8^dC zB3A;?yB|mft@_hjHzyoG^7%E%>(W8IW=R5N zMEByS-%M9ZlL37zn41L>nAuJHs6qM$=-A;1o4PvHHi%;VXMJKIG<2Tq8w!t?qpyDJ zfo&xbO<}2;^gdU$A~A;5p;&&|!XOi#pHrq3@(eYX=)oi_`{KU<^b8GC^tDrY31AsF z=;S8(ATRo=_E`Gwx%D71H;>!R8~m>lUeAyWt1q6JJBOH>Yan}bCqVOS;Ttel(W61c z{-tZOrbGoGp;J%-jwUHqTN#-2*6nV2*J-+sh8T)6;Tzx>!$^mVmVEjZmp1Ew@DLVU zn$}YzV%P{^8rzWW3!y#9dULs4mO&t76Z~Fjc@f%nz{siUIxKKB{yqjM6s~WI_4|y3 zG?$kjD|z_s{?tGhl6{S?8k?RxV8D)V$k1arwZOPKD81IW8EG%16a8|_@sHd{Ziep4 zWP_#2(NtUPGYJkw~S;A?tUZd3KX6L9j2ZQ!}5=1nwfX5r48Eu-YyRC{<0^(=nWCtyRtz2Tw*87|Q`#KRANV+dP zurevA6~BRB11(yY3KDZ?W(pD2G-=kW*Gc2M!ww8!9w+RWu?0(wS2G_$KW+d}ZQO0> z0A;k_qT?Ut#{@_aG`C#2iZIpyHlaLf(?XmAK9(aXc89mx-cVPCGd)B5`)CFIkcSS* zG+@8bDH?n&i-^EvKTP7-oy)FTa7%$(daKCt1bR75rW%{(=>YQN+bss!#4%aG7+I80 z9X@;$bjY0e92*=rN(JNLuDqfV9wpaKwTt z<%@;knqWlc@vpvN??h6gq6`!|!$REQO=Gk`wCX&OwVVkJ{lTjweH~+`UXC=;c0@zO z<7JYKfv{33d-S4jkTEsK*I2h5U1_vJiFZ410gy7DD1pQpD zf3K5yg0lrL4CM{2t>e^vfM@$VKpmcZAhpj(=pSFdHisYz7p&;>cc&u&E#$v^*lsm6DDZ&F%k}j%)==;HQt>@|KI5n>rB9syyVzd-ICGHwGkO0VaW^hV1u~^cu21Dg=oNMD}MB;%SYWp3; zQ{KVVSpsLMOjr0mm-N4bk`ACS;ZK7qA4hGH#hpog*fp68*tm2@R4-DFE&e^Ht-KTG z6N!Xws(ychXak%3Hg&GLcXDY%vC5A`w{wC*Cgi2pLUF@1y1!BKyd`xoOJsqqt$#zo z`)AR1`Prrv|&8qm%Q5m zrCYY&LfV(_8oN1RXAVe zYWrN(rOd={KQ)PRwbVJiy!z!*{+7+FAN7l8(OF%MRq=C@Z+|=erz@dY$~G#3S8wDk z*yg9RQsmNcN822*-xFS^CT>!a7eYTWi9F<#+>C`;*|ci-{gz6Z&hnAcAbHfF-Ood1 znuFco+;gZWTCCLmEvvtbV{P>>lO4F^auO}NwxvORZd>T|@irJ!`MR^}=K1n`xu1%C zJFjO-!P%x&gp!0Rme9=b`-@?X|4wzx=&kRrab4x&2;Gy?Ns;?mFxk%Es)K2a+oMmm zN^SDLw3Wp#QnTE|-lV3SlcG5Q>*u;fIY%#A-q*2zP-+&Vna4`KiKO-Gw^udZUI&p^ zuTe`>#GjcXYD}qeu^VSCF`&tna3cklX+ZiL6O0|o;wo?~1H_k}zD11G0 z3G03RbtH0|T-5J&AKYegJ3~B%k!=;N2O4kipw0Yxnra&QblaLA6759RlgYx#uUXee z!^yhlHQeOKB@g`@WExP*w=mqDY{O1gOK6@Jh2vZqPpKaUrKT4e1#LuC*Ne2xTz)^Y zR@Y5^>}u({NIAK(#$x{swi&jK2O})>v%0mu+DK2VI9kr~trS#<*aCwE$TnQC=*yR| z$$bHa8V|!RL$vaRsKLB{KT8Kh`D9qHyIdXaniYE6PJ}x)1pA+^4;vJ44lC$Kyc6*uT=GNy+wkV<-j|vLU2?0>(&7H)nkKb)dNp zj=pZ%WXSc>r!M+CM)P~MeK0F?(%!9{#o~3~da-P=y7=X8O1aHjcEQi-e_o=qHvuNK z=zzvlO}Q}hJM88>7eao!eY||TA-%c7-{Oc{1&P4r+8=>NTR%!Ve5gQQYF6kAY$dM) zoh~_xi|C85CM)b5ZNM|*hBfsuWyp)9hHQV~VPyEUG}IsRlv4sS(xo3Vz9DvVdqAeJ9k?}cCkx7z78o;!yJw!C(`I*Kea2Z)s}5FvTmus9 zY58vBJ(D?Mv5;>9k4LwpyYeMUP9Yv)=QnY6i77kaCK~766ooMT%N6N1zgGomAPRvF z!K7wkIs`780#J$ojAv>0wJ|`E{5jU2rPR?xnaEUbP=Tz!VO!u>p=lbO4C>xKMkuOt zOxO``t$2T0T#X3uefu>$7&n}qLVYM9x4v4xS#n}o%ms|r+EhhDUt1&a0QK8fw`5&- zG_P*NH^{oo!XhrFA)R{FhIYs8(m+IYQ+JY{?N7#ymi#AYi?*_E=QOjDN6+z-btgxD zcxWs}>k(UL0Uhr1+RH)Lm?25&zFs=bj(t5lxo1~gEws3rGx8q zboSFHp!W9m5=h|}VeMt%1kM|#x9gV6{AFdo9jf5H_Ty$9=4k3O+08fBxSX8wYIIzT zgdGv*0ueb&K2tq#kQRhI>)BPAs~({MVo&xfg(eQF|0X677OnB8b>^HloxKCb0McYQwW&B0gz^5*269ULCl*OLdT}6o#Q%b+$a(R|Ucz!N=7CTMO~XsMuW!lE(DhFd zvT{9-+%1@apH^7Y{L`#{@lrB#kulF!XppGZTNM<305B3%|p`yXvceUEV?)WQnTG>aF1m z%$P1_`PFRK`*P*?33H2>jV*u(TCV|rk4>F?1mT*Ziyywi;mC^ZSCXQxsrP}!1hRI8 zdk~|ZS0%YBcAb;cKL8Y$2z?jT`s~vkc&?SG%ropmTtQ{c)+6ln(Cr(A;xuSZmU=Fr zUJ%N~MjbF;>)+o7Lf5MneJqRINM}HB6jC2{FU~?qv}p+^Wr}-R+dc?ti8M{X5oyB- z6m8?s5vosBKl*SCcuFcajiX2kXVW2C)H&^bLLUY}@^5+c{QpKY7otIzF@y*%*S_N8 zr*!BFQcf^V0|J}i=kH)NjboW=Ev12Ij{>O~Fl9p47H1XCQnps9Hy{J=w(DcLOaT)* z(Sk_x!?ux#(| QiNEo8BvXY61@44EAi%?}ZU6uP literal 0 HcmV?d00001 diff --git a/inst/CITATION b/inst/CITATION new file mode 100644 index 0000000..3c2f17a --- /dev/null +++ b/inst/CITATION @@ -0,0 +1,97 @@ +citHeader("To cite meteorit in publications use:") + +citEntry( + entry = "Article", + title = "Practical and theoretical aspects of mixture-of-experts modeling: An overview", + author = personList(person(given="Hien D.", family="Nguyen"), + person(given="F.", family="Chamroukhi")), + journal = "Wiley Interdisciplinary Reviews: Data Mining and Knowledge Discovery", + publisher = "Wiley Periodicals, Inc", + year = "2018", + pages = "e1246--n/a", + doi = "10.1002/widm.1246", + url = "https://chamroukhi.com/papers/Nguyen-Chamroukhi-MoE-DMKD-2018", + textVersion = "Nguyen H and Chamroukhi F (2018). \u201cPractical and theoretical aspects + of mixture-of-experts modeling: An overview.\u201d Wiley Interdisciplinary Reviews: + Data Mining and Knowledge Discovery, pp. e1246-n/a. + doi: 10.1002/widm.1246 (URL:https://doi.org/10.1002/widm.1246), + ." +) + +citEntry( + entry = "InProceedings", + title = "Skew-Normal Mixture of Experts", + author = personList(person(given="F.", family="Chamroukhi")), + booktitle = "The International Joint Conference on Neural Networks (IJCNN)", + year = "2016", + url = "https://chamroukhi.com/papers/Chamroukhi-SNMoE-IJCNN2016.pdf", + textVersion = "Chamroukhi F (2016). \u201cSkew-Normal Mixture of Experts.\u201d In + The International Joint Conference on Neural Networks (IJCNN). + ." +) + +citEntry( + entry = "Misc", + title = "Non-Normal Mixtures of Experts", + author = personList(person(given="F.", family="Chamroukhi")), + year = "2015", + url = "http://arxiv.org/pdf/1506.06707.pdf", + textVersion = "Chamroukhi F (2015). \u201cNon-Normal Mixtures of Experts.\u201d + ." +) + +citEntry( + entry = "Article", + title = "Model-Based Clustering and Classification of Functional Data", + author = personList(person(given="F.", family="Chamroukhi"), + person(given="Hien D.", family="Nguyen")), + journal = "Wiley Interdisciplinary Reviews: Data Mining and Knowledge Discovery", + year = "2019", + url = "https://chamroukhi.com/papers/MBCC-FDA.pdf", + doi = "10.1002/widm.1298", + textVersion = "Chamroukhi F, Nguyen H (2019). \u201cModel-Based Clustering and + Classification of Functional Data.\u201d Wiley Interdisciplinary Reviews: Data Mining and + Knowledge Discovery. doi: 10.1002/widm.1298 (URL: https://doi.org/10.1002/widm.1298), + ." +) + +citEntry( + entry = "Article", + title = "Skew t mixture of experts", + author = personList(person(given="F.", family="Chamroukhi")), + journal = "Neurocomputing - Elsevier", + year = "2017", + volume = "266", + pages = "390-408", + url = "https://chamroukhi.com/papers/STMoE.pdf", + textVersion = "Chamroukhi F (2017). \u201cSkew t mixture of experts.\u201d + Neurocomputing - Elsevier, + 266, pp. 390-408. ." +) + +citEntry( + entry = "Article", + title = "Robust mixture of experts modeling using the t-distribution", + author = personList(person(given="F.", family="Chamroukhi")), + journal = "Neural Networks - Elsevier", + year = "2016", + volume = "79", + pages = "20--36", + url = "https://chamroukhi.com/papers/TMoE.pdf", + textVersion = "Chamroukhi F (2016). \u201cRobust mixture of experts modeling using the + t-distribution.\u201d Neural Networks - Elsevier, 79, pp. 20-36. + ." +) + +citEntry( + entry = "PhdThesis", + title = "Statistical learning of latent data models for complex data analysis", + author = person(given="F.", family="Chamroukhi"), + school = "Universit\u00e9 de Toulon", + year = "2015", + type = "Habilitation Thesis (HDR)", + url = "https://chamroukhi.com/Dossier/FChamroukhi-Habilitation.pdf", + textVersion = "Chamroukhi F (2015). Statistical learning of latent data models for + complex data analysis. Habilitation Thesis (HDR), Universit\u00e9 de Toulon. + ." +) diff --git a/man/FData-class.Rd b/man/FData-class.Rd new file mode 100644 index 0000000..eba5cf5 --- /dev/null +++ b/man/FData-class.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/FData.R +\docType{class} +\name{FData-class} +\alias{FData-class} +\alias{FData} +\title{A Reference Class which represents functional data.} +\description{ +FData is a reference class which represents general independent and +identically distributed (i.i.d.) functional objects. The data can be +ordered by time (functional time series). In the last case, the field \code{X} +represents the time. +} +\section{Fields}{ + +\describe{ +\item{\code{X}}{Numeric vector of length \emph{m}.} + +\item{\code{Y}}{Matrix of size \eqn{(n, m)} representing \emph{n} +functions of \code{X} observed at points \eqn{1,\dots,m}.} +}} + + diff --git a/man/ModelSNMoE-class.Rd b/man/ModelSNMoE-class.Rd new file mode 100644 index 0000000..a9777af --- /dev/null +++ b/man/ModelSNMoE-class.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ModelSNMoE.R +\docType{class} +\name{ModelSNMoE-class} +\alias{ModelSNMoE-class} +\alias{ModelSNMoE} +\title{A Reference Class which represents a fitted SNMoE model.} +\description{ +ModelSNMoE represents a \link[=ModelSNMoE]{SNMoE} model for which parameters have +been estimated. +} +\section{Fields}{ + +\describe{ +\item{\code{param}}{A \link{ParamSNMoE} object. It contains the estimated values of the parameters.} + +\item{\code{stat}}{A \link{StatSNMoE} object. It contains all the statistics associated to the SNMoE model.} +}} + + +\seealso{ +\link{ParamSNMoE}, \link{StatSNMoE} +} diff --git a/man/ModelStMoE-class.Rd b/man/ModelStMoE-class.Rd new file mode 100644 index 0000000..fd91cfe --- /dev/null +++ b/man/ModelStMoE-class.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ModelStMoE.R +\docType{class} +\name{ModelStMoE-class} +\alias{ModelStMoE-class} +\alias{ModelStMoE} +\title{A Reference Class which represents a fitted StMoE model.} +\description{ +ModelStMoE represents a \link[=ModelStMoE]{StMoE} model for which parameters have +been estimated. +} +\section{Fields}{ + +\describe{ +\item{\code{param}}{A \link{ParamStMoE} object. It contains the estimated values of the parameters.} + +\item{\code{stat}}{A \link{StatStMoE} object. It contains all the statistics associated to the StMoE model.} +}} + + +\seealso{ +\link{ParamStMoE}, \link{StatStMoE} +} diff --git a/man/ModelTMoE-class.Rd b/man/ModelTMoE-class.Rd new file mode 100644 index 0000000..592c72b --- /dev/null +++ b/man/ModelTMoE-class.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ModelTMoE.R +\docType{class} +\name{ModelTMoE-class} +\alias{ModelTMoE-class} +\alias{ModelTMoE} +\title{A Reference Class which represents a fitted TMoE model.} +\description{ +ModelMRHLP represents a \link[=ModelTMoE]{TMoE} model for which parameters have +been estimated. +} +\section{Fields}{ + +\describe{ +\item{\code{param}}{A \link{ParamTMoE} object. It contains the estimated values of the parameters.} + +\item{\code{stat}}{A \link{StatTMoE} object. It contains all the statistics associated to the TMoE model.} +}} + + +\seealso{ +\link{ParamTMoE}, \link{StatTMoE} +} diff --git a/man/ParamSNMoE-class.Rd b/man/ParamSNMoE-class.Rd new file mode 100644 index 0000000..4d14e01 --- /dev/null +++ b/man/ParamSNMoE-class.Rd @@ -0,0 +1,41 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ParamSNMoE.R +\docType{class} +\name{ParamSNMoE-class} +\alias{ParamSNMoE-class} +\alias{ParamSNMoE} +\title{A Reference Class which contains parameters of a SNMoE model.} +\description{ +ParamSNMoE contains all the parameters of a SNMoE model. +} +\section{Fields}{ + +\describe{ +\item{\code{fData}}{\link{FData} object representing the sample.} + +\item{\code{K}}{The number of mixture components.} + +\item{\code{p}}{The order of the polynomial regression.} + +\item{\code{q}}{The dimension of the logistic regression. For the purpose of +segmentation, it must be set to 1.} + +\item{\code{nu}}{degree of freedom} + +\item{\code{alpha}}{is the parameter vector of the logistic model with \eqn{alpha_K} being the null vector.} + +\item{\code{beta}}{is the vector of regression coefficients of component k, +the updates for each of the expert component parameters consist in analytically solving a weighted +Gaussian linear regression problem.} + +\item{\code{sigma}}{The variances for the \emph{K} mixture component.} + +\item{\code{lambda}}{skewness parameter} + +\item{\code{delta}}{the skewness parameter lambda (by equivalence delta)} +}} + + +\seealso{ +\link{FData} +} diff --git a/man/ParamStMoE-class.Rd b/man/ParamStMoE-class.Rd new file mode 100644 index 0000000..f916929 --- /dev/null +++ b/man/ParamStMoE-class.Rd @@ -0,0 +1,52 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ParamStMoE.R +\docType{class} +\name{ParamStMoE-class} +\alias{ParamStMoE-class} +\alias{ParamStMoE} +\title{A Reference Class which contains parameters of a MRHLP model.} +\description{ +ParamMRHLP contains all the parameters of a MRHLP model. +} +\section{Fields}{ + +\describe{ +\item{\code{fData}}{\link{FData} object representing the sample.} + +\item{\code{K}}{The number of mixture components.} + +\item{\code{p}}{The order of the polynomial regression.} + +\item{\code{q}}{The dimension of the logistic regression. For the purpose of +segmentation, it must be set to 1.} + +\item{\code{nu}}{degree of freedom} + +\item{\code{alpha}}{is the parameter vector of the logistic model with \eqn{alpha_K} being the null vector.} + +\item{\code{beta}}{is the vector of regression coefficients of component k, +the updates for each of the expert component parameters consist in analytically solving a weighted +Gaussian linear regression problem.} + +\item{\code{sigma}}{The variances for the \emph{K} mixture component.} + +\item{\code{lambda}}{skewness parameter} + +\item{\code{delta}}{the skewness parameter lambda (by equivalence delta)} + +\item{\code{nuk}}{degrees of freedom} +}} + +\section{Methods}{ + +\describe{ +\item{\code{initParam(try_EM, segmental = FALSE)}}{Method to initialize parameters \code{alpha}, \code{beta} and +\code{sigma}.} + +\item{\code{MStep(statStMoE, verbose_IRLS)}}{Method used in the EM algorithm to learn the parameters of the StMoE model +based on statistics provided by \code{statStMoE}.} +}} + +\seealso{ +\link{FData} +} diff --git a/man/ParamTMoE-class.Rd b/man/ParamTMoE-class.Rd new file mode 100644 index 0000000..335e665 --- /dev/null +++ b/man/ParamTMoE-class.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ParamTMoE.R +\docType{class} +\name{ParamTMoE-class} +\alias{ParamTMoE-class} +\alias{ParamTMoE} +\title{A Reference Class which contains parameters of a TMoE model.} +\description{ +ParamTMoE contains all the parameters of a TMoE model. +} +\section{Fields}{ + +\describe{ +\item{\code{fData}}{\link{FData} object representing the sample.} + +\item{\code{K}}{The number of mixture components.} + +\item{\code{p}}{The order of the polynomial regression.} + +\item{\code{q}}{The dimension of the logistic regression. For the purpose of +segmentation, it must be set to 1.} + +\item{\code{nu}}{degree of freedom} + +\item{\code{alpha}}{is the parameter vector of the logistic model with \eqn{alpha_K} being the null vector.} + +\item{\code{beta}}{is the vector of regression coefficients of component k, +the updates for each of the expert component parameters consist in analytically solving a weighted +Gaussian linear regression problem.} + +\item{\code{sigma}}{The variances for the \emph{K} mixture component.} + +\item{\code{delta}}{the skewness parameter lambda (by equivalence delta)} +}} + + +\seealso{ +\link{FData} +} diff --git a/man/StatSNMoE-class.Rd b/man/StatSNMoE-class.Rd new file mode 100644 index 0000000..8c57d82 --- /dev/null +++ b/man/StatSNMoE-class.Rd @@ -0,0 +1,95 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/StatSNMoE.R +\docType{class} +\name{StatSNMoE-class} +\alias{StatSNMoE-class} +\alias{StatSNMoE} +\title{A Reference Class which contains statistics of a SNMoE model.} +\description{ +StatMRHLP contains all the parameters of a \link[=ParamSNMoE]{SNMoE} model. +} +\section{Fields}{ + +\describe{ +\item{\code{piik}}{Matrix of size \eqn{(n, K)} representing the probabilities +\eqn{P(zi = k; W) = P(z_{ik} = 1; W)}{P(zi = k; W) = P(z_ik = 1; W)} of the +latent variable \eqn{zi,\ i = 1,\dots,m}{zi, i = 1,\dots,n}.} + +\item{\code{z_ik}}{Hard segmentation logical matrix of dimension \eqn{(n, K)} +obtained by the Maximum a posteriori (MAP) rule: +\eqn{z_{ik} = 1 \ \textrm{if} \ z_{ik} = \textrm{arg} \ \textrm{max}_{k} \ +P(z_i = k | Y, W, \beta);\ 0 \ \textrm{otherwise}}{z_ik = 1 if z_ik = +arg max_k P(z_i = k | Y, W, \beta); 0 otherwise}, \eqn{k = 1,\dots,K}.} + +\item{\code{klas}}{Column matrix of the labels issued from \code{z_ik}. Its elements are +\eqn{klas(i) = k}, \eqn{k = 1,\dots,K}.} + +\item{\code{Ey_k}}{Matrix of dimension \emph{(n,K)}.} + +\item{\code{Ey}}{Column matrix of dimension \emph{n}.} + +\item{\code{Var_yk}}{Column matrix of dimension \emph{K}.} + +\item{\code{Vary}}{Column matrix of dimension \emph{n}.} + +\item{\code{log\_lik}}{Numeric. Log-likelihood of the SNMoE model.} + +\item{\code{com_loglik}}{Numeric. Complete log-likelihood of the SNMoE model.} + +\item{\code{stored_loglik}}{List. Stored values of the log-likelihood at each EM +iteration.} + +\item{\code{BIC}}{Numeric. Value of the BIC (Bayesian Information Criterion) +criterion. The formula is \eqn{BIC = log\_lik - nu \times +\textrm{log}(n) / 2}{BIC = log\_lik - nu x log(n) / 2} with \emph{nu} the +degree of freedom of the SNMoE model.} + +\item{\code{ICL}}{Numeric. Value of the ICL (Integrated Completed Likelihood) +criterion. The formula is \eqn{ICL = com\_loglik - nu \times +\textrm{log}(n) / 2}{ICL = com_loglik - nu x log(n) / 2} with \emph{nu} the +degree of freedom of the SNMoE model.} + +\item{\code{AIC}}{Numeric. Value of the AIC (Akaike Information Criterion) +criterion. The formula is \eqn{AIC = log\_lik - nu}{AIC = log\_lik - nu}.} + +\item{\code{log_piik_fik}}{Matrix of size \eqn{(n, K)} giving the values of the +logarithm of the joint probability +\eqn{P(Y_{i}, \ zi = k)}{P(Yi, zi = k)}, \eqn{i = 1,\dots,n}.} + +\item{\code{log_sum_piik_fik}}{Column matrix of size \emph{n} giving the values of +\eqn{\sum_{k = 1}^{K} \textrm{log} P(Y_{i}, \ zi = k)}{\sum_{k = 1}^{K} log +P(Yi, zi = k)}, \eqn{i = 1,\dots,n}.} + +\item{\code{tik}}{Matrix of size \eqn{(n, K)} giving the posterior probability that +\eqn{Y_{i}}{Yi} originates from the \eqn{k}-th regression model +\eqn{P(zi = k | Y, W, \beta)}.} + +\item{\code{E1ik}}{To define.} + +\item{\code{E2ik}}{To define.} +}} + +\section{Methods}{ + +\describe{ +\item{\code{EStep(paramSNMoE)}}{Method used in the EM algorithm to update statistics based on parameters +provided by \code{paramSNMoE} (prior and posterior probabilities).} + +\item{\code{MAP()}}{calcule une partition d'un echantillon par la regle du Maximum A Posteriori ?? partir des probabilites a posteriori +Entrees : post_probas , Matrice de dimensions [n x K] des probabibiltes a posteriori (matrice de la partition floue) +n : taille de l'echantillon +K : nombres de classes +klas(i) = arg max (post_probas(i,k)) , for all i=1,...,n +1<=k<=K += arg max p(zi=k|xi;theta) +1<=k<=K += arg max p(zi=k;theta)p(xi|zi=k;theta)/sum{l=1}^{K}p(zi=l;theta) p(xi|zi=l;theta) +1<=k<=K +Sorties : classes : vecteur collones contenant les classe (1:K) +Z : Matrice de dimension [nxK] de la partition dure : ses elements sont zik, avec zik=1 si xi +appartient ?? la classe k (au sens du MAP) et zero sinon.} +}} + +\seealso{ +\link{ParamSNMoE}, \link{FData} +} diff --git a/man/StatStMoE-class.Rd b/man/StatStMoE-class.Rd new file mode 100644 index 0000000..2f1e1a3 --- /dev/null +++ b/man/StatStMoE-class.Rd @@ -0,0 +1,103 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/StatStMoE.R +\docType{class} +\name{StatStMoE-class} +\alias{StatStMoE-class} +\alias{StatStMoE} +\title{A Reference Class which contains statistics of a StMoE model.} +\description{ +StatMRHLP contains all the parameters of a \link[=ParamStMoE]{StMoE} model. +} +\section{Fields}{ + +\describe{ +\item{\code{piik}}{Matrix of size \eqn{(n, K)} representing the probabilities +\eqn{P(zi = k; W) = P(z_{ik} = 1; W)}{P(zi = k; W) = P(z_ik = 1; W)} of the +latent variable \eqn{zi,\ i = 1,\dots,m}{zi, i = 1,\dots,n}.} + +\item{\code{z_ik}}{Hard segmentation logical matrix of dimension \eqn{(n, K)} +obtained by the Maximum a posteriori (MAP) rule: +\eqn{z_{ik} = 1 \ \textrm{if} \ z_{ik} = \textrm{arg} \ \textrm{max}_{k} \ +P(z_i = k | Y, W, \beta);\ 0 \ \textrm{otherwise}}{z_ik = 1 if z_ik = +arg max_k P(z_i = k | Y, W, \beta); 0 otherwise}, \eqn{k = 1,\dots,K}.} + +\item{\code{klas}}{Column matrix of the labels issued from \code{z_ik}. Its elements are +\eqn{klas(i) = k}, \eqn{k = 1,\dots,K}.} + +\item{\code{Ey_k}}{Matrix of dimension \emph{(n,K)}.} + +\item{\code{Ey}}{Column matrix of dimension \emph{n}.} + +\item{\code{Var_yk}}{Column matrix of dimension \emph{K}.} + +\item{\code{Var_y}}{Column matrix of dimension \emph{n}.} + +\item{\code{log\_lik}}{Numeric. Log-likelihood of the StMoE model.} + +\item{\code{com_loglik}}{Numeric. Complete log-likelihood of the StMoE model.} + +\item{\code{stored_loglik}}{List. Stored values of the log-likelihood at each EM +iteration.} + +\item{\code{BIC}}{Numeric. Value of the BIC (Bayesian Information Criterion) +criterion. The formula is \eqn{BIC = log\_lik - nu \times +\textrm{log}(n) / 2}{BIC = log\_lik - nu x log(n) / 2} with \emph{nu} the +degree of freedom of the StMoE model.} + +\item{\code{ICL}}{Numeric. Value of the ICL (Integrated Completed Likelihood) +criterion. The formula is \eqn{ICL = com\_loglik - nu \times +\textrm{log}(n) / 2}{ICL = com_loglik - nu x log(n) / 2} with \emph{nu} the +degree of freedom of the StMoE model.} + +\item{\code{AIC}}{Numeric. Value of the AIC (Akaike Information Criterion) +criterion. The formula is \eqn{AIC = log\_lik - nu}{AIC = log\_lik - nu}.} + +\item{\code{log_piik_fik}}{Matrix of size \eqn{(n, K)} giving the values of the +logarithm of the joint probability +\eqn{P(Y_{i}, \ zi = k)}{P(Yi, zi = k)}, \eqn{i = 1,\dots,n}.} + +\item{\code{log_sum_piik_fik}}{Column matrix of size \emph{n} giving the values of +\eqn{\sum_{k = 1}^{K} \textrm{log} P(Y_{i}, \ zi = k)}{\sum_{k = 1}^{K} log +P(Yi, zi = k)}, \eqn{i = 1,\dots,n}.} + +\item{\code{tik}}{Matrix of size \eqn{(n, K)} giving the posterior probability that +\eqn{Y_{i}}{Yi} originates from the \eqn{k}-th regression model +\eqn{P(zi = k | Y, W, \beta)}.} + +\item{\code{wik}}{To define.} + +\item{\code{dik}}{To define.} + +\item{\code{stme_pdf}}{skew-t mixture of experts density} + +\item{\code{E1ik}}{To define.} + +\item{\code{E2ik}}{To define.} + +\item{\code{E3ik}}{To define.} +}} + +\section{Methods}{ + +\describe{ +\item{\code{EStep(paramStMoE)}}{Method used in the EM algorithm to update statistics based on parameters +provided by \code{paramStMoE} (prior and posterior probabilities).} + +\item{\code{MAP()}}{calcule une partition d'un echantillon par la regle du Maximum A Posteriori ?? partir des probabilites a posteriori +Entrees : post_probas , Matrice de dimensions [n x K] des probabibiltes a posteriori (matrice de la partition floue) +n : taille de l'echantillon +K : nombres de classes +klas(i) = arg max (post_probas(i,k)) , for all i=1,...,n +1<=k<=K += arg max p(zi=k|xi;theta) +1<=k<=K += arg max p(zi=k;theta)p(xi|zi=k;theta)/sum{l=1}^{K}p(zi=l;theta) p(xi|zi=l;theta) +1<=k<=K +Sorties : classes : vecteur collones contenant les classe (1:K) +Z : Matrice de dimension [nxK] de la partition dure : ses elements sont zik, avec zik=1 si xi +appartient et la classe k (au sens du MAP) et zero sinon.} +}} + +\seealso{ +\link{ParamStMoE}, \link{FData} +} diff --git a/man/StatTMoE-class.Rd b/man/StatTMoE-class.Rd new file mode 100644 index 0000000..27d44c0 --- /dev/null +++ b/man/StatTMoE-class.Rd @@ -0,0 +1,90 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/StatTMoE.R +\docType{class} +\name{StatTMoE-class} +\alias{StatTMoE-class} +\alias{StatTMoE} +\title{A Reference Class which contains statistics of a TMoE model.} +\description{ +StatTMoE contains all the parameters of a \link[=ParamTMoE]{TMoE} model. +} +\section{Fields}{ + +\describe{ +\item{\code{piik}}{Matrix of size \eqn{(n, K)} representing the probabilities +\eqn{P(zi = k; W) = P(z_{ik} = 1; W)}{P(zi = k; W) = P(z_ik = 1; W)} of the +latent variable \eqn{zi,\ i = 1,\dots,m}{zi, i = 1,\dots,n}.} + +\item{\code{z_ik}}{Hard segmentation logical matrix of dimension \eqn{(n, K)} +obtained by the Maximum a posteriori (MAP) rule: +\eqn{z_{ik} = 1 \ \textrm{if} \ z_{ik} = \textrm{arg} \ \textrm{max}_{k} \ +P(z_i = k | Y, W, \beta);\ 0 \ \textrm{otherwise}}{z_ik = 1 if z_ik = +arg max_k P(z_i = k | Y, W, \beta); 0 otherwise}, \eqn{k = 1,\dots,K}.} + +\item{\code{klas}}{Column matrix of the labels issued from \code{z_ik}. Its elements are +\eqn{klas(i) = k}, \eqn{k = 1,\dots,K}.} + +\item{\code{Wik}}{Matrix of dimension \emph{(nm,K)}.} + +\item{\code{Ey_k}}{Matrix of dimension \emph{(n,K)}.} + +\item{\code{Ey}}{Column matrix of dimension \emph{n}.} + +\item{\code{Var_yk}}{Column matrix of dimension \emph{K}.} + +\item{\code{Vary}}{Column matrix of dimension \emph{n}.} + +\item{\code{log\_lik}}{Numeric. Log-likelihood of the StMoE model.} + +\item{\code{com_loglik}}{Numeric. Complete log-likelihood of the StMoE model.} + +\item{\code{stored_loglik}}{List. Stored values of the log-likelihood at each EM +iteration.} + +\item{\code{BIC}}{Numeric. Value of the BIC (Bayesian Information Criterion) +criterion. The formula is \eqn{BIC = log\_lik - nu \times +\textrm{log}(n) / 2}{BIC = log\_lik - nu x log(n) / 2} with \emph{nu} the +degree of freedom of the StMoE model.} + +\item{\code{ICL}}{Numeric. Value of the ICL (Integrated Completed Likelihood) +criterion. The formula is \eqn{ICL = com\_loglik - nu \times +\textrm{log}(n) / 2}{ICL = com_loglik - nu x log(n) / 2} with \emph{nu} the +degree of freedom of the StMoE model.} + +\item{\code{AIC}}{Numeric. Value of the AIC (Akaike Information Criterion) +criterion. The formula is \eqn{AIC = log\_lik - nu}{AIC = log\_lik - nu}.} + +\item{\code{log_piik_fik}}{Matrix of size \eqn{(n, K)} giving the values of the +logarithm of the joint probability +\eqn{P(Y_{i}, \ zi = k)}{P(Yi, zi = k)}, \eqn{i = 1,\dots,n}.} + +\item{\code{log_sum_piik_fik}}{Column matrix of size \emph{n} giving the values of +\eqn{\sum_{k = 1}^{K} \textrm{log} P(Y_{i}, \ zi = k)}{\sum_{k = 1}^{K} log +P(Yi, zi = k)}, \eqn{i = 1,\dots,n}.} + +\item{\code{tik}}{Matrix of size \eqn{(n, K)} giving the posterior probability that +\eqn{Y_{i}}{Yi} originates from the \eqn{k}-th regression model +\eqn{P(zi = k | Y, W, \beta)}.} +}} + +\section{Methods}{ + +\describe{ +\item{\code{MAP()}}{calcule une partition d'un echantillon par la regle du Maximum A Posteriori ?? partir des probabilites a posteriori +Entrees : post_probas , Matrice de dimensions [n x K] des probabibiltes a posteriori (matrice de la partition floue) +n : taille de l'echantillon +K : nombres de classes +klas(i) = arg max (post_probas(i,k)) , for all i=1,...,n +1<=k<=K += arg max p(zi=k|xi;theta) +1<=k<=K += arg max p(zi=k;theta)p(xi|zi=k;theta)/sum{l=1}^{K}p(zi=l;theta) p(xi|zi=l;theta) +1<=k<=K +Sorties : classes : vecteur collones contenant les classe (1:K) +Z : Matrice de dimension [nxK] de la partition dure : ses elements sont zik, avec zik=1 si xi +appartient ?? la classe k (au sens du MAP) et zero sinon.} +}} + +\seealso{ +\link{ParamStMoE}, \link{FData} +} diff --git a/man/emSNMoE.Rd b/man/emSNMoE.Rd new file mode 100644 index 0000000..c190bb3 --- /dev/null +++ b/man/emSNMoE.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/emSNMoE.R +\name{emSNMoE} +\alias{emSNMoE} +\title{emSNMoE is used to fit a SNMoE model.} +\usage{ +emSNMoE(X, Y, K, p = 3, q = 1, n_tries = 1, max_iter = 1500, + threshold = 1e-06, verbose = FALSE, verbose_IRLS = FALSE) +} +\arguments{ +\item{X}{Numeric vector of length \emph{m} representing the covariates.} + +\item{Y}{Matrix of size \eqn{(n, m)} representing \emph{n} functions of \code{X} +observed at points \eqn{1,\dots,m}.} + +\item{K}{The number of mixture components.} + +\item{p}{The order of the polynomial regression.} + +\item{q}{The dimension of the logistic regression. For the purpose of +segmentation, it must be set to 1.} + +\item{n_tries}{Number of times EM algorithm will be launched. +The solution providing the highest log-likelihood will be returned. + +If \code{n_tries} > 1, then for the first pass, parameters are initialized +by uniformly segmenting the data into K segments, and for the next passes, +parameters are initialized by randomly segmenting the data into K contiguous +segments.} + +\item{max_iter}{The maximum number of iterations for the EM algorithm.} + +\item{threshold}{A numeric value specifying the threshold for the relative +difference of log-likelihood between two steps of the EM as stopping +criteria.} + +\item{verbose}{A logical value indicating whether values of the +log-likelihood should be printed during EM iterations.} + +\item{verbose_IRLS}{A logical value indicating whether values of the +criterion optimized by IRLS should be printed at each step of the EM +algorithm.} +} +\value{ +EM returns an object of class \link{ModelSNMoE}. +} +\description{ +emSNMoE is used to fit a SNMoE model. The estimation method is performed by +the Expectation-Maximization algorithm. +} +\details{ +emSNMoE function is based on the EM algorithm. This functions starts +with an initialization of the parameters done by the method \code{initParam} of +the class \link{ParamSNMoE}, then it alternates between a E-Step +(method of the class \link{StatSNMoE}) and a M-Step (method of the class +\link{ParamSNMoE}) until convergence (until the absolute difference of +log-likelihood between two steps of the EM algorithm is less than the +\code{threshold} parameter). +} +\seealso{ +\link{ModelSNMoE}, \link{ParamSNMoE}, \link{StatSNMoE} +} diff --git a/man/emStMoE.Rd b/man/emStMoE.Rd new file mode 100644 index 0000000..dea6c07 --- /dev/null +++ b/man/emStMoE.Rd @@ -0,0 +1,65 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/emStMoE.R +\name{emStMoE} +\alias{emStMoE} +\title{emStMoE is used to fit a StMoE model.} +\usage{ +emStMoE(X, Y, K, p = 3, q = 1, n_tries = 1, max_iter = 1500, + threshold = 1e-06, verbose = FALSE, verbose_IRLS = FALSE) +} +\arguments{ +\item{X}{Numeric vector of length \emph{m} representing the covariates.} + +\item{Y}{Matrix of size \eqn{(n, m)} representing \emph{n} functions of \code{X} +observed at points \eqn{1,\dots,m}.} + +\item{K}{The number of mixture components.} + +\item{p}{The order of the polynomial regression.} + +\item{q}{The dimension of the logistic regression. For the purpose of +segmentation, it must be set to 1.} + +\item{n_tries}{Number of times EM algorithm will be launched. +The solution providing the highest log-likelihood will be returned. + +If \code{n_tries} > 1, then for the first pass, parameters are initialized +by uniformly segmenting the data into K segments, and for the next passes, +parameters are initialized by randomly segmenting the data into K contiguous +segments.} + +\item{max_iter}{The maximum number of iterations for the EM algorithm.} + +\item{threshold}{A numeric value specifying the threshold for the relative +difference of log-likelihood between two steps of the EM as stopping +criteria.} + +\item{verbose}{A logical value indicating whether values of the +log-likelihood should be printed during EM iterations.} + +\item{verbose_IRLS}{A logical value indicating whether values of the +criterion optimized by IRLS should be printed at each step of the EM +algorithm.} + +\item{variance_type}{Numeric indicating if the model is homoskedastic +(\code{variance_type} = 1) or heteroskedastic (\code{variance_type} = 2).} +} +\value{ +EM returns an object of class \link{ModelStMoE}. +} +\description{ +emStMoE is used to fit a StMoE model. The estimation method is performed by +the Expectation-Maximization algorithm. +} +\details{ +emStMoE function is based on the EM algorithm. This functions starts +with an initialization of the parameters done by the method \code{initParam} of +the class \link{ParamStMoE}, then it alternates between a E-Step +(method of the class \link{StatStMoE}) and a M-Step (method of the class +\link{ParamStMoE}) until convergence (until the absolute difference of +log-likelihood between two steps of the EM algorithm is less than the +\code{threshold} parameter). +} +\seealso{ +\link{ModelStMoE}, \link{ParamStMoE}, \link{StatStMoE} +} diff --git a/man/emTMoE.Rd b/man/emTMoE.Rd new file mode 100644 index 0000000..f78fbbb --- /dev/null +++ b/man/emTMoE.Rd @@ -0,0 +1,65 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/emTMoE.R +\name{emTMoE} +\alias{emTMoE} +\title{emTMoE is used to fit a TMoE model.} +\usage{ +emTMoE(X, Y, K, p = 3, q = 1, n_tries = 1, max_iter = 1500, + threshold = 1e-06, verbose = FALSE, verbose_IRLS = FALSE) +} +\arguments{ +\item{X}{Numeric vector of length \emph{m} representing the covariates.} + +\item{Y}{Matrix of size \eqn{(n, m)} representing \emph{n} functions of \code{X} +observed at points \eqn{1,\dots,m}.} + +\item{K}{The number of mixture components.} + +\item{p}{The order of the polynomial regression.} + +\item{q}{The dimension of the logistic regression. For the purpose of +segmentation, it must be set to 1.} + +\item{n_tries}{Number of times EM algorithm will be launched. +The solution providing the highest log-likelihood will be returned. + +If \code{n_tries} > 1, then for the first pass, parameters are initialized +by uniformly segmenting the data into K segments, and for the next passes, +parameters are initialized by randomly segmenting the data into K contiguous +segments.} + +\item{max_iter}{The maximum number of iterations for the EM algorithm.} + +\item{threshold}{A numeric value specifying the threshold for the relative +difference of log-likelihood between two steps of the EM as stopping +criteria.} + +\item{verbose}{A logical value indicating whether values of the +log-likelihood should be printed during EM iterations.} + +\item{verbose_IRLS}{A logical value indicating whether values of the +criterion optimized by IRLS should be printed at each step of the EM +algorithm.} + +\item{variance_type}{Numeric indicating if the model is homoskedastic +(\code{variance_type} = 1) or heteroskedastic (\code{variance_type} = 2).} +} +\value{ +EM returns an object of class \link{ModelTMoE}. +} +\description{ +emTMoE is used to fit a TMoE model. The estimation method is performed by +the Expectation-Maximization algorithm. +} +\details{ +emStMoE function is based on the EM algorithm. This functions starts +with an initialization of the parameters done by the method \code{initParam} of +the class \link{ParamTMoE}, then it alternates between a E-Step +(method of the class \link{StatTMoE}) and a M-Step (method of the class +\link{ParamTMoE}) until convergence (until the absolute difference of +log-likelihood between two steps of the EM algorithm is less than the +\code{threshold} parameter). +} +\seealso{ +\link{ModelTMoE}, \link{ParamTMoE}, \link{StatTMoE} +} diff --git a/man/figures/README-unnamed-chunk-5-1.png b/man/figures/README-unnamed-chunk-5-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0289968ae8dfa99433fd7f55525d4ccae3e0ca94 GIT binary patch literal 61270 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 literal 0 HcmV?d00001 diff --git a/man/figures/README-unnamed-chunk-5-3.png b/man/figures/README-unnamed-chunk-5-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ff97775a1bf4e4f77c3435445348625fa0b6fa11 GIT binary patch literal 66559 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 KTz2vz<}$4ulv^-VPig8tU!S?O`rbFiP5^S5eja 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 literal 0 HcmV?d00001 diff --git a/man/figures/README-unnamed-chunk-5-4.png b/man/figures/README-unnamed-chunk-5-4.png new file mode 100644 index 0000000000000000000000000000000000000000..9d652847032989a7986530d8d253064a07e6d839 GIT binary patch literal 28085 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 O0(N|$ukxktd? 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

w)`UMKOTy2S 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 lU?P2hTK#|Zi!{hpBy~Nz+z|nPVRU@iav literal 0 HcmV?d00001 diff --git a/meteorit.Rproj b/meteorit.Rproj new file mode 100644 index 0000000..0ef8ced --- /dev/null +++ b/meteorit.Rproj @@ -0,0 +1,20 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: ASCII + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..22034c4 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,3 @@ +*.o +*.so +*.dll diff --git a/src/IRLS.cpp b/src/IRLS.cpp new file mode 100644 index 0000000..78d236d --- /dev/null +++ b/src/IRLS.cpp @@ -0,0 +1,284 @@ +// [[Rcpp::depends(RcppArmadillo)]] + +#include +#include "multinomialLogit.h" + +using namespace Rcpp; + +// This is a simple example of exporting a C++ function to R. You can +// source this function into an R session using the Rcpp::sourceCpp +// function (or via the Source button on the editor toolbar). Learn +// more about Rcpp at: +// +// http://www.rcpp.org/ +// http://adv-r.had.co.nz/Rcpp.html +// http://gallery.rcpp.org/ +// + +// [[Rcpp::export]] +List IRLS(arma::mat& X, arma::mat& Tau, arma::mat& Gamma, arma::mat& Winit, bool verbose = false) { + + // res = IRLS_MixFRHLP(X, Tau, Gamma, Winit, verbose) : an efficient Iteratively Reweighted Least-Squares (IRLS) algorithm for estimating + // the parameters of a multinomial logistic regression model given the + // "predictors" X and a partition (hard or smooth) Tau into K>=2 segments, + // and a cluster weights Gamma (hard or smooth) + // + // + // Inputs : + // + // X : desgin matrix for the logistic weights. dim(X) = [nx(q+1)] + // X = [1 t1 t1^2 ... t1^q + // 1 t2 t2^2 ... t2^q + // .. + // 1 ti ti^2 ... ti^q + // .. + // 1 tn tn^2 ... tn^q] + // q being the number of predictors + // Tau : matrix of a hard or fauzzy partition of the data (here for + // the RHLP model, Tau is the fuzzy partition represented by the + // posterior probabilities (responsibilities) (tik) obtained at the E-Step). + // + // Winit : initial parameter values W(0). dim(Winit) = [(q+1)x(K-1)] + // verbose : 1 to print the loglikelihood values during the IRLS + // iterations, 0 if not + // + // Outputs : + // + // res : structure containing the fields: + // W : the estimated parameter vector. matrix of dim [(q+1)x(K-1)] + // (the last vector being the null vector) + // piigk : the logistic probabilities (dim [n x K]) + // loglik : the value of the maximized objective + // LL : stored values of the maximized objective during the + // IRLS training + // + // Probs(i,gk) = Pro(segment k|cluster g;W) + // = \pi_{ik}(W) + // exp(wgk'vi) + // = --------------------------- + // 1+sum_{l=1}^{K-1} exp(wgl'vi) + // + // with : + // * Probs(i,gk) is the prob of component k at time t_i in + // cluster g + // i=1,...n,j=1...m, k=1,...,K, + // * vi = [1,ti,ti^2,...,ti^q]^T; + // The parameter vecrots are in the matrix W=[w1,...,wK] (with wK is the null vector); + // + + //// References + // Please cite the following papers for this code: + // + // + // @INPROCEEDINGS{Chamroukhi-IJCNN-2009, + // AUTHOR = {Chamroukhi, F. and Sam\'e, A. and Govaert, G. and Aknin, P.}, + // TITLE = {A regression model with a hidden logistic process for feature extraction from time series}, + // BOOKTITLE = {International Joint Conference on Neural Networks (IJCNN)}, + // YEAR = {2009}, + // month = {June}, + // pages = {489--496}, + // Address = {Atlanta, GA}, + // url = {https://chamroukhi.users.lmno.cnrs.fr/papers/chamroukhi_ijcnn2009.pdf} + // } + // + // @article{chamroukhi_et_al_NN2009, + // Address = {Oxford, UK, UK}, + // Author = {Chamroukhi, F. and Sam\'{e}, A. and Govaert, G. and Aknin, P.}, + // Date-Added = {2014-10-22 20:08:41 +0000}, + // Date-Modified = {2014-10-22 20:08:41 +0000}, + // Journal = {Neural Networks}, + // Number = {5-6}, + // Pages = {593--602}, + // Publisher = {Elsevier Science Ltd.}, + // Title = {Time series modeling by a regression approach based on a latent process}, + // Volume = {22}, + // Year = {2009}, + // url = {https://chamroukhi.users.lmno.cnrs.fr/papers/Chamroukhi_Neural_Networks_2009.pdf} + // } + // @article{Chamroukhi-FDA-2018, + // Journal = {}, + // Author = {Faicel Chamroukhi and Hien D. Nguyen}, + // Volume = {}, + // Title = {Model-Based Clustering and Classification of Functional Data}, + // Year = {2018}, + // eprint ={arXiv:1803.00276v2}, + // url = {https://chamroukhi.users.lmno.cnrs.fr/papers/MBCC-FDA.pdf} + // } + // + // + ////////////////////////////////////////////////////////////////////////////////////////////// + + int n = Tau.n_rows; + int K = Tau.n_cols; + + // Checker nrow(X) = nrow(Tau) = n + + int q = X.n_cols; // q here is (q+1) + + /* Handle NULL Winit and Gamma + * + * if nargin<4; Winit = zeros(q,K-1);end % if there is no a specified initialization + * if nargin<3; Gamma = ones(n,1);end % for standard weighted multinomial logistic regression + * + */ + + + + double lambda = 1e-9; // if a MAP regularization (a gaussian prior on W) (L_2 penalization); lambda is a positive hyperparameter + arma::mat I(q * (K - 1), q * (K - 1), arma::fill::eye); // Define an identity matrix + + arma::mat piik_old(n, K, arma::fill::zeros); + arma::mat piik(n, K, arma::fill::zeros); + arma::colvec gwk(n, arma::fill::zeros); + arma::colvec vq(n, arma::fill::zeros); + + arma::mat Hkl(q, q, arma::fill::zeros); + arma::colvec vqa(n, arma::fill::zeros); + arma::colvec vqb(n, arma::fill::zeros); + double hwk; + arma::colvec w(q * (K - 1), arma::fill::zeros); + + + // IRLS Initialization (iter = 0) + arma::mat W_old = Winit; + + List out = multinomialLogit(W_old, X, Tau, Gamma); + + double loglik_old = out["loglik"]; + arma::mat tmp = out["piik"]; + piik_old = tmp; + piik = tmp; + + + loglik_old = loglik_old - lambda * std::pow(arma::norm(W_old), 2.0); + + int iter = 0; + int max_iter = 300; + double loglik = 0; + + // List ret; + List LL; + + bool converge1 = false; + bool converge2 = false; + bool converge = false; + + arma::mat W(q, K - 1, arma::fill::zeros); + + if (verbose == true) { + Rcout << "IRLS : Iteration : " + std::to_string(iter) + "; Log-lik : " + std::to_string(loglik_old) + "\n"; + } + + // IRLS + + // Hw_old a squared matrix of dimensions q*(K-1) x q*(K-1) + int hx = q * (K - 1); + arma::mat Hw_old(hx, hx, arma::fill::zeros); + arma::mat gw_old(q, K - 1, arma::fill::zeros); + + + while (not(converge) && (iter < max_iter)) { + + // Gradient : + gw_old.reshape(q, (K - 1)); + for (int k = 0; k < K - 1; k++) { + gwk = Gamma % (Tau.col(k) - piik_old.col(k)); + + for (int qq = 0; qq < q; qq++) { + vq = X.col(qq); + gw_old(qq, k) = arma::as_scalar(gwk.t() * vq); + } + } + gw_old.reshape(q * (K - 1), 1); + + // Hessian + for (int k = 0; k < K - 1; k++) { + for (int ell = 0; ell < K - 1; ell++) { + bool delta_kl = (k == ell); // kronecker delta + gwk = Gamma % (piik_old.col(k) % (arma::mat(n, 1, arma::fill::ones) * delta_kl - piik_old.col(ell))); + for (int qqa = 0; qqa < q; qqa++) { + vqa = X.col(qqa); + for (int qqb = 0; qqb < q; qqb++) { + vqb = X.col(qqb); + hwk = as_scalar(vqb.t() * (gwk % vqa)); + Hkl(qqa, qqb) = hwk; + + } + } + Hw_old.submat(k * q, ell * q, (k + 1) * q - 1, (ell + 1) * q - 1) = -Hkl; + } + } + + // If a gaussian prior on W (lambda ~=0) + Hw_old = Hw_old + lambda * I; + gw_old = gw_old - lambda * vectorise(W_old, 0); + + // Newton Raphson : W(t+1) = W(t) - H(W(t))^(-1)g(W(t)) + w = vectorise(W_old, 0) - arma::inv(Hw_old) * gw_old; // [(q+1)x(K-1),1] + W.reshape(1, q * (K - 1)); + W = w; + W.reshape(q, K - 1); // [(q+1)*(K-1)] + + // Mise a jour des probas et de la loglik + out = multinomialLogit(W, X, Tau, Gamma); + loglik = out["loglik"]; + loglik = loglik - lambda * std::pow(arma::norm(W), 2.0); + arma::mat tmp = out["piik"]; + piik = tmp; + + // Check if Qw1(w^(t+1),w^(t))> Qw1(w^(t),w^(t)) + // (adaptive stepsize in case of troubles with stepsize 1) Newton Raphson : W(t+1) = W(t) - stepsize*H(W)^(-1)*g(W) + double stepsize = 1; // Initialisation pas d'adaptation de l'algo Newton raphson + double alpha = 2; + while (loglik < loglik_old) { + + stepsize = stepsize / alpha; + + // Recalculate the parameter W and the "loglik" + w = vectorise(W_old, 0) - stepsize * arma::inv(Hw_old) * gw_old; + W.reshape(1, q * (K - 1)); + W = w; + W.reshape(q, K - 1); + out = multinomialLogit(W, X, Tau, Gamma); + loglik = out["loglik"]; + + loglik = loglik - lambda * std::pow(arma::norm(W), 2.0); + + arma::mat tmp = out["piik"]; + piik = tmp; + } + + converge1 = std::abs((loglik - loglik_old) / loglik_old) <= 1e-7; + converge2 = std::abs(loglik - loglik_old) <= 1e-6; + converge = converge1 || converge2; + + piik_old = piik; + W_old = W; + iter = iter + 1; + LL[std::to_string(iter)] = loglik_old; + loglik_old = loglik; + + if (verbose == true) { + Rcout << "IRLS : Iteration : " + std::to_string(iter) + "; Log-lik" + std::to_string(loglik_old) + "\n"; + } + } // End of IRLS + + if (converge == true) { + if (verbose == true) { + Rcout << "\n"; + Rcout << "IRLS convergence OK ; nbr of iteration " + std::to_string(iter) + "\n"; + Rcout << "\n"; + } + } else { + Rcout << "\n"; + Rcout << "IRLS : doesn't converged (augment the number of iterations > " + std::to_string(iter) + "\n"; + } + + double reg_irls = 0; + if (lambda != 0) { // Calculate the value of the regularization part to calculate the value of the MAP criterion in case of regularization + reg_irls = - lambda * std::pow(arma::norm(W), 2.0); // bayesian l2 regularization + } + + return List::create(Named("W") = W, Named("LL") = LL, Named("loglik") = loglik, Named("piik") = piik, Named("reg_irls") = reg_irls); + // return ret; +} diff --git a/src/Makevars b/src/Makevars new file mode 100644 index 0000000..05ee448 --- /dev/null +++ b/src/Makevars @@ -0,0 +1,2 @@ +CXX_STD = CXX11 +PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) diff --git a/src/Makevars.win b/src/Makevars.win new file mode 100644 index 0000000..d715e49 --- /dev/null +++ b/src/Makevars.win @@ -0,0 +1,3 @@ +CXX_STD = CXX11 +PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) +PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp new file mode 100644 index 0000000..2974da8 --- /dev/null +++ b/src/RcppExports.cpp @@ -0,0 +1,48 @@ +// Generated by using Rcpp::compileAttributes() -> do not edit by hand +// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +#include +#include + +using namespace Rcpp; + +// IRLS +List IRLS(arma::mat& X, arma::mat& Tau, arma::mat& Gamma, arma::mat& Winit, bool verbose); +RcppExport SEXP _meteorit_IRLS(SEXP XSEXP, SEXP TauSEXP, SEXP GammaSEXP, SEXP WinitSEXP, SEXP verboseSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< arma::mat& >::type X(XSEXP); + Rcpp::traits::input_parameter< arma::mat& >::type Tau(TauSEXP); + Rcpp::traits::input_parameter< arma::mat& >::type Gamma(GammaSEXP); + Rcpp::traits::input_parameter< arma::mat& >::type Winit(WinitSEXP); + Rcpp::traits::input_parameter< bool >::type verbose(verboseSEXP); + rcpp_result_gen = Rcpp::wrap(IRLS(X, Tau, Gamma, Winit, verbose)); + return rcpp_result_gen; +END_RCPP +} +// multinomialLogit +List multinomialLogit(arma::mat& W, arma::mat& X, arma::mat& Y, arma::mat& Gamma); +RcppExport SEXP _meteorit_multinomialLogit(SEXP WSEXP, SEXP XSEXP, SEXP YSEXP, SEXP GammaSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< arma::mat& >::type W(WSEXP); + Rcpp::traits::input_parameter< arma::mat& >::type X(XSEXP); + Rcpp::traits::input_parameter< arma::mat& >::type Y(YSEXP); + Rcpp::traits::input_parameter< arma::mat& >::type Gamma(GammaSEXP); + rcpp_result_gen = Rcpp::wrap(multinomialLogit(W, X, Y, Gamma)); + return rcpp_result_gen; +END_RCPP +} + +static const R_CallMethodDef CallEntries[] = { + {"_meteorit_IRLS", (DL_FUNC) &_meteorit_IRLS, 5}, + {"_meteorit_multinomialLogit", (DL_FUNC) &_meteorit_multinomialLogit, 4}, + {NULL, NULL, 0} +}; + +RcppExport void R_init_meteorit(DllInfo *dll) { + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); +} diff --git a/src/multinomialLogit.cpp b/src/multinomialLogit.cpp new file mode 100644 index 0000000..b47a1a2 --- /dev/null +++ b/src/multinomialLogit.cpp @@ -0,0 +1,117 @@ +// [[Rcpp::depends(RcppArmadillo)]] + +#include + +using namespace Rcpp; + +// This is a simple example of exporting a C++ function to R. You can +// source this function into an R session using the Rcpp::sourceCpp +// function (or via the Source button on the editor toolbar). Learn +// more about Rcpp at: +// +// http://www.rcpp.org/ +// http://adv-r.had.co.nz/Rcpp.html +// http://gallery.rcpp.org/ +// + +// [[Rcpp::export]] +List multinomialLogit(arma::mat& W, arma::mat& X, arma::mat& Y, arma::mat& Gamma) { + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // function [probs, loglik] = logit_model_MixRHLP(W, X, Y, Gamma) + // + // calculates the pobabilities according to multinomial logistic model: + // + // probs(i,k) = p(zi=k;W)= \pi_{ik}(W) + // exp(wk'vi) + // = ---------------------------- + // 1 + sum_{l=1}^{K-1} exp(wl'vi) + // for i=1,...,n and k=1...K + // + // Inputs : + // + // 1. W : parametre du modele logistique ,Matrice de dimensions + // [(q+1)x(K-1)]des vecteurs parametre wk. W = [w1 .. wk..w(K-1)] + // avec les wk sont des vecteurs colonnes de dim [(q+1)x1], le dernier + // est suppose nul (sum_{k=1}^K \pi_{ik} = 1 -> \pi{iK} = + // 1-sum_{l=1}^{K-1} \pi{il}. vi : vecteur colonne de dimension [(q+1)x1] + // qui est la variable explicative (ici le temps): vi = [1;ti;ti^2;...;ti^q]; + // 2. M : Matrice de dimensions [nx(q+1)] des variables explicatives. + // M = transpose([v1... vi ....vn]) + // = [1 t1 t1^2 ... t1^q + // 1 t2 t2^2 ... t2^q + // .. + // 1 ti ti^2 ... ti^q + // .. + // 1 tn tn^2 ... tn^q] + // q : ordre de regression logistique + // n : nombre d'observations + // 3. Y Matrice de la partition floue (les probs a posteriori tik) + // tik = p(zi=k|xi;theta^m); Y de dimensions [nxK] avec K le nombre de classes + // Sorties : + // + // 1. probs : Matrice de dim [nxK] des probabilites p(zi=k;W) de la vaiable zi + // (i=1,...,n) + // 2. loglik : logvraisemblance du parametre W du modele logistique + // loglik = Q1(W) = E(l(W;Z)|X;theta^m) = E(p(Z;W)|X;theta^m) + // = logsum_{i=1}^{n} sum_{k=1}^{K} tik log p(zi=k;W) + // + // Cette fonction peut egalement ?tre utilis?e pour calculer seulement les + // probs de la fa?oc suivante : probs = modele_logit(W,X) + // + // Faicel Chamroukhi 31 Octobre 2008 (mise ? jour) + ///////////////////////////////////////////////////////////////////////////////////////// + + unsigned n = X.n_rows; + unsigned q = X.n_cols; + + unsigned K = Y.n_cols; + + // Handle different q + if (q != W.n_rows) { + stop("W must have q + 1 rows and X must have q + 1 columns."); + } + + arma::mat Wc = W; + // Handle size of K issues + if (Wc.n_cols == (K - 1)) { // W doesnt contain the null vector associated with the last class + Wc = join_rows(Wc, arma::mat(q, 1, arma::fill::zeros)); // Add the null vector wK for the last component probability + } + if (Wc.n_cols != K) { + stop("W must have K - 1 or K columns."); + } + + // Handle different n + if ((n != Y.n_cols) && (n != Gamma.n_rows)) { + stop("X, Y and Gamma must have the same number of rows which is n."); + } + + arma::mat XW(n, K, arma::fill::zeros); + arma::colvec maxm(n, arma::fill::zeros); + arma::mat expXW(n, K, arma::fill::zeros); + arma::mat piik(n, K, arma::fill::zeros); + arma::mat GammaMat(n, K, arma::fill::ones); + + GammaMat = Gamma * arma::rowvec(K, arma::fill::ones); + + double loglik; + + XW = X * Wc; + maxm = arma::max(XW, 1); + + XW = XW - maxm * arma::rowvec(K, arma::fill::ones); // To avoid overfolow + + double minvalue = -745.1; + XW = arma::max(XW, minvalue * arma::mat(XW.n_rows, XW.n_cols, arma::fill::ones)); + double maxvalue = 709.78; + XW = arma::min(XW, maxvalue * arma::mat(XW.n_rows, XW.n_cols, arma::fill::ones)); + expXW = arma::exp(XW); + + piik = expXW / (arma::sum(expXW, 1) * arma::rowvec(K, arma::fill::ones)); + + // log-likelihood + loglik = sum(sum((GammaMat % (Y % XW)) - ((GammaMat % Y) % arma::log(arma::sum(expXW, 1) * arma::rowvec(K, arma::fill::ones))))); + + return List::create(Named("loglik") = loglik, Named("piik") = piik); + +} diff --git a/src/multinomialLogit.h b/src/multinomialLogit.h new file mode 100644 index 0000000..b9e88e3 --- /dev/null +++ b/src/multinomialLogit.h @@ -0,0 +1,9 @@ +// Defines a header file containing function signatures for functions in src/ + +// Protect signatures using an inclusion guard. +#ifndef multinomialLogit_H +#define multinomialLogit_H + +Rcpp::List multinomialLogit(arma::mat& W, arma::mat& X, arma::mat& Y, arma::mat& Gamma); + +#endif diff --git a/vignettes/.gitignore b/vignettes/.gitignore new file mode 100644 index 0000000..097b241 --- /dev/null +++ b/vignettes/.gitignore @@ -0,0 +1,2 @@ +*.html +*.R diff --git a/vignettes/A-quick-tour-of-SNMoE.Rmd b/vignettes/A-quick-tour-of-SNMoE.Rmd new file mode 100644 index 0000000..51d6936 --- /dev/null +++ b/vignettes/A-quick-tour-of-SNMoE.Rmd @@ -0,0 +1,94 @@ +--- +title: "A-quick-tour-of-SNMoE" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{A-quick-tour-of-SNMoE} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include=FALSE} +library(knitr) +knitr::opts_chunk$set( + fig.align = "center", + fig.height = 5.5, + fig.width = 6, + warning = FALSE, + collapse = TRUE, + dev.args = list(pointsize = 10), + out.width = "90%", + par = TRUE +) +knit_hooks$set(par = function(before, options, envir) + { if (before && options$fig.show != "none") + par(family = "sans", mar = c(4.1,4.1,1.1,1.1), mgp = c(3,1,0), tcl = -0.5) +}) +``` + +```{r, message = FALSE, echo = FALSE} +library(meteorit) +``` + +# Introduction + +**MEteorit** is a toolbox containg several original and flexible mixtures-of-experts models to model, cluster and classify heteregenous data in many complex situations where the data are distributed according non-normal, possibly skewed distributions, and when they might be corrupted by atypical observations. The toolbox contains in particular sparse mixture-of-experts models for high-dimensional data. +It was written in R Markdown, using the [knitr](https://cran.r-project.org/package=knitr) package for production. +See `help(package="meteorit")` for further details and references provided by `citation("meteorit")`. + +# Load data + +```{r} +data("simulatedstructureddata") +``` + +# Set up SNMoE model parameters + +```{r} +K <- 2 # number of regimes (mixture components) +p <- 1 # dimension of beta (order of the polynomial regressors) +q <- 1 # dimension of w (order of the logistic regression: to be set to 1 for segmentation) +``` + +# Set up EM parameters + +```{r} +n_tries <- 1 +max_iter = 1500 +threshold <- 1e-6 +verbose <- TRUE +verbose_IRLS <- FALSE +``` + +# Estimation + +```{r} +snmoe <- emSNMoE(simulatedstructureddata$X, matrix(simulatedstructureddata$Y), + K, p, q, n_tries, max_iter, threshold, verbose, verbose_IRLS) +``` + + +# Plots + +## Mean curve + +```{r} +snmoe$plot(what = "meancurve") +``` + +## Confidence regions + +```{r} +snmoe$plot(what = "confregions") +``` + +## Clusters + +```{r} +snmoe$plot(what = "clusters") +``` + +## Log-likelihood + +```{r} +snmoe$plot(what = "loglikelihood") +``` diff --git a/vignettes/A-quick-tour-of-StMoE.Rmd b/vignettes/A-quick-tour-of-StMoE.Rmd new file mode 100644 index 0000000..a9a9504 --- /dev/null +++ b/vignettes/A-quick-tour-of-StMoE.Rmd @@ -0,0 +1,93 @@ +--- +title: "A-quick-tour-of-StMoE" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{A-quick-tour-of-StMoE} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include=FALSE} +library(knitr) +knitr::opts_chunk$set( + fig.align = "center", + fig.height = 5.5, + fig.width = 6, + warning = FALSE, + collapse = TRUE, + dev.args = list(pointsize = 10), + out.width = "90%", + par = TRUE +) +knit_hooks$set(par = function(before, options, envir) + { if (before && options$fig.show != "none") + par(family = "sans", mar = c(4.1,4.1,1.1,1.1), mgp = c(3,1,0), tcl = -0.5) +}) +``` + +```{r, message = FALSE, echo = FALSE} +library(meteorit) +``` + +# Introduction + +**MEteorit** is a toolbox containg several original and flexible mixtures-of-experts models to model, cluster and classify heteregenous data in many complex situations where the data are distributed according non-normal, possibly skewed distributions, and when they might be corrupted by atypical observations. The toolbox contains in particular sparse mixture-of-experts models for high-dimensional data. +It was written in R Markdown, using the [knitr](https://cran.r-project.org/package=knitr) package for production. +See `help(package="meteorit")` for further details and references provided by `citation("meteorit")`. + +# Load data + +```{r} +data("simulatedstructureddata") +``` + +# Set up StMoE model parameters + +```{r} +K <- 2 # Number of regimes (mixture components) +p <- 1 # Dimension of beta (order of the polynomial regressors) +q <- 1 # Dimension of w (order of the logistic regression: to be set to 1 for segmentation) + +``` + +# Set up EM parameters + +```{r} +n_tries <- 1 +max_iter <- 1500 +threshold <- 1e-5 +verbose <- TRUE +verbose_IRLS <- FALSE +``` + +# Estimation + +```{r} +stmoe <- emStMoE(simulatedstructureddata$X, matrix(simulatedstructureddata$Y), K, p, q, n_tries, max_iter, threshold, verbose, verbose_IRLS) +``` + +# Plots + +## Mean curve + +```{r} +stmoe$plot(what = "meancurve") +``` + +## Confidence regions + +```{r} +stmoe$plot(what = "confregions") +``` + +## Clusters + +```{r} +stmoe$plot(what = "clusters") +``` + +## Log-likelihood + +```{r} +stmoe$plot(what = "loglikelihood") +``` diff --git a/vignettes/A-quick-tour-of-tMoE.Rmd b/vignettes/A-quick-tour-of-tMoE.Rmd new file mode 100644 index 0000000..9797a1b --- /dev/null +++ b/vignettes/A-quick-tour-of-tMoE.Rmd @@ -0,0 +1,92 @@ +--- +title: "A-quick-tour-of-tMoE" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{A-quick-tour-of-tMoE} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include=FALSE} +library(knitr) +knitr::opts_chunk$set( + fig.align = "center", + fig.height = 5.5, + fig.width = 6, + warning = FALSE, + collapse = TRUE, + dev.args = list(pointsize = 10), + out.width = "90%", + par = TRUE +) +knit_hooks$set(par = function(before, options, envir) + { if (before && options$fig.show != "none") + par(family = "sans", mar = c(4.1,4.1,1.1,1.1), mgp = c(3,1,0), tcl = -0.5) +}) +``` + +```{r, message = FALSE, echo = FALSE} +library(meteorit) +``` + +# Introduction + +**MEteorit** is a toolbox containg several original and flexible mixtures-of-experts models to model, cluster and classify heteregenous data in many complex situations where the data are distributed according non-normal, possibly skewed distributions, and when they might be corrupted by atypical observations. The toolbox contains in particular sparse mixture-of-experts models for high-dimensional data. +It was written in R Markdown, using the [knitr](https://cran.r-project.org/package=knitr) package for production. +See `help(package="meteorit")` for further details and references provided by `citation("meteorit")`.E")`. + +# Load data + +```{r} +data("simulatedstructureddata") +``` + +# Set up tMoE model parameters + +```{r} +K <- 2 # Number of regimes (mixture components) +p <- 1 # Dimension of beta (order of the polynomial regressors) +q <- 1 # Dimension of w (order of the logistic regression: to be set to 1 for segmentation) +``` + +# Set up EM parameters + +```{r} +n_tries <- 1 +max_iter <- 1500 +threshold <- 1e-5 +verbose <- TRUE +verbose_IRLS <- FALSE +``` + +# Estimation + +```{r} +tmoe <- emTMoE(simulatedstructureddata$X, matrix(simulatedstructureddata$Y), K, p, q, n_tries, max_iter, threshold, verbose, verbose_IRLS) +``` + +# Plots + +## Mean curve + +```{r} +tmoe$plot(what = "meancurve") +``` + +## Confidence regions + +```{r} +tmoe$plot(what = "confregions") +``` + +## Clusters + +```{r} +tmoe$plot(what = "clusters") +``` + +## Log-likelihood + +```{r} +tmoe$plot(what = "loglikelihood") +```