1 #' constructionModelesLassoRank
10 constructionModelesLassoRank = function(pi, rho, mini, maxi, X, Y, tau, A1, rangmin,
11 rangmax, ncores, fast=TRUE, verbose=FALSE)
19 # On cherche les rangs possiblement intéressants
20 deltaRank = rangmax - rangmin + 1
22 Rank = matrix(0, nrow=Size, ncol=k)
25 # On veut le tableau de toutes les combinaisons de rangs possibles
26 # Dans la première colonne : on répète (rangmax-rangmin)^(k-1) chaque chiffre :
27 # ça remplit la colonne
28 # Dans la deuxieme : on répète (rangmax-rangmin)^(k-2) chaque chiffre,
29 # et on fait ça (rangmax-rangmin)^2 fois
31 # Dans la dernière, on répète chaque chiffre une fois,
32 # et on fait ça (rangmin-rangmax)^(k-1) fois.
33 Rank[,r] = rangmin + rep(0:(deltaRank-1), deltaRank^(r-1), each=deltaRank^(k-r))
38 cl = parallel::makeCluster(ncores, outfile='')
39 parallel::clusterExport( cl, envir=environment(),
40 varlist=c("A1","Size","Pi","Rho","mini","maxi","X","Y","tau",
41 "Rank","m","phi","ncores","verbose") )
44 computeAtLambda <- function(lambdaIndex)
47 require("valse") #workers start with an empty environment
49 # on ne garde que les colonnes actives
50 # 'active' sera l'ensemble des variables informatives
51 active = A1[,lambdaIndex]
52 active = active[-(active==0)]
53 phi = array(0, dim=c(p,m,k,Size))
54 llh = matrix(0, Size, 2) #log-likelihood
55 if (length(active) > 0)
59 res = EMGrank(Pi[,lambdaIndex], Rho[,,,lambdaIndex], mini, maxi,
60 X[,active], Y, tau, Rank[j,], fast)
62 c( res$LLF, sum(Rank[j,] * (length(active)- Rank[j,] + m)) ) )
63 phi[active,,,] = rbind(phi[active,,,], res$phi)
66 list("llh"=llh, "phi"=phi)
69 #Pour chaque lambda de la grille, on calcule les coefficients
72 parLapply(cl, seq_along(glambda), computeAtLambda)
74 lapply(seq_along(glambda), computeAtLambda)
77 parallel::stopCluster(cl)
79 # TODO: this is a bit ugly. Better use bigmemory and fill llh/phi in-place
80 # (but this also adds a dependency...)
81 llh <- do.call( rbind, lapply(out, function(model) model$llh) )
82 phi <- do.call( rbind, lapply(out, function(model) model$phi) )
83 list("llh"=llh, "phi"=phi)