J'ai un très grand ensemble de données et il manque environ 5% de valeurs aléatoires. Ces variables sont corrélées entre elles. L'exemple de jeu de données R suivant n'est qu'un exemple de jouet avec des données corrélées factices.
set.seed(123)
# matrix of X variable
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated
N <- 2000000*0.05 # 5% random missing values
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA
> xmat[1:10,1:10]
M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1 -1 -1 1 NA 0 -1 1 -1 0 -1
sample2 1 1 -1 1 0 0 1 -1 -1 1
sample3 0 0 1 -1 -1 -1 0 -1 -1 -1
sample4 1 0 0 -1 -1 1 1 0 1 1
sample5 NA 0 0 -1 -1 1 0 NA 1 NA
sample6 -1 1 0 1 1 0 1 1 -1 -1
sample7 NA 0 1 -1 0 1 -1 0 1 NA
sample8 1 -1 -1 1 0 -1 -1 1 -1 0
sample9 0 -1 0 -1 1 -1 1 NA 0 1
sample10 0 -1 1 0 1 0 0 1 NA 0
Existe-t-il un (meilleur) moyen d'imputer les valeurs manquantes dans cette situation? L'algorithme Random Forest est-il utile? Toute solution de travail en R serait très appréciée.
Modifications:
(1) Les valeurs manquantes sont distribuées de manière aléatoire entre les variables et les échantillons. Comme le nombre de variables est très grand (ici dans l'exemple - 10000), alors que le nombre d'échantillons est petit ici dans l'exemple factice ci-dessus, il est d'environ 200. Donc, lorsque nous examinons tout échantillon sur toutes les variables (10000), il y a de fortes chances qu'il manque une valeur à une variable - en raison du grand nombre de variables. La suppression de l'échantillon n'est donc pas une option.
(2) La variable peut être traitée à la fois comme quantitative ou qualitative (binaire) en cours d'imputation. Le seul jugement est de savoir dans quelle mesure nous pouvons le prédire (précision). Ainsi, des prédictions comme 0,98 au lieu de 1 pourraient être acceptables plutôt que 0 contre 1 ou -1 contre 1. Je pourrais avoir besoin de faire un compromis entre le temps de calcul et la précision.
(3) Le problème que je me pose est de savoir comment le sur-ajustement peut affecter les résultats car le nombre de variables est important par rapport au nombre d'échantillons.
(4) La quantité totale de valeurs manquantes étant d'environ 5% et aléatoire (non concentrée dans des variables ou des échantillons, car des précautions ont été prises pour supprimer les variables ou les échantillons qui ont des valeurs manquantes très élevées)
(5) Rendre les données complètes pour l'analyse est le premier objectif et la précision est secondaire. Donc pas trop sensible à la précision.
la source
Réponses:
Il peut y avoir deux façons de traiter un problème de grande variable et de petit échantillon (observation), selon votre situation et votre ensemble de données.
(1) il suffit d'utiliser des échantillons (observations) comme variable à condition que les scores entre les variables soient identiques ou normalisés.
(2) Utiliser des variables comme variable mais faire un échantillonnage aléatoire tout en imputant de sorte que la variable numérique soit inférieure au nombre d'échantillons et enfin fusionner les données.
Ce qui suit est une séance d'entraînement, vous pouvez vous adapter à vos besoins. J'ai l'hypothèse que la variable est continue, mais vous vous entraînez de la même manière pour les variables discrètes. Ici, je donne un petit exemple pour une vérification rapide.
Premièrement, pour l'entraînement générant des données corrélées, ici les observations (échantillons) sont corrélées, peuvent être réalistes dans des situations où les variables sont supposées indépendantes tandis que les observations sont corrélées. Mais dans d'autres situations où les observations et les variables sont corrélées.
J'utilise le
missForest
package pour l'imputation, qui dépend durandomForest
package pour le faire. Vous pouvez faire du calcul parallèle si vous avez un très grand nombre de points de données à imputer.Comme il s'agit d'un ensemble de données simulées, nous avons le luxe d'estimer la précision de l'imputation en comparant l'original avant les valeurs manquantes introduites avec l'imputé.
Vous pouvez contourner pour augmenter la précision. Bonne chance !
la source
Il existe des livres complets d'imputation de données, il est donc difficile de donner une réponse dans ce cadre.
La chose la plus simple à faire dans ce cas est de choisir une des colonnes ( ) et de collecter l'autre dans une matrice .xy X
Un modèle est formé et les valeurs manquantes sont remplacées par les valeurs prédites par notre modèle. Vos données semblent être catégoriques, la forêt aléatoire peut donc être un bon choix.y= f( x )
Si votre jeu de données est très volumineux, assurez-vous d'utiliser un algorithme rapide ou évolutif.
la source
C'est une question vraiment intéressante. Je cherche aussi la même chose. En fait, il existe de nombreuses façons de le gérer.
La première chose, à mon avis, sera de déterminer quel type de données manquantes vous avez - manquant complètement au hasard (MCAR), manquant au hasard (MAR), ou manquant pas au hasard (NMAR). C'est difficile et controversé à prouver, mais cet article montre une façon intéressante de regarder les données MAR.
Pour gérer l'imputation multiple, R a quelques packages:
MICE
(qui semble très utilisé),randomForest
,Hmisc
Amelia
mi
Ce ne sont que quelques-uns des packages que j'ai trouvés jusqu'à présent.
MICE
a également mis en œuvre la forêt aléatoire et quelques autres méthodes, comme l'appariement prédictif moyen.Ce n'est pas beaucoup, mais cela peut vous aider à comprendre certaines choses. Dès que j'aurai des résultats ou déciderai de quelle méthode je vais procéder, je modifierai le message.
Bonne chance!
la source
Question interessante. L'astuce est que, pour effectuer une imputation multiple, vous avez besoin de plus qu'un simple modèle prédictif (qui pourrait / serait facile à obtenir, par exemple, dans une approche d'apprentissage automatique). Nous appellerons ces modèles des modèles de simulation, car ils ne sont pas tout à fait des modèles de probabilité.
L'aspect combiné de la sélection des caractéristiques (grand ) et de la formation d'un modèle de simulation me fait penser qu'une approche bayésienne est la meilleure. Cela signifie également qu'il n'y a pas d'approche claire à ce sujet. Pour moi, la meilleure approche aurait l'approche suivante:p
la source
Votre problème semble sur mesure pour une sorte de complétion de matrice de bas rang. Essayez d'utiliser la
impute.svd()
fonction dubcv
package . Je suggérerais d'utiliser un petit rang (l'argumentk
) - quelque chose comme 5.la source