{MissMDA} permet de faire de l'imputation de données (réparer les trous dans les données) à condition qu'elles soient de type MAR (Missing At Random), si elle manque en X cela ne dépend pas de la valeur de X et l'on peut retrouver sa valeur en analysant les autres variables.
library(VIM)
data(sleep)
# On simplifie le jeu de données sleep en ne gardant que quelques colonnes et les 40 premières lignes
sleep<-sleep[1:40,c(1:3,7:10)]
matrixplot(sleep)
On voit sur cet exemple que notre jeu de données sleep nettoyé ne contient plus que 7 variables dont 2 présentent des données manquantes (cases rouges).
Ici, j'ai trié les données par "Danger".
Il existe un grand nombre de méthodes d'imputations des données manquantes et nous pouvons vous y former (contact : julien.bousquet@u-bordeaux.fr - pour en savoir plus).
Deux méthodes sont assez simples :
missforest, rapide, souvent efficace, adapté à de gros jeux de données.
MissMDA, imputation par ACP, cette méthode est très visuelle pour vérifier l'impact potentiel de l'imputation (risque de fausser les relations entre variables), mais elle peut s'avérer lourde sur un grand jeu de données.
Charger la librairie {missForest} à installer avec install.packages('missForest')
library(missForest)
Charger des données iris que l'on va convertir en des données à trou iris_avec_NA (pour l'exemple)
data(iris)
iris_avec_NA <- iris
missing_indices <- sample(1:(nrow(iris) * ncol(iris_with_na)), 20)
iris_avec_NA <- iris_avec_NA[missing_indices]
Imputer les données et contrôler les résultats de l'imputation
imputed_data <- missForest(iris_avec_NA)
# Résultats # Imputation des données
head(imputed_data$ximp)
# Taux d'erreur OOB (Out-of-Bag, Moyen Carré des Erreurs (MSE)) de l'imputation
imputed_data$OOBerror
MissMDA fonctionne par itération de la façon suivante :
Initialisation : Les valeurs manquantes sont d’abord remplacées par la moyenne des valeurs observées pour chaque variable.
Première ACP : Une Analyse en Composantes Principales (ACP) est effectuée sur ces données complétées. L’ACP cherche la ligne qui minimise les distances entre les points et leur projection sur cette ligne.
Mise à jour des valeurs manquantes : Les valeurs manquantes sont ensuite remplacées par leurs prédictions obtenues à partir de l’ACP.
Itération jusqu’à convergence : Une nouvelle ACP est réalisée sur ces données mises à jour), recherche d'une nouvelle projection et ainsi de suite.
# install.packages("missMDA")
library(missMDA) # Pour l'imputation des données manquantes
library(FactoMineR) # Pour l'analyse en composantes principales (ACP)
# Estimation du nombre de composantes à retenir pour l'ACP
ncomposantes <- estim_ncpPCA(sleep) ; ncomposantes
# Imputation des données manquantes en utilisant une ACP
resultat_imputation <- imputePCA(sleep, ncp = ncomposantes$ncp)
# Contrôler l'imputation et ses conséquences grâce à l'Analyse en Composantes Principales Multiple Imputée (MIPCA)
# 'ncp' spécifie le nombre de composantes à retenir
# 'nboot' spécifie le nombre de réplications bootstrap pour estimer la variabilité due à l'imputation
resultat_mipca <- MIPCA(sleep, ncp = ncomposantes$ncp, nboot = 1000)
plot(resultat_mipca)
Ce graphique montre la composante 2 en fonction de la composante 1. Chaque point correspond à un individu. L'ellipse autour de chaque individu montre l'incertitude liée à l'imputation et donc la confiance que l'on peut avoir ici.
Un graphique dont j'ai du mal à percevoir l'utilité. Je renvoie vers le site de F. Husson, co-écrivain de {FactorMineR}
Les individus des ensembles de données imputées sont projetés en tant qu’individus supplémentaires sur la carte PCA de référence, puis des ellipses de confiance sont dessinées. Cela rejoint le graphique à projection procrustéenne.
Poids des variables dans l'ACP -les variables Gest et NonD ont été imputées et l'on peut voir leur fluctuation sur les 1000 itérations.
# Récupération des données imputées
sleep_imputed <- resultat_imputation$completeObs
matrixplot(sleep_imputed)
# Une autre façon :
resultat_mipca$res.imputePCA
Finis les données manquantes ! NonD et Gest ont leurs trous comblés (plus de rouge).
resultats_acp <- PCA(resultat_imputation)
# On peut aussi le faire sur les données fixées (la meilleure imputation de chaque valeur)
# ex : resultats_acp <- PCA(sleep_imputed)
# Afficher les résultats de l'analyse ACP
print(resultats_acp)
fviz_pca_biplot(resultats_acp) # en biplot
Projections des varialbes et leurs fluctuations en fonction des imputations.
Projections des individus et leurs fluctuations (traits) en fonction des imputations?
Une excellente source externe qui résume une partie de cette page sur l'imputation de données par {MissMDA} et {FactoMineR} : le side de DellaData.