Moyennes croisées avec la fonction means()

L'essentiel de cette page

La fonction means() dont voici le programme ci-dessous systématise le calcule de la moyenne en fonction d'une ou plusieurs variables de catégories. Il fournit au passage écart-type et intervalle de confiance, ce qui la rend plus performante en routine que la fonction by().

  • La fonction means() permet de calculer automatiquement tous les moyennes pour les paramètres existants ou en fonction de deux listes de paramètres
means = function(data=c(),par=c(),par2=c()) { # Version 2019 - v0.0.8 
  if ((length(data)==0)| (length(par)==0)){ 
  if ( (length(data)==0)) {cat("Erreur ! Le vecteur ",substitute(data),"est vide.\n")} 
  if ( (length(par)==0))  {cat("Erreur ! Le vecteur ",substitute(par),"est vide.\n")} 
 } else { if (length(par2)>0) { 
  if ( (length(par) != length(data)) | (length(par2) != length(data)) | (length(par) != length(par2)) ) {
   cat("Erreur ! Les trois vecteurs n'ont pas la même taille.\n")
  }else {
   if (length(data[is.na(data)]>0)|length(par[is.na(par)]>0)|length(data[is.na(par2)]>0))
                  {cat("Attention ! Présence de valeurs vides NA\n")} 
   tab_temp <- na.omit(data.frame(data,par,par2))
   data <- tab_temp[,1];par <- tab_temp[,2];par2 <- tab_temp[,3]
        y = unique(par) ;    y2 = unique(par2)    
        matrice = matrix(rep(NA,length(y)*length(y2)), nc=length(y2), nr=length(y), byrow=F) 
        rownames(matrice) = y ; colnames(matrice) = y2 
        matrice_moyennes = matrice ; matrice_sd = matrice ; matrice_ic = matrice    
            resultat = c()        
            for (i in c(1:length(y2))){ 
            for (j in c(1:length(y))) { 
                temp = data[par2==y2[i]&par==y[j]] 
                matrice_moyennes[j,i] = mean(temp,na.rm = TRUE) 
                if(length(temp)==0){sd_temp=NA} 
                else {sd_temp = sd(temp,na.rm = TRUE)} 
                matrice_sd[j,i] = sd_temp 
                if(length(temp)==0){ic_temp=NA} 
                else {ic_temp = sd(temp,na.rm = TRUE)*1.96/sqrt(length(temp))} 
                matrice_ic[j,i] = ic_temp}} 
            resultat$moyennes = matrice_moyennes 
        resultat$sd = matrice_sd 
            resultat$ic = matrice_ic  ; 
        return(resultat)}
 } else { 
  if (length(par) != length(data)){
  cat("Erreur ! Les deux vecteurs n'ont pas la même taille.\n")
            } else {
   if (length(data[is.na(data)]>0)|length(par[is.na(par)]>0))
                  {cat("Attention ! Présence de valeurs vides NA\n")} 
             par = par[!is.na(data)];data = data[!is.na(data)];data = data[!is.na(par)];par = par[!is.na(par)] 
             temp = split(data,par,drop=TRUE) 
             x = c() ; y = sort(unique(par)) ; z = c() ; w = c() ; resultat = list() 
             for (i in c(1:(length(y)))) { 
                x = c(x,mean(temp[[i]],na.rm = TRUE)) 
                if (length(temp[[i]]) > 1) { 
                    z = c(z,sd(temp[[i]],na.rm = TRUE))  
                    w = c(w,sd(temp[[i]],na.rm = TRUE)*1.96/sqrt(length(temp[[i]])))} 
                else {z = c(z,NA);w = c(w,NA)} 
             }   
            resultat$moyennes = x[order(y)] ; resultat$sd = z[order(y)] 
           resultat$ic = w[order(y)] ; resultat$parametres = y[order(y)] 
            return(resultat)}}} }
# Voir l'exemple de l'application means ci-dessous 
  • Exemple d'application de la fonction means()
# Etape 1 - Je colle la fonction means dans le logiciel R (ci-dessus) 

# Etape 2 - voici des données (exemple) - ici je veux le nombre moyen de colis reçus par jour 
Nombre_de_colis = rnorm(91,10) ; Jours = rep(c("L","M","M","J","V","S","D"),13) 
Nombre_de_colis # colis reçus par jour sur une période de 91 jours 
Jours # Jours concernés 
# Calcul de ces ces moyennes et intervalles de confiance 


# Calcule le nombre moyen de colis et l'intervalle de confiance correspondant pour chaque jour étudié. 
analyse = means(Nombre_de_colis, Jours) 
analyse  

#  Etape 3 - lecture des résultats 
# avec analyse$moyennes les moyennes pour chaque jour 
# analyse$parametres les paramètres propres à chaque moyenne (ici les types de jours) 
# analyse$sd les écart-types correspondants 
# analyse$ic les intervalles de confiance correspondants 


#- - - - - - - Autre exemple plus complexe - - - - - - - 
# Calculer la taille moyenne en fonction de l'âge et du sexe 
Taille = rnorm(100,170) ; Age = rep(c(20:39),5) ; Sexe = c(rep("F",50),rep("G",50)) 
means(Taille,Age,Sexe)