Je voudrais utiliser l'imputation pour remplacer les valeurs manquantes dans mon ensemble de données sous certaines contraintes.
Par exemple, j'aimerais que la variable imputée x1
soit supérieure ou égale à la somme de mes deux autres variables, disons x2
et x3
. Je veux aussi x3
être imputé par ou 0
ou >= 14
et je veux x2
être imputé par 0
ou >= 16
.
J'ai essayé de définir ces contraintes dans SPSS pour l'imputation multiple, mais dans SPSS je ne peux définir que des valeurs maximales et minimales. Existe-t-il un moyen de définir d'autres contraintes dans SPSS ou connaissez-vous un package R qui me permettrait de définir de telles contraintes pour l'imputation des valeurs manquantes?
Mes données sont les suivantes:
x1 =c(21, 50, 31, 15, 36, 82, 14, 14, 19, 18, 16, 36, 583, NA,NA,NA, 50, 52, 26, 24)
x2 = c(0, NA, 18,0, 19, 0, NA, 0, 0, 0, 0, 0, 0,NA,NA, NA, 22, NA, 0, 0)
x3 = c(0, 0, 0, 0, 0, 54, 0 ,0, 0, 0, 0, 0, 0, NA, NA, NA, NA, 0, 0, 0)
dat=data.frame(x1=x1, x2=x2, x3=x3)
> dat
x1 x2 x3
1 21 0 0
2 50 NA 0
3 31 18 0
4 15 0 0
5 36 19 0
6 82 0 54
7 14 NA 0
8 14 0 0
9 19 0 0
10 18 0 0
11 16 0 0
12 36 0 0
13 583 0 0
14 NA NA NA
15 NA NA NA
16 NA NA NA
17 50 22 NA
18 52 NA 0
19 26 0 0
20 24 0 0
0 or 16 or >= 16
à0 or >= 16
depuis>=16
inclut la valeur16
. J'espère que cela n'a pas gâché votre sens. Pareil pour0 or 14 or >= 14
Réponses:
Une solution consiste à écrire vos propres fonctions d'imputation personnalisées pour le
mice
package. Le package est préparé pour cela et la configuration est étonnamment indolore.D'abord, nous configurons les données comme suggéré:
Ensuite, nous chargeons le
mice
package et voyons quelles méthodes il choisit par défaut:Le
pmm
représente l' appariement moyen prédictif - probablement l'algorithme d'imputation le plus populaire pour imputer des variables continues. Il calcule la valeur prédite à l'aide d'un modèle de régression et sélectionne les 5 éléments les plus proches de la valeur prédite (par distance euclidienne ). Ces éléments choisis sont appelés le pool de donateurs et la valeur finale est choisie au hasard dans ce pool de donateurs.À partir de la matrice de prédiction, nous constatons que les méthodes obtiennent les variables qui sont intéressantes pour les restrictions. Notez que la ligne est la variable cible et la colonne les prédicteurs. Si x1 n'avait pas 1 dans la colonne x3, nous devrions ajouter ceci dans la matrice:
imp_base$predictorMatrix["x1","x3"] <- 1
Passons maintenant à la partie amusante, générant les méthodes d'imputation. J'ai choisi une méthode plutôt grossière ici où je rejette toutes les valeurs si elles ne répondent pas aux critères. Cela peut entraîner un long temps de boucle et il peut être potentiellement plus efficace de conserver les imputations valides et de ne refaire que les autres, cela nécessiterait cependant un peu plus de réglages.
Une fois que nous avons fini de définir les méthodes, nous changeons simplement les méthodes précédentes. Si vous ne souhaitez modifier qu'une seule variable, vous pouvez simplement l'utiliser,
imp_base$method["x2"] <- "pmm_x2"
mais pour cet exemple, nous allons tout changer (la dénomination n'est pas nécessaire):Voyons maintenant le troisième ensemble de données imputé:
Ok, ça fait l'affaire. J'aime cette solution car vous pouvez vous superposer aux fonctions principales et ajouter simplement les restrictions que vous trouvez significatives.
Mise à jour
Afin d'appliquer les restrictions rigoureuses @ t0x1n mentionnées dans les commentaires, nous pouvons vouloir ajouter les capacités suivantes à la fonction wrapper:
Il en résulte une fonction wrapper légèrement plus compliquée:
Notez que cela ne fonctionne pas très bien, probablement en raison du fait que l'ensemble de données suggéré ne respecte pas les contraintes pour tous les cas sans manquer. J'ai besoin d'augmenter la longueur de la boucle à 400-500 avant même qu'elle ne commence à se comporter. Je suppose que cela n'est pas intentionnel, votre imputation devrait imiter la façon dont les données réelles sont générées.
Optimisation
L'argument
ry
contient les valeurs non manquantes et nous pourrions éventuellement accélérer la boucle en supprimant les éléments que nous avons trouvés des imputations éligibles, mais comme je ne connais pas les fonctions internes, je m'en suis abstenu.Je pense que la chose la plus importante lorsque vous avez de fortes contraintes qui prennent du temps à remplir est de paralléliser vos imputations ( voir ma réponse sur CrossValidated ). La plupart ont aujourd'hui des ordinateurs avec 4 à 8 cœurs et R n'en utilise qu'un par défaut. Le temps peut être (presque) divisé par deux en doublant le nombre de cœurs.
Paramètres manquants à l'imputation
Concernant le problème d'
x2
être manquant au moment de l'imputation - les souris n'alimentent jamais les valeurs manquantes dans lex
-data.frame
. La méthode des souris comprend le remplissage d'une valeur aléatoire au début. La partie chaîne de l'imputation limite l'impact de cette valeur initiale. Si vous regardez lamice
fonction-vous pouvez le trouver avant l'appel d'imputation (lamice:::sampler
fonction-):Le
data.init
peut être fourni à lamice
fonction et le mice.imput.sample est une procédure d'échantillonnage de base.Séquence de visites
Si la séquence de visites est importante, vous pouvez spécifier l'ordre dans lequel la
mice
fonction-exécute les imputations. La valeur par défaut est de1:ncol(data)
mais vous pouvez définirvisitSequence
ce que vous voulez.la source
pmm_x1
Cependant, deux choses me préoccupent: (1) Prendre la somme maximale de toute combinaison possible dex2
etx3
de l'ensemble de données est beaucoup plus contraignant que la contrainte d'origine. La bonne chose serait de vérifier que pour chaque ligne ,x1 < x2 + x3
. Bien sûr, plus vous avez de lignes, plus vos chances de vous conformer à une telle contrainte sont faibles (car une seule mauvaise ligne ruine tout) et plus la boucle peut potentiellement s'allonger.x1
etx2
sont manquants, vous pouvez imputer une valeur pourx1
laquelle les contraintes sont maintenues (disons 50), mais une foisx2
imputées, elles sont brisées (disons qu'elle est supposée être 55). Existe-t-il un moyen d'imputer "horizontalement" plutôt que verticalement? De cette façon, nous pourrions imputer une seule ligne dex1
,x2
etx3
et simplement ré-imputer jusqu'à ce que cette ligne spécifique tombe sous les contraintes. Cela devrait être assez rapide, et une fois cela fait, nous pouvons passer à la ligne suivante. Bien sûr, si l'IM est "vertical" dans sa nature, nous n'avons pas de chance. Dans ce cas, peut-être l'approche mentionnée par Aleksandr?mice
package. Merci d'avoir partagé.debug()
afin de voir commentmice.impute.pmm
et ses frères et sœurs fonctionnent sous le capot.La chose la plus proche que j'ai pu trouver est l' inclusion d'informations préalables d'Amelia . Voir le chapitre 4.7 de la vignette , en particulier 4.7.2:
Ainsi, bien que vous ne puissiez généralement pas dire quelque chose comme cela
x1<x2+x3
, vous pouvez parcourir votre ensemble de données et ajouter un niveau d'observation avant pour chaque cas pertinent. Des limites constantes peuvent également être appliquées (par exemple, en définissant x1, x2 et x3 pour qu'elles soient non négatives). Par exemple:la source
Les contraintes sont probablement plus faciles à mettre en œuvre dans l'imputation multiple à appariement moyen prédictif. Cela suppose qu'il existe un nombre significatif d'observations avec des variables contraignantes non manquantes qui satisfont aux contraintes. Je pense à implémenter cela dans la fonction de
Hmisc
package R.aregImpute
Vous voudrez peut-être revenir dans un mois environ. Il sera important de spécifier la distance maximale de la cible que peut être une observation de donneur, car les contraintes pousseront les donneurs plus loin du donneur sans contrainte idéal.la source
x<y<z
.x1<x2
) soit remplie?aregImpute
fonction R avec l'appariement moyen prédictif. Mais que se passe-t-il si aucune des observations des donneurs (quasi-correspondances des prédictions) ne satisfait aux contraintes de l'observation cible à imputer, même si elles devaient évidemment respecter des contraintes sur l'ensemble des variables des donneurs?Je pense que le
Amelia
package (Amelia II) a actuellement le support le plus complet pour spécifier les contraintes de plage de valeurs de données. Cependant, le problème est que celaAmelia
suppose que les données sont normales à plusieurs variables.Si dans votre cas, l'hypothèse de normalité multivariée ne s'applique pas, vous pouvez vérifier le
mice
package, qui implémente l' imputation multiple (MI) via des équations chaînées . Ce package n'a pas l'hypothèse de normalité multivariée . Il a également une fonction qui pourrait être suffisante pour spécifier des contraintes , mais je ne sais pas dans quelle mesure. La fonction est appeléesqueeze()
. Vous pouvez en lire plus dans la documentation: http://cran.r-project.org/web/packages/mice/mice.pdf . Un avantage supplémentaire demice
sa flexibilité en termes de permettre la spécification de fonctions d'imputation définies par l'utilisateur et une sélection plus large d'algorithmes. Voici un tutoriel sur l'exécution de MI, en utilisantmice
:http://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .Autant que je sache, le
Hmisc
progiciel du Dr Harrell , utilisant la même approche d' équations chaînées ( correspondance moyenne prédictive ), prend probablement en charge les données non normales (à l'exception de lanormpmm
méthode). Peut-être qu'il a déjà implémenté la fonctionnalité de spécification des contraintes selon sa réponse ci-dessus. Je n'ai pas utiliséaregImpute()
, donc je ne peux pas en dire plus à ce sujet (j'ai utiliséAmelia
etmice
, mais je ne suis certainement pas un expert en statistiques, j'essaie simplement d'apprendre autant que possible).Enfin, vous trouverez peut-être intéressant ce qui suit, un peu daté, mais toujours agréable, un aperçu des approches, méthodes et logiciels pour l'imputation multiple de données avec des valeurs manquantes: http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . Je suis sûr qu'il existe de nouveaux articles sur l'IM, mais c'est tout ce que je sais à l'heure actuelle. J'espère que cela est quelque peu utile.
la source
aregImpute
.squeeze
est que ses limites sont constantes, vous ne pouvez donc pas spécifier quoi que ce soitx1<x2
. En outre, il semble être invoqué sur le vecteur de résultat imputé, qui je pense est trop tard. Il me semble que les limites doivent être prises en compte lors du processus d'imputation, elles ont donc plus de sens qu'un ajustement après coup.Amelia
, car je suis passé de celui-ci àmice
, dès que mes tests ont confirmé que mes données n'étaient pas normales à plusieurs variables. Cependant, j'ai récemment parcouru ce très bel ensemble de diapositives de présentation sur le sujet (méthodes et logiciels MI): statistik.lmu.de/~fkreuter/imputation_sose2011/downloads/… . Si j'ai bien compris, il décrit une solution potentielle au problème des contraintes (voir la page 50 du PDF - pas la diapositive numéro 50!). J'espère que cela t'aides.Si je comprends bien votre question, il me semble que vous savez déjà quelles valeurs les variables manquantes doivent prendre sous réserve de certaines contraintes. Je ne suis pas très familier avec SPSS mais en RI je pense que vous pouvez écrire une fonction pour faire cela (ce qui ne devrait pas être trop difficile en fonction de votre expérience je devrais dire). Je ne connais aucun paquet qui fonctionne avec de telles contraintes.
la source