| 1 | constructionModelesLassoMLE = function(phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,glambda, |
| 2 | X,Y,seuil,tau,selected) |
| 3 | { |
| 4 | #TODO: parameter ncores (chaque tâche peut aussi demander du parallélisme...) |
| 5 | cl = parallel::makeCluster( parallel::detectCores() / 4 ) |
| 6 | parallel::clusterExport(cl=cl, |
| 7 | varlist=c("phiInit","rhoInit","gamInit","mini","maxi","glambda","X","Y","seuil","tau"), |
| 8 | envir=environment()) |
| 9 | #Pour chaque lambda de la grille, on calcule les coefficients |
| 10 | out = parLapply( seq_along(glambda), function(lambdaindex) |
| 11 | { |
| 12 | n = dim(X)[1] |
| 13 | p = dim(phiInit)[1] |
| 14 | m = dim(phiInit)[2] |
| 15 | k = dim(phiInit)[3] |
| 16 | |
| 17 | #TODO: phiInit[selected] et X[selected] sont bien sûr faux; par quoi remplacer ? |
| 18 | #lambda == 0 c'est normal ? |
| 19 | res = EMGLLF(phiInit[selected],rhoInit,piInit,gamInit,mini,maxi,gamma,0.,X[selected],Y,tau) |
| 20 | |
| 21 | #comment évaluer la dimension à partir du résultat et de [not]selected ? |
| 22 | #dimension = ... |
| 23 | |
| 24 | #on veut calculer l'EMV avec toutes nos estimations |
| 25 | densite = vector("double",n) |
| 26 | for (r in 1:k) |
| 27 | { |
| 28 | delta = Y%*%rho[,,r] - (X[selected]%*%res$phi[selected,,r]) |
| 29 | densite = densite + pi[r] * |
| 30 | det(rho[,,r])/(sqrt(2*base::pi))^m * exp(-tcrossprod(delta)/2.0) |
| 31 | } |
| 32 | llh = c( sum(log(densite[,lambdaIndex])), (dimension+m+1)*k-1 ) |
| 33 | list("phi"=res$phi, "rho"=res$rho, "pi"=res$pi, "llh" = llh) |
| 34 | }) |
| 35 | parallel::stopCluster(cl) |
| 36 | out |
| 37 | } |