discretiza.variable.fnc

Copia, Pega y Adapta

datos=discretiza.variable.fnc(datos, variable='tr', ntiles=4)


datos=discretiza.variable.fnc(datos, variable='tr', ntiles=4,

que.factor='curso')

datos=discretiza.variable.fnc(datos, variable='tr', ntiles=10)


datos=discretiza.variable.fnc(datos, variable='tr', ordinal=T)


datos=discretiza.variable.fnc(datos, variable='tr', cortes=5)


datos=discretiza.variable.fnc(datos, variable='tr',

cortes=c(10,20,30,60))

Objetivo

Genera una nueva variable a partir de la discretización de otra definida. El usuario puede elegir un criterio percentílico (ntiles), ordinal o de cortes arbitrarios predefinidos.

Discretizar variables

Partiremos de la base de datos iris de la librería MASS la cual contiene 4 medidas realizadas en 150 plantas pertenecientes a 3 especies medidas con la variable Species.

CORTES PERCENTÍLICOS

Sobre esta base de datos solicitaremos en primer lugar la versión discretizada percentílica de la variable Sepal.Length en cuatro cuartiles (Q1 hasta Q4). Si no se indica un nombre para la variable de salida, se generará un nombre por defecto que será siempre el mismo nombre de entrada al que se le añade .r. En nuestro ejemplo se creará la variable Sepal.Length.r versión discreta de la original.

iris=discretiza.variable.fnc(iris, variable='Sepal.Length',

ntiles=4)


La misma discretización pero dentro de cada nivel del factor Species.


iris=discretiza.variable.fnc(iris, variable='Sepal.Length',

que.factor='Species',ntiles=4)


Discretizamos ahora por deciles (D1 hasta D10)


iris=discretiza.variable.fnc(iris, variable='Sepal.Length',

ntiles=10)

Cuatro cuartiles (Q1 hasta Q4)

Cuatro cuartiles por cada nivel de Species

Por deciles (D1 hasta D10)

Puedes ver en la primera figura que se presenta un diagrama de tronco y hoja de la distribución de la variable que pretendemos discretizar. Vemos además que la función nos da los estadísticos de resumen básicos donde podemos ver mínimo, máximo, media y los valores de los 4 cuartiles. Seguidamente te informa del número de registros que han "caído" en cada uno de los cortes percentílicos realizados y por último te da la media de la variable original para cada cuartil de la nueva variable creada (Sepal.Length.r)

CORTES DEFINIDOS POR EL USUARIO

Veremos dos tipos diferentes de cortes definidos por el usuario:

  1. Vector con puntos de cortes arbitrarios libremente definidos por el usuario Ej. cortes=c(0,10,20,60,85,200)

  2. Cortes equiespaciados Ej. cortes=5

El primer supuesto sería el producido a partir de puntos de cortes libremente definidos por el usuario. Vamos a realizar ese ejemplo con la variable Sepal.Width. Para ello pediremos en primer lugar el histograma de esa variable, lo cual nos permitirá determinar los puntos de corte "arbitrarios" que deseemos.

histograma.fnc(iris,2) # O igualmente

histograma.fnc(iris,'Sepal.Width')

Crearemos ahora un vector de cortes arbitrarios que llamaremos mis.cortes y otro con las etiquetas que deseamos para los grupos así creados.

mis.cortes=c(0, 2.5, 3.5, 5)

mis.etiquetas=c('<= 2.5', '2.6-3.5', '> 3-5')

El vector de cortes tiene 4 elementos y las etiquetas 3. Esto se debe a que la función siempre va a generar tantos grupos como elementos menos uno tenga el vector de cortes. El primer grupo estará formado por las puntuaciones entre 0 y 2.5, el segundo entre 2.500001 y 3.5 y el tercero entre 3.500001 y 5.

iris= discretiza.variable.fnc(iris, variable='Sepal.Width',

cortes= mis.cortes, etiquetas= mis.etiquetas)

Puedes ver que el grupo central (2.6-3.5) obviamente es el que acumula mayor número de observaciones (observa el histograma). Como habrás podido observar la discretización percentílica genera "grupos" equilibrados (igual superficie entre los cuartiles) mientras que la que obedece a criterios arbitrarios puede perfectamente (como es el caso) generar grupos absolutamente desiquilibrados.

En el segundo supuesto, deseamos por ejemplo que la misma variable Sepal.Width quede discretizada en tres segmentos equiespaciados. Para ello utilizaremos el mismo argumento cortes pero en vez de asignarle un vector con los puntos que definiran dichos cortes le damos un valor entero (cortes=3). De esta forma indicamos a la función que deseamos partir la variable Sepal.Width en 3 segmentos equidistantes. Veamos el procedimiento:

iris= discretiza.variable.fnc(iris, variable='Sepal.Width', cortes=3)


#------------------------------------------------------------------

# DISCRETIZADO DE VARIABLE CONTINUA

#------------------------------------------------------------------

$Sepal.Width.c

1 2 3

media 2.494 3.117 3.893

dt 0.187 0.229 0.202

n 33.000 102.000 15.000

#------------------------------------------------------------------

*** Se ha creado la variable Sepal.Length.c discretizado por categorias de la variable Sepal.Length ***

#------------------------------------------------------------------

Puedes comparar ambos métodos de discretizar mediante el argumento cortes. En el primer caso creamos 3 cortes (a partir de un vector con 4 elementos) que generan una frecuencia por segmento de 19, 112 y 19 para el segundo las frecuencias han sido 33, 102 y 15. Evidentemente serán los intereses de la investigación los que decidirán entre uno y otro. En este sentido si quisieramos discretizar la variable edad en años, podemos delimitar cortes específicos que definan la infancia, adolescencia, adultez, etc. O por el contrario requerir cortes equiespaciados de edad con cortes=numero de segmentos equiespaciados deseados.

VARIABLES ORDINALES

La función también es útil para crear versiones ordinales (ascendentes o descentes) de las variables cuantitativas. Para demostrarlo, crearemos una versión ordinal descendente (la puntuación mayor tendrá orden 1) de la primera variable Sepal.Width en cada nivel del factor Species.

iris=discretiza.variable.fnc(iris, variable= 'Sepal.Width',

que.factor='Species', ordinal=T)

Si deseamos un orden descendente (el valor mas pequeño tendrá orden 1) lo haremos incluyendo el argumento descendente=T (por defecto este argumento actúa como F y por lo tanto el valor mayor tendrá el orden 1).

iris=discretiza.variable.fnc(iris, variable= 'Sepal.Width',

que.factor='Species', ordinal=T, descendente=T)