Me gustaría usar la imputación para reemplazar los valores faltantes en mi conjunto de datos bajo ciertas restricciones.
Por ejemplo, me gustaría que la variable imputada x1
sea mayor o igual a la suma de mis otras dos variables, digamos x2
y x3
. También quiero x3
ser imputado por cualquiera 0
o >= 14
y quiero x2
ser imputado por cualquiera 0
o >= 16
.
Intenté definir estas restricciones en SPSS para la imputación múltiple, pero en SPSS solo puedo definir valores máximos y mínimos. ¿Hay alguna forma de definir más restricciones en SPSS o conoces algún paquete R que me permita definir tales restricciones para la imputación de valores perdidos?
Mis datos son los siguientes:
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
a0 or >= 16
ya que>=16
incluye el valor16
. Espero que no haya estropeado tu significado. Lo mismo para0 or 14 or >= 14
Respuestas:
Una solución es escribir sus propias funciones de imputación personalizadas para el
mice
paquete. El paquete está preparado para esto y la configuración sorprendentemente sin dolor.Primero configuramos los datos como se sugiere:
A continuación, cargamos el
mice
paquete y vemos qué métodos elige de forma predeterminada:El
pmm
representa predictivo coincidencia media - probablemente el algoritmo de imputación más populares para imputar las variables continuas. Calcula el valor predicho utilizando un modelo de regresión y selecciona los 5 elementos más cercanos al valor predicho (por distancia euclidiana ). Estos elementos elegidos se denominan grupo de donantes y el valor final se elige al azar de este grupo de donantes.De la matriz de predicción encontramos que los métodos obtienen las variables que son interesantes para las restricciones. Tenga en cuenta que la fila es la variable objetivo y la columna los predictores. Si x1 no tuviera 1 en la columna x3, tendríamos que agregar esto en la matriz:
imp_base$predictorMatrix["x1","x3"] <- 1
Ahora a la parte divertida, generando los métodos de imputación. Elegí un método bastante crudo aquí donde descarto todos los valores si no cumplen con los criterios. Esto puede resultar en un tiempo de bucle prolongado y puede ser potencialmente más eficiente mantener las imputaciones válidas y solo rehacer las restantes, aunque requeriría un poco más de ajustes.
Una vez que hayamos terminado de definir los métodos, simplemente cambiaremos los métodos anteriores. Si solo desea cambiar una sola variable, simplemente puede usarla,
imp_base$method["x2"] <- "pmm_x2"
pero para este ejemplo cambiaremos todas (la nomenclatura no es necesaria):Ahora echemos un vistazo al tercer conjunto de datos imputado:
Ok, eso hace el trabajo. Me gusta esta solución, ya que puedes aprovechar las funciones principales y solo agregar las restricciones que consideres significativas.
Actualizar
Para hacer cumplir las rigurosas restricciones @ t0x1n mencionadas en los comentarios, es posible que deseemos agregar las siguientes habilidades a la función de envoltura:
Esto da como resultado una función de envoltura ligeramente más complicada:
Tenga en cuenta que esto no funciona tan bien, probablemente debido a que el conjunto de datos sugerido falla sin restricciones en todos los casos. Necesito aumentar la longitud del bucle a 400-500 incluso antes de que comience a comportarse. Supongo que esto no es intencional, su imputación debe imitar cómo se generan los datos reales.
Mejoramiento
El argumento
ry
contiene los valores que no faltan y posiblemente podríamos acelerar el ciclo eliminando los elementos que hemos encontrado imputaciones elegibles, pero como no estoy familiarizado con las funciones internas, me he abstenido de esto.Creo que lo más importante cuando tienes fuertes restricciones que tardan en completarse es paralelizar tus imputaciones ( consulta mi respuesta en CrossValidated ). La mayoría tiene hoy computadoras con 4-8 núcleos y R solo usa una de ellas de manera predeterminada. El tiempo puede dividirse (casi) por la mitad duplicando el número de núcleos.
Faltan parámetros en la imputación
Con respecto al problema de
x2
faltar en el momento de la imputación, los ratones nunca introducen valores perdidos en elx
-data.frame
. El método de los ratones incluye completar algún valor aleatorio al inicio. La parte de la cadena de la imputación limita el impacto de este valor inicial. Si observa lamice
función, puede encontrarla antes de la llamada de imputación (lamice:::sampler
función):El
data.init
puede suministrarse a lamice
función y mouse.imput.sample es un procedimiento de muestreo básico.Secuencia de visita
Si la secuencia de visitas es importante, puede especificar el orden en que la función
mice
-funciona las imputaciones. El valor predeterminado es from1:ncol(data)
pero puedes configurarlovisitSequence
para que sea lo que quieras.fuente
pmm_x1
embargo, me preocupan un par de cosas : (1) Tomar la suma máxima de cualquier combinación posible dex2
yx3
de todo el conjunto de datos es mucho más estricto que la restricción original. Lo correcto sería probar que para cada fila ,x1 < x2 + x3
. Por supuesto, cuantas más filas tenga, menor será su probabilidad de cumplir con tal restricción (ya que una sola fila incorrecta arruina todo), y más tiempo puede potencialmente llegar a ser el ciclo.x1
yx2
, puede imputar un valor para elx1
cual se mantienen las restricciones (digamos 50), pero una vez quex2
se imputan se rompen (digamos que se imputan 55). ¿Hay alguna manera de imputar "horizontalmente" en lugar de verticalmente? De esa manera podríamos imputar una sola fila dex1
,x2
yx3
y simplemente volver a imputar hasta esa fila específica cae bajo las restricciones. Eso debería ser lo suficientemente rápido, y una vez hecho esto, podemos pasar a la siguiente fila. Por supuesto, si MI es "vertical" en su naturaleza, no tenemos suerte. En ese caso, ¿tal vez el enfoque que Aleksandr mencionó?mice
paquete. Gracias por compartir.debug()
para ver cómomice.impute.pmm
y sus hermanos trabajan debajo del capó.Lo más cercano que pude encontrar es la inclusión de información previa de Amelia . Vea el capítulo 4.7 en la viñeta , específicamente 4.7.2:
Entonces, aunque generalmente no podrá decir algo como
x1<x2+x3
, podría recorrer su conjunto de datos y agregar un nivel de observación anterior para cada caso relevante. También se pueden aplicar límites constantes (como configurar x1, x2 y x3 para que no sean negativos). Por ejemplo:fuente
Las restricciones son probablemente más fáciles de implementar en la media predictiva que coincide con la imputación múltiple. Esto supone que hay un número significativo de observaciones con variables de restricción no faltantes que cumplen con las restricciones. Estoy pensando en implementar esto en la función del
Hmisc
paquete R.aregImpute
Es posible que desee volver en un mes más o menos. Será importante especificar la distancia máxima desde el objetivo que puede ser la observación de un donante, porque las restricciones empujarán a los donantes más lejos del donante ideal sin restricciones.fuente
x<y<z
.x1<x2
)?aregImpute
función R con coincidencia media predictiva. Pero, ¿qué sucede si ninguna de las observaciones de los donantes (casi coincidencias de predicciones) satisface las restricciones para la imputación de la observación objetivo a pesar de que obviamente tuvieron que cumplir las restricciones sobre el conjunto de variables del donante?Creo que el
Amelia
paquete (Amelia II) actualmente tiene el soporte más completo para especificar restricciones de rango de valores de datos. Sin embargo, el problema es queAmelia
supone que los datos son multivariados normales.Si en su caso no se aplica el supuesto de normalidad multivariante, es posible que desee verificar el
mice
paquete, que implementa la imputación múltiple (MI) a través de ecuaciones encadenadas . Este paquete no asume la normalidad multivariante . También tiene una función que podría ser suficiente para especificar restricciones , pero no estoy seguro de hasta qué punto. La función se llamasqueeze()
. Puede leer sobre esto en la documentación: http://cran.r-project.org/web/packages/mice/mice.pdf . Un beneficio adicionalmice
es su flexibilidad en términos de permitir la especificación de funciones de imputación definidas por el usuario y una selección más amplia de algoritmos. Aquí hay un tutorial sobre cómo realizar MI, usandomice
:http://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .Según tengo entendido, el
Hmisc
paquete del Dr. Harrell , usando el mismo enfoque de ecuaciones encadenadas ( coincidencia de predicción media ), probablemente admite datos no normales (con la excepción delnormpmm
método). Tal vez ya haya implementado la funcionalidad de especificación de restricciones según su respuesta anterior. No lo he usadoaregImpute()
, así que no puedo decir mucho más al respecto (lo he usadoAmelia
ymice
, pero definitivamente no soy un experto en estadística, solo trato de aprender todo lo que puedo).Finalmente, puede encontrar interesante lo siguiente, un poco anticuado, pero aún así agradable, descripción general de enfoques, métodos y software para la imputación múltiple de datos con valores faltantes: http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . Estoy seguro de que hay documentos generales más recientes sobre MI, pero eso es todo lo que sé en este momento. Espero que esto sea de alguna ayuda.
fuente
aregImpute
.squeeze
es que sus límites son constantes, por lo que no puede especificar nada parecidox1<x2
. Además, parece ser invocado en el vector de resultados imputado, que creo que es demasiado tarde. Me parece que los límites deben considerarse durante el proceso de imputación, por lo que tienen más significado que un ajuste posterior.Amelia
, porque lo cambié amice
, tan pronto como mis pruebas confirmaron que mis datos no son multivariados normales. Sin embargo, recientemente me encontré con este conjunto muy agradable de diapositivas de presentación sobre el tema (métodos y software de MI): statistik.lmu.de/~fkreuter/imputation_sose2011/downloads/… . Si entendí correctamente, describe una posible solución al problema de las restricciones (vea la página 50 del PDF, ¡no la diapositiva 50!). Espero que esto ayude.Si entiendo su pregunta correctamente, me parece que ya sabe qué valores deben tomar las variables que faltan, sujetas a algunas restricciones. No estoy muy familiarizado con SPSS, pero en RI creo que puede escribir una función para hacer eso (lo que no debería ser demasiado difícil dependiendo de su experiencia, debería decir). No conozco ningún paquete que funcione con tales restricciones.
fuente