X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=pkg%2FR%2FEMGrank.R;h=5eea322f6c47c677d843cca24205f0afea64c24a;hb=9ccdd55a1f6e9d409e8ae43b878a5e89c42e20c7;hp=e30b605134d79b0ced43c3f80c2622e28b5a3aad;hpb=aa480ac1fef50618978307a4df2cf9da1e285abc;p=valse.git diff --git a/pkg/R/EMGrank.R b/pkg/R/EMGrank.R index e30b605..5eea322 100644 --- a/pkg/R/EMGrank.R +++ b/pkg/R/EMGrank.R @@ -2,7 +2,6 @@ #' #' Description de EMGrank #' -#' @param phiInit ... #' @param Pi Parametre de proportion #' @param Rho Parametre initial de variance renormalisé #' @param mini Nombre minimal d'itérations dans l'algorithme EM @@ -22,7 +21,7 @@ EMGrank <- function(Pi, Rho, mini, maxi, X, Y, tau, rank, fast=TRUE) if (!fast) { # Function in R - return (EMGrank_R(Pi, Rho, mini, maxi, X, Y, tau, rank)) + return (.EMGrank_R(Pi, Rho, mini, maxi, X, Y, tau, rank)) } # Function in C @@ -47,7 +46,7 @@ matricize <- function(X) } # R version - slow but easy to read -EMGrank_R = function(Pi, Rho, mini, maxi, X, Y, tau, rank) +.EMGrank_R = function(Pi, Rho, mini, maxi, X, Y, tau, rank) { #matrix dimensions n = dim(X)[1] @@ -70,14 +69,14 @@ EMGrank_R = function(Pi, Rho, mini, maxi, X, Y, tau, rank) ite = 1 while (ite<=mini || (ite<=maxi && sumDeltaPhi>tau)) { - #M step: Mise à jour de Beta (et donc phi) + #M step: update for Beta ( and then phi) for(r in 1:k) { - Z_indice = seq_len(n)[Z==r] #indices où Z == r + Z_indice = seq_len(n)[Z==r] #indices where Z == r if (length(Z_indice) == 0) next #U,S,V = SVD of (t(Xr)Xr)^{-1} * t(Xr) * Yr - s = svd( ginv(crossprod(matricize(X[Z_indice,]))) %*% + s = svd( MASS::ginv(crossprod(matricize(X[Z_indice,]))) %*% crossprod(matricize(X[Z_indice,]),matricize(Y[Z_indice,])) ) S = s$d #Set m-rank(r) singular values to zero, and recompose @@ -87,7 +86,7 @@ EMGrank_R = function(Pi, Rho, mini, maxi, X, Y, tau, rank) phi[,,r] = s$u %*% diag(S) %*% t(s$v) %*% Rho[,,r] } - #Etape E et calcul de LLF + #Step E and computation of the loglikelihood sumLogLLF2 = 0 for(i in seq_len(n)) { @@ -107,7 +106,7 @@ EMGrank_R = function(Pi, Rho, mini, maxi, X, Y, tau, rank) } sumLogLLF2 = sumLogLLF2 + log(sumLLF1) } - + LLF = -1/n * sumLogLLF2 #update distance parameter to check algorithm convergence (delta(phi, Phi))