Truco SAS. Categorizar variables continuas

5 Jun

Si necesitamos crear grupos a partir de una variable continua podemos emplear una metodología muy sencilla para crear muestras proporcionales o muestras de un tamaño predeterminado a partir de un conjunto de datos SAS. El método de cálculo es bien sencillo. Si deseamos crear N grupos dividimos la observación entre el total y multiplicamos por los N grupos redondeando al entero más alto. Si deseamos grupos de tamaño M dividimos la observación entre M redondeando al entero más alto. En código SAS:

*DATASET ALEATORIO;
data uno;
	do i=1 to 2000;
	importe=ranuni(0)*1000;
	if rand("uniform")>.34 then output;
	end;
run;

*MACRO PARA IDENTIFICAR EL NUMERO DE OBSERVACIONES DE UN DS;
%macro numobs(ds,mv);
	%global &mv.;
	data _null_;
		datossid=open("&ds.");
		no=attrn(datossid,'nobs');
		call symput ("&mv.",compress(no));
		datossid=close(datossid);
	run;
%mend;

%numobs(uno,obs_de_uno);

*ESPECIFICAMOS EL NÚMERO Y EL TAMAÑO DE LOS GRUPOS;
%let numero_de_grupos=4;
%let tamanio_de_grupos=100;

*ORDENAMOS POR LA VARIABLE QUE DESEAMOS CATEGORIZAR;
proc sort data=uno; by importe; run;

*EN UN MISMO DATA CREAMOS LOS GRUPOS;
data uno;
	set uno;

	*CREAMOS N GRUPOS;
	rango1=ceil((_n_/&obs_de_uno.)*&numero_de_grupos.);

	*CREAMOS GRUPOS DE TAMAÑO M;
	rango2=ceil(_n_/&tamanio_de_grupos.);
run;

proc freq data=uno; tables rango:; quit;

Muy sencillo y más páctico. En el futuro crearé un proceso que divida las variables continuas en función de una variable dependiente.

Para dudas o sugerencias rvaquerizo@analisisydecision.es

4 respuestas a «Truco SAS. Categorizar variables continuas»

  1. También funciona, por ejemplo, para hacer 8 grupos en base a la variable var:

    PROC RANK DATA=libreria.tabla_entrada
    GROUPS=8
    OUT=libreria.tabla_salida;
    VAR var;
    RANKS GR_var;
    RUN;

    ¿No?

  2. Con el proc rank necesitas 2 dataset para hacer lo mismo. No sé como será el tiempo de ejecución. Con la metodología que planteo voy a realizar un algoritmo que clasifica en función de una variable dicotómica. A ver si me sale.

  3. Hola.
    Escribo porque tengo un conjunto de datos
    4234
    7032
    4602
    6191
    1702
    6781
    5604
    4277
    6727
    4829
    19109
    276
    3858
    6768
    8802
    12466
    3876
    4644
    10655
    13813
    y me gustaría categorizarlos en tres rangos: alto, bajo y medio.
    estoy investigando y veo que se tiene que hacer con proc rank pero no sé ni cómo introducir los datos ni qué ordenes meter,
    si alguien me pudiese echar un cable lo agradecería muchismo.
    gracias

  4. data datos;
    input imp;
    datalines;
    4234
    7032
    4602
    6191
    1702
    6781
    5604
    4277
    6727
    4829
    19109
    276
    3858
    6768
    8802
    12466
    3876
    4644
    10655
    13813
    ;run;

    proc rank data=datos groups=3 out=clasificado;
    var imp;
    ranks grupo;
    quit;

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *