cut.variable.fnc

Copy, Paste and Adapts

dat=cut.variable.fnc(dat, variable='rt', ntiles=4)

dat=cut.variable.fnc(dat, variable='rt', ntiles=4, which.factor='curso')

dat=cut.variable.fnc(dat, variable='rt', ntiles=10)

dat=cut.variable.fnc(dat, variable='rt', ordinal=T)

dat=cut.variable.fnc(dat, variable='rt', cuts=5)

dat=cut.variable.fnc(dat, variable='rt', cuts=c(10,20,30,60))

Objetive

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.

Discretize 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.

QUANTILE CUTS

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=cut.variable.fnc(iris, variable='Sepal.Length',

ntiles=4)

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

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

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

Discretizamos ahora por deciles (D1 hasta D10)

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

ntiles=10)

4 quartiles

4 quartiles in each level of factor Species

by decil

Puedes ver en la primera figura de la izquierda 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 3 cuartiles. Seguidamente te informa del número de registros que han "caido" 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)

USER-DEFINED CUTS

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.

histogram.fnc(iris,2) # Or equally

histogram.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.

my.cuts=c(0, 2.5, 3.5, 5)

my.labels=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= cut.variable.fnc(iris, variable='Sepal.Width',

cuts= my.cuts, label= my.labels)

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= cut.variable.fnc(iris, variable='Sepal.Width',

cuts=3)

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

# CUT OF A NUMERIC VARIABLE

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

$Sepal.Width.c

1 2 3

mean 2.494 3.117 3.893

sd 0.187 0.229 0.202

n 33.000 102.000 15.000

-----------------------------------------------------------------------------

*** The variable Sepal.Width.c discretized by categories of the variable

Sepal.Width

*** has been created.

-----------------------------------------------------------------------------

Puedes comparar ambos métodos de discretizar mediante el argumento cuts. 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.

ORDINAL VARIABLES

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=cut.variable.fnc(iris, variable= 'Sepal.Width',

which.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=cut.variable.fnc(iris, variable= 'Sepal.Width',

which.factor='Species', ordinal=T, descending=T)

1 greatest

1 lowest