superponer - ¿Cómo manejo múltiples tipos de faltas en R?
tags$style shiny (6)
Esto es más que un problema "técnico". Debe tener un fondo estadístico completo en el análisis de valor perdido y la imputación. Una solución requiere jugar con R y ggobi. Puede asignar valores extremadamente negativos a varios tipos de NA (poner NA en el margen), y hacer algunos diagnósticos "manualmente". Debes tener en cuenta que hay tres tipos de NA:
- MCAR: falta completamente al azar, donde P (falta | observado, no observado) = P (falta)
- MAR: falta al azar, donde P (falta | observado, no observado) = P (falta | observado)
- MNAR: falta no al azar (o no se puede ignorar), donde P (falta | observada, no observada) no se puede cuantificar de ninguna manera.
En mi humilde opinión esta pregunta es más adecuada para CrossValidated .
Pero aquí hay un enlace de SO que puede encontrar útil:
Muchas encuestas tienen códigos para diferentes tipos de desaparecidos. Por ejemplo, un libro de códigos podría indicar:
0-99 datos
-1 pregunta no formulada
-5 no se
-7 se negó a responder
-9 módulo no preguntado
Stata tiene una hermosa facilidad para manejar estos múltiples tipos de faltantes, ya que le permite asignar un genérico. a los datos faltantes, pero también se permiten tipos más específicos de faltantes (.a, .b, .c, ..., .z). Todos los comandos que analizan el informe de faltantes responden a todas las entradas faltantes, sin embargo, se especifican, pero también puede resolver los distintos tipos de faltantes más adelante. Esto es particularmente útil cuando cree que la negativa a responder tiene implicaciones diferentes para la estrategia de imputación que las preguntas no formuladas.
Nunca me he topado con una instalación de este tipo en R, pero realmente me gustaría tener esta capacidad. ¿Hay alguna forma de marcar varios tipos diferentes de NA? Podría imaginarme creando más datos (ya sea un vector de nrow de longitud (my.data.frame) que contiene los tipos de faltantes, o un índice más compacto de qué filas tenían qué tipos de faltantes), pero eso parece bastante difícil de manejar.
La forma más obvia parece usar dos vectores:
- Vector 1: un vector de datos, donde todos los valores faltantes se representan utilizando
NA
. Por ejemplo,c(2, 50, NA, NA)
- Vector 2: un vector de factores, que indica el tipo de datos. Por ejemplo,
factor(c(1, 1, -1, -7))
donde el factor1
indica la pregunta correctamente respondida.
Tener esta estructura le daría una gran cantidad de flexibilidad, ya que todos los argumentos estándar de na.rm
aún funcionan con su vector de datos, pero puede usar conceptos más complejos con el vector factor.
Actualizar siguiendo las preguntas de @ gsk3
- El almacenamiento de datos aumentará dramáticamente: el almacenamiento de datos se duplicará. Sin embargo, si duplicar el tamaño causa un problema real, puede valer la pena pensar en otras estrategias.
- Los programas no lo tratan automáticamente. Ese es un comentario extraño. Algunas funciones por defecto manejan los NA de una manera sensata. Sin embargo, debes tratar a las AN de manera diferente, por lo que eso implica que tendrás que hacer algo a medida. Si solo desea analizar los datos donde las NA son "Pregunta no formulada", simplemente use un subconjunto de marco de datos.
- ahora tiene que manipular dos vectores juntos cada vez que quiera manipular conceptualmente una variable , supongo que imaginé un marco de datos de los dos vectores. Subconjuntaría el marco de datos basado en el segundo vector.
- No hay una implementación estándar, por lo que mi solución puede diferir de la de otra persona. Cierto. Sin embargo, si un paquete disponible no satisface sus necesidades, entonces (casi) por definición desea hacer algo diferente.
Debo declarar que nunca he analizado datos de encuestas (aunque he analizado grandes conjuntos de datos biológicos). Mis respuestas anteriores parecen bastante defensivas, pero esa no es mi intención. Creo que tu pregunta es buena y me interesan otras respuestas.
Me gustaría agregar al "componente de fondo estadístico" aquí. El análisis estadístico con datos faltantes es una muy buena lectura sobre esto.
Por lo general, los uso como valores, como ya sugirió Ralph, ya que el tipo de valor faltante parece ser información, pero en una o dos ocasiones en las que principalmente lo quise para la documentación.
> a <- NA
> attr(a, ''na.type'') <- -1
> print(a)
[1] NA
attr(,"na.type")
[1] -1
De esa manera mi análisis está limpio pero aún conservo la documentación. Pero como dije: normalmente mantengo los valores.
Alano.
Puede prescindir de NA por completo y simplemente utilizar los valores codificados. A continuación, también puede resumirlos en un valor perdido global. A menudo prefiero codificar sin NA, ya que NA puede causar problemas en la codificación y me gusta poder controlar exactamente lo que sucede en el análisis. Si también he usado la cadena "NA" para representar NA, que a menudo facilita las cosas.
-Ralph Winters
Sé lo que busca, y eso no está implementado en R. No tengo conocimiento de un paquete donde se implementa, pero no es demasiado difícil codificarlo usted mismo.
Una forma viable es agregar un marco de datos a los atributos, que contiene los códigos. Para evitar duplicar todo el marco de datos y ahorrar espacio, agregaría los índices en ese marco de datos en lugar de reconstruir un marco de datos completo.
p.ej :
NACode <- function(x,code){
Df <- sapply(x,function(i){
i[i %in% code] <- NA
i
})
id <- which(is.na(Df))
rowid <- id %% nrow(x)
colid <- id %/% nrow(x) + 1
NAdf <- data.frame(
id,rowid,colid,
value = as.matrix(x)[id]
)
Df <- as.data.frame(Df)
attr(Df,"NAcode") <- NAdf
Df
}
Esto permite hacer:
> Df <- data.frame(A = 1:10,B=c(1:5,-1,-2,-3,9,10) )
> code <- list("Missing"=-1,"Not Answered"=-2,"Don''t know"=-3)
> DfwithNA <- NACode(Df,code)
> str(DfwithNA)
''data.frame'': 10 obs. of 2 variables:
$ A: num 1 2 3 4 5 6 7 8 9 10
$ B: num 1 2 3 4 5 NA NA NA 9 10
- attr(*, "NAcode")=''data.frame'': 3 obs. of 4 variables:
..$ id : int 16 17 18
..$ rowid: int 6 7 8
..$ colid: num 2 2 2
..$ value: num -1 -2 -3
La función también se puede ajustar para agregar un atributo adicional que le dé la etiqueta para los diferentes valores, vea también esta pregunta . Usted podría retrotransformarse por:
ChangeNAToCode <- function(x,code){
NAval <- attr(x,"NAcode")
for(i in which(NAval$value %in% code))
x[NAval$rowid[i],NAval$colid[i]] <- NAval$value[i]
x
}
> Dfback <- ChangeNAToCode(DfwithNA,c(-2,-3))
> str(Dfback)
''data.frame'': 10 obs. of 2 variables:
$ A: num 1 2 3 4 5 6 7 8 9 10
$ B: num 1 2 3 4 5 NA -2 -3 9 10
- attr(*, "NAcode")=''data.frame'': 3 obs. of 4 variables:
..$ id : int 16 17 18
..$ rowid: int 6 7 8
..$ colid: num 2 2 2
..$ value: num -1 -2 -3
Esto permite cambiar solo los códigos que desee, si es necesario. La función se puede adaptar para devolver todos los códigos cuando no se proporciona ningún argumento. Se pueden construir funciones similares para extraer datos basados en el código, supongo que puede resolverlo usted mismo.
Pero en una línea: usar atributos e índices puede ser una buena forma de hacerlo.