Eu gostaria de usar a imputação para substituir valores ausentes no meu conjunto de dados sob certas restrições.
Por exemplo, eu gostaria que a variável imputada x1
fosse maior ou igual à soma das minhas outras duas variáveis, digamos x2
e x3
. Eu também quero x3
ser imputado por um 0
ou outro >= 14
e quero x2
ser imputado por um 0
ou outro >= 16
.
Tentei definir essas restrições no SPSS para imputação múltipla, mas no SPSS só posso definir valores máximos e mínimos. Existe alguma maneira de definir restrições adicionais no SPSS ou você conhece algum pacote R que me permita definir essas restrições para imputação de valores ausentes?
Meus dados são os seguintes:
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
para0 or >= 16
desde>=16
inclui o valor16
. Espero que isso não atrapalhe o seu significado. Mesmo para0 or 14 or >= 14
Respostas:
Uma solução é escrever suas próprias funções de imputação personalizadas para o
mice
pacote. O pacote está preparado para isso e a instalação surpreendentemente indolor.Primeiro, configuramos os dados conforme sugerido:
Em seguida, carregamos o
mice
pacote e vemos quais métodos ele escolhe por padrão:A
pmm
significa correspondência média preditivo - provavelmente o algoritmo imputação populares mais para a imputação de variáveis contínuas. Ele calcula o valor previsto usando um modelo de regressão e escolhe os 5 elementos mais próximos do valor previsto (por distância euclidiana ). Esses elementos escolhidos são chamados de pool de doadores e o valor final é escolhido aleatoriamente nesse pool de doadores.A partir da matriz de previsão, descobrimos que os métodos passam as variáveis que são de interesse para as restrições. Observe que a linha é a variável de destino e a coluna os preditores. Se x1 não tivesse 1 na coluna x3, teríamos que adicionar isso na matriz:
imp_base$predictorMatrix["x1","x3"] <- 1
Agora, a parte divertida, gerando os métodos de imputação. Eu escolhi um método bastante grosseiro aqui, onde descarto todos os valores se eles não atenderem aos critérios. Isso pode resultar em um longo tempo de loop e pode ser potencialmente mais eficiente manter as imputações válidas e refazer apenas as restantes, exigindo um pouco mais de ajustes.
Assim que terminamos de definir os métodos, simplesmente mudamos os métodos anteriores. Se você deseja alterar apenas uma única variável, pode simplesmente usar,
imp_base$method["x2"] <- "pmm_x2"
mas neste exemplo alteraremos tudo (a nomeação não é necessária):Agora, vamos dar uma olhada no terceiro conjunto de dados imputados:
Ok, isso faz o trabalho. Eu gosto dessa solução, pois você pode pegar carona nas funções principais e apenas adicionar as restrições que achar significativas.
Atualizar
Para impor as restrições rigorosas @ t0x1n mencionadas nos comentários, podemos adicionar as seguintes habilidades à função de wrapper:
Isso resulta em uma função de invólucro um pouco mais complicada:
Observe que isso não funciona tão bem, provavelmente devido ao fato de o conjunto de dados sugerido falhar nas restrições de todos os casos sem faltar. Preciso aumentar o comprimento do loop para 400-500 antes que ele comece a se comportar. Presumo que isso não seja intencional, sua imputação deve imitar como os dados reais são gerados.
Otimização
O argumento
ry
contém os valores que não faltam e poderíamos acelerar o loop removendo os elementos que encontramos imputações elegíveis, mas como não estou familiarizado com as funções internas que me abstive disso.Acho que o mais importante quando você tem fortes restrições que levam tempo para preencher é paralelizar suas imputações ( veja minha resposta no CrossValidated ). Atualmente, a maioria tem computadores com 4-8 núcleos e R usa apenas um deles por padrão. O tempo pode ser (quase) cortado ao meio, dobrando o número de núcleos.
Parâmetros ausentes na imputação
Com relação ao problema de
x2
estar ausente no momento da imputação - os ratos nunca alimentam os valores ausentes nox
-data.frame
. O método de ratos inclui o preenchimento de algum valor aleatório no início. A parte da cadeia da imputação limita o impacto desse valor inicial. Se você observar amice
função-, poderá encontrá-lo antes da chamada de imputação (amice:::sampler
-função):O
data.init
pode ser fornecido para amice
função e o mouse.imput.sample é um procedimento básico de amostragem.Sequência de visitas
Se a sequência de visitas for importante, você poderá especificar a ordem em que a
mice
função-executa as imputações. O padrão é de,1:ncol(data)
mas você pode definir ovisitSequence
que quiser.fonte
pmm_x1
entanto, algumas coisas me incomodam : (1) Tomar a soma máxima de qualquer combinação possível dex2
ex3
de todo o conjunto de dados é muito mais difícil do que a restrição original. O correto seria testar que para cada linha ,x1 < x2 + x3
. É claro que quanto mais linhas você tiver, menor será sua chance de cumprir essa restrição (como uma única linha ruim estraga tudo) e mais tempo o loop pode ficar.x1
ex2
estiverem ausentes, você pode atribuir um valor para ox1
qual as restrições são mantidas (digamos 50), mas uma vezx2
imputadas, elas são quebradas (digamos que sejam imputadas 55). Existe uma maneira de imputar "horizontalmente" e não verticalmente? Dessa forma, poderíamos imputar uma única linha dex1
,x2
e,x3
e simplesmente re-impute-lo até que linha específica cai sob as restrições. Isso deve ser rápido o suficiente e, uma vez feito isso, podemos passar para a próxima linha. Obviamente, se o MI é "vertical" por natureza, estamos sem sorte. Nesse caso, talvez a abordagem que Aleksandr tenha mencionado?mice
pacote. Obrigado por compartilhar.debug()
para ver comomice.impute.pmm
e seus irmãos funcionam sob o capô.A coisa mais próxima que pude encontrar é a inclusão prévia de informações de Amelia . Veja o capítulo 4.7 da vinheta , especificamente 4.7.2:
Portanto, embora você geralmente não possa dizer algo assim
x1<x2+x3
, pode fazer um loop sobre o conjunto de dados e adicionar um nível de observação antes para cada caso relevante. Limites constantes também podem ser aplicados (como definir x1, x2 e x3 para não serem negativos). Por exemplo:fonte
Provavelmente, é mais fácil implementar restrições na média preditiva correspondente à imputação múltipla. Isso pressupõe que haja um número significativo de observações com variáveis de restrição não ausentes que atendam às restrições. Estou pensando em implementar isso na função de
Hmisc
pacote R.aregImpute
Você pode verificar novamente em mais ou menos um mês. Será importante especificar a distância máxima do alvo que pode ser uma observação do doador, porque as restrições empurrarão os doadores para mais longe do doador ideal sem restrições.fonte
x<y<z
.x1<x2
) seja atendida?aregImpute
função R com correspondência preditiva média. Mas e se nenhuma das observações do doador (quase correspondências de previsões) satisfizer as restrições para a observação do alvo ser imputada, mesmo que elas obviamente tenham que atender às restrições do conjunto de variáveis do doador?Acredito que o
Amelia
pacote (Amelia II) atualmente tenha o suporte mais abrangente para especificar restrições de intervalo de valores de dados. No entanto, o problema é queAmelia
assume que os dados são multivariados normais.Se, no seu caso, a suposição de normalidade multivariada não se aplicar, convém verificar o
mice
pacote, que implementa a imputação múltipla (MI) por meio de equações em cadeia . Este pacote não tem a suposição de normalidade multivariada . Ele também tem uma função que pode ser suficiente para especificar restrições , mas não tenho certeza em que grau. A função é chamadasqueeze()
. Você pode ler sobre isso na documentação: http://cran.r-project.org/web/packages/mice/mice.pdf . Um benefício adicional de http://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .mice
é sua flexibilidade em termos de permitir a especificação de funções de imputação definidas pelo usuário e uma seleção mais ampla de algoritmos. Aqui está um tutorial sobre como executar MI, usandomice
:Até onde eu entendo, o
Hmisc
pacote do Dr. Harrell , usando as mesmas abordagens de equações encadeadas ( correspondência preditiva média ), provavelmente suporta dados não normais (com exceção donormpmm
método). Talvez ele já tenha implementado a funcionalidade de especificação de restrições conforme sua resposta acima. Eu não useiaregImpute()
, então não posso dizer muito mais sobre isso (useiAmelia
emice
, mas definitivamente não sou especialista em estatística, apenas tentando aprender o máximo que posso).Por fim, você pode achar interessante o seguinte, um pouco datado, mas ainda agradável, visão geral de abordagens, métodos e software para imputação múltipla de dados com valores ausentes: http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . Tenho certeza de que existem documentos de visão geral mais recentes sobre MI, mas é disso que estou ciente no momento. Espero que isso seja um pouco útil.
fonte
aregImpute
.squeeze
é que seus limites são constantes, então você não pode especificar nada parecidox1<x2
. Além disso, parece ter sido invocado no vetor de resultado imputado, que acredito ser tarde demais. Parece-me que os limites devem ser considerados durante o processo de imputação, para que tenham mais significado do que um ajuste posterior ao fato.Amelia
, porque mudei paramice
, assim que meus testes confirmaram que meus dados não são normais multivariados. No entanto, recentemente deparei com este conjunto muito agradável de slides de apresentação sobre o tópico (métodos e software de MI): statistik.lmu.de/~fkreuter/imputation_sose2011/downloads/… . Se entendi corretamente, descreve uma solução em potencial para o problema de restrições (consulte a página 50 do PDF - e não o slide número 50!). Espero que isto ajude.Se entendi sua pergunta corretamente, parece-me que você já sabe quais valores as variáveis ausentes devem estar sujeitas a algumas restrições. Não sou muito familiarizado com o SPSS, mas no RI acho que você pode escrever uma função para fazer isso (o que não deve ser muito difícil, dependendo da sua experiência, devo dizer). Não conheço nenhum pacote que funcione com essas restrições.
fonte