5 votos

Identificar el original de la variable que se utiliza para calcular el dummies

Tengo una estructura de datos donde muchas de las variables cuantitativas se han recodificado como variables ficticias.

Aquí está una reproductible ejemplo de uso de R:

age <- round(runif(100, 15, 40), 0)

as.dummy <- function(variable, min, max){
  sapply(variable, function(x) 
    if((!is.null(min) && x> min | is.null(min)) & ((!is.null(max) && x <= max) | is.null(max) ) )
      1
    else
      0
  )
}

age2 <- as.dummy(age, NULL, 20)
age3 <- as.dummy(age, 20, 25)
age4 <- as.dummy(age, 25, 30)
age5 <- as.dummy(age, 30, NULL)
tab <- data.frame(age, age2, age3, age4, age5)

Hay una forma de detectar que age2...5 se construyen a partir de la variable edad? Me gustaría ser capaz de detectar aquellas variables ficticias y eliminarlos de la trama de datos.

Aquí les doy el ejemplo de las variables codificadas 0/1 pero también puede ser codificada como "sí/no", o cualquier otra cosa.

5voto

jldugger Puntos 7490

Esta respuesta sugiere que hay valor en una gráfica la exploración de relaciones entre las variables y se ilustra de una manera útil. A continuación, proporciona una solución fácil, rápida y automáticamente identifica todas las posibles variables que pueden ser representados por una variable categórica.


Usted puede explorar gráficamente dibujando un diagrama de dispersión de la matriz de las categorías de edad y todas las variables numéricas en el marco de datos. Si hay muchas variables, un resumen de cada uno por la edad y comprobar que caen dentro de los intervalos no se solapan.

Aquí están algunos datos de ejemplo para la ilustración. La agrupación variable V1, pero vamos a suponer que no sabe que.

#
# Create data for testing.
#
n.obs <- 100
n.vars <- 4
X <- as.data.frame(matrix(round(runif(n.obs*n.vars, 15, 40), 0), n.obs))
#
# Create the dummary variable.
#
cutpoints <- c(-Inf, 20, 25, 30, Inf)
Age <- data.frame(group=cut(X$V1, cutpoints))

Este diagrama de dispersión de la matriz hace obvio que la variable V1 corresponde a los grupos de edad en group, porque es la única variable que es claramente divididos por un diagrama de dispersión en la group de fila o de columna:

colors <- rainbow(length(cutpoints), alpha=0.6)
names(colors) <- unique(Age$group)
pairs(cbind(X, Age), pch=21, bg=colors[Age$group])

Scatterplot matrix

Recomiendo el uso de este enfoque, en cualquier caso, porque si no las variables se encontró que coinciden con la age variable (como se muestra a continuación), con este diagrama se puede identificar rápidamente las variables que casi coinciden. Esto puede ser útil para las actividades forenses tales como la identificación de inconsistencias en una tabla de datos.

Un R implementación de un resumen de la edad de los usos tapply a romper los datos en grupos por edad y by para calcular sus áreas de distribución. Si estos son los que no se superponen (tal como lo ordenó by), tiene un candidato para la correspondencia con la edad.

#
# Identify all columns of X that might match Age.
# The result is a logical vector indicating which fields of X match.
#
candidates <- sapply(names(X), function(f) {
  groups <- tapply(X[[f]], Age)
  boundaries <- unlist(by(X[f], groups, range))
  identical(order(boundaries), 1:length(boundaries))
})

message(paste0("Possible variables are (", paste(names(X)[candidates],
                collapse=","), ")."))

La salida es

Posibles variables (V1).

Aunque en este ejemplo se utilizan los datos en el formulario que normalmente se almacena en una base de datos, es decir, como una variable categórica, serán de trabajo sin cambiar cuando Age es un marco de datos en el formato dado en la pregunta: filas únicas de Age son utilizados para la agrupación.

3voto

icelava Puntos 548

Si usted perfectamente puede reconstruir los maniquíes de un candidato predictor, a continuación, los maniquíes y el predictor llevar la misma información. Si los tontos codificar los intervalos de la variable predictora (la forma más común de la discretización de continuo predictores, que es una mala idea, como se discute a menudo aquí en la CV, pero ese no es el objetivo), entonces usted debería ser capaz de modelar la dummies perfectamente con una regresión logística multinomial en el predictor:

library(nnet)
# encode the dummies into a single factor variable:
tab$age.level <- as.factor(apply(tab[,-1],1,function(xx)min(which(xx==1))))
model <- multinom(age.level~age,tab)
predict(model)
table(predict(model),tab$age.level)

     1  2  3  4
  1 12  0  0  0
  2  0 22  0  0
  3  0  0 25  0
  4  0  0  0 41

Conseguimos un perfecto matriz de confusión. Esto sería lo suficientemente convincente para mí.

0voto

Justin Puntos 43

Para detectar que age2...5 se construyen a partir de la misma variable, puede verificar si la suma de esas variables dummy igual a 1 :

all(age2+age3+age4+age5==1)

Pero no sé si hay una forma de comprobar si vienen específicamente a partir de la variable de la edad, podría ser cualquier otra variable en el dataframe.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X