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
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?
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.
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
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;