7 # regression data (size n*p, where n is the number of observations,
8 # and p is the number of regressors)
10 # response data (size n*m, where n is the number of observations,
11 # and m is the number of responses)
14 # Optionally user defined (some default values)
16 # power in the penalty
18 # minimum number of iterations for EM algorithm
20 # maximum number of iterations for EM algorithm
22 # threshold for stopping EM algorithm
24 # minimum number of components in the mixture
26 # maximum number of components in the mixture
31 # Computed through the workflow
33 # initialisation for the reparametrized conditional mean parameter
35 # initialisation for the reparametrized variance parameter
37 # initialisation for the proportions
39 # initialisation for the allocations probabilities in each component
41 # values for the regularization parameter grid
43 # je ne crois pas vraiment qu'il faille les mettre en sortie, d'autant plus qu'on construit
44 # une matrice A1 et A2 pour chaque k, et elles sont grandes, donc ca coute un peu cher ...
47 # collection of estimations for the reparametrized conditional mean parameters
49 # collection of estimations for the reparametrized variance parameters
51 # collection of estimations for the proportions parameters
59 #######################
60 #initialize main object
61 #######################
62 initialize = function(X,Y,...)
64 "Initialize SelMix object"
70 gamma <<- ifelse (hasArg("gamma"), gamma, 1.)
71 mini <<- ifelse (hasArg("mini"), mini, as.integer(5))
72 maxi <<- ifelse (hasArg("maxi"), maxi, as.integer(10))
73 eps <<- ifelse (hasArg("eps"), eps, 1e-6)
74 kmin <<- ifelse (hasArg("kmin"), kmin, as.integer(2))
75 kmax <<- ifelse (hasArg("kmax"), kmax, as.integer(3))
76 rangmin <<- ifelse (hasArg("rangmin"), rangmin, as.integer(2))
77 rangmax <<- ifelse (hasArg("rangmax"), rangmax, as.integer(3))
80 ##################################
81 #core workflow: compute all models
82 ##################################
84 initParameters = function(k)
86 "Parameters initialization"
88 #smallEM initializes parameters by k-means and regression model in each component,
89 #doing this 20 times, and keeping the values maximizing the likelihood after 10
90 #iterations of the EM algorithm.
91 init = initSmallEM(k,sx.X,sx.Y,sx.eps);
92 phiInit <<- init$phi0;
93 rhoInit <<- init$rho0;
95 tauInit <<- init$tau0;
98 computeGridLambda = function()
100 "computation of the regularization grid"
101 #(according to explicit formula given by EM algorithm)
103 gridLambda <<- gridLambda(sx.phiInit,sx.rhoInit,sx.piInit,sx.tauInit,sx.X,sx.Y,
104 sx.gamma,sx.mini,sx.maxi,sx.eps);
107 computeRelevantParameters = function()
109 "Compute relevant parameters"
111 #select variables according to each regularization parameter
112 #from the grid: sx.A1 corresponding to selected variables, and
113 #sx.A2 corresponding to unselected variables.
114 params = selectiontotale(sx.phiInit,sx.rhoInit,sx.piInit,sx.tauInit,sx.mini,sx.maxi,
115 sx.gamma,sx.gridLambda,sx.X,sx.Y,sx.seuil,sx.eps);
122 runProcedure1 = function()
124 "Run procedure 1 [EMGLLF]"
126 #compute parameter estimations, with the Maximum Likelihood
127 #Estimator, restricted on selected variables.
128 res = constructionModelesLassoMLE(sx.phiInit,sx.rhoInit,sx.piInit,sx.tauInit,
129 sx.mini,sx.maxi,sx.gamma,sx.gridLambda,sx.X,sx.Y,sx.seuil,sx.eps,sx.A1,sx.A2);
130 return (list( phi=res$phi, rho=res$rho, pi=res$pi))
133 runProcedure2 = function()
135 "Run procedure 2 [EMGrank]"
137 #compute parameter estimations, with the Low Rank
138 #Estimator, restricted on selected variables.
139 return (constructionModelesLassoRank(sx.Pi,sx.Rho,sx.mini,sx.maxi,sx.X,sx.Y,sx.eps,
140 sx.A1,sx.rangmin,sx.rangmax)$phi)
143 run = function(procedure)
145 "main loop: over all k and all lambda"
147 # Run the all procedure, 1 with the
148 #maximum likelihood refitting, and 2 with the Low Rank refitting.
156 computeRelevantParameters()
159 r1 = runProcedure1(sx)
165 if size(Phi2) == 0 #TODO: continue translation MATLAB --> R
166 Phi(:,:,1:k,:) = r1$phi;
167 Rho(:,:,1:k,:) = r1$rho;
170 Phi = zeros(p,m,sx.kmax,size(Phi2,4)+size(r1$phi,4));
171 Phi(:,:,1:size(Phi2,3),1:size(Phi2,4)) = Phi2;
172 Phi(:,:,1:k,size(Phi2,4)+1:end) = r1$phi;
173 Rho = zeros(m,m,sx.kmax,size(Rho2,4)+size(r1$rho,4));
174 Rho(:,:,1:size(Rho2,3),1:size(Rho2,4)) = Rho2;
175 Rho(:,:,1:k,size(Rho2,4)+1:end) = r1$rho;
176 Pi = zeros(sx.kmax,size(Pi2,2)+size(r1$pi,2));
177 Pi(1:size(Pi2,1),1:size(Pi2,2)) = Pi2;
178 Pi(1:k,size(Pi2,2)+1:end) = r1$pi;
181 [phi] = runProcedure2(sx);
185 sx.Phi(:,:,1:k,:) = phi;
188 sx.Phi = zeros(p,m,sx.kmax,size(Phi2,4)+size(phi,4));
190 sx.Phi(:,:,1:size(Phi2,3),1:size(Phi2,4)) = Phi2;
191 sx.Phi(:,:,1:k,size(Phi2,4)+1:end) = phi;
200 ##################################################
201 #pruning: select only one (or a few best ?!) model
202 ##################################################
204 # function[model] selectModel(sx)
206 # #model = sxModel(...);