Hace tiempo ya os propuse una chapuza para eliminar outliers de forma multivariante. Por supuesto, quedaba eliminar outliers en una variable: recortar los valores extremos en aquellas variables cuantitativas que deseemos. Para ello os propongo una macro que no considero muy compleja y que analizaré con mayor detalle; pero, lo primero, la macro al completo:
%macro elimina_outliers( varib, /* VARIABLE PARA ELIMINAR EL OUTLIER */ entrada, /* DATASET DE ENTRADA */ salida, /* DATASET DE SALIDA, PUEDE SER EL MISMO DE ENTRADA */ corte_inferior, /* % DE CORTE INFERIOR */ corte_superior /* % DE CORTE SUPERIOR */ ); * CREAMOS LOS PERCENTILES; data _null_; call symput ("lim1", compress(0 + &corte_inferior.)); call symput ("lim2", compress(100 - &corte_superior.)); run; * PREPARAMOS MV CON LOS NOMBRES QUE OBTENDREMOS DEL PROC UNIVARIATE; data _null_; call symput ('nom_lim1', compress("P_" || tranwrd("&lim1.", '.', '_'))); call symput ('nom_lim2', compress("P_" || tranwrd("&lim2.", '.', '_'))); run; * EL UNIVARIATE GENERA UNA SALIDA SOLO CON LOS PERCENTILES DESEADOS; proc univariate data=&entrada. noprint; var &varib.; output out=sal pctlpre=P_ pctlpts=&lim1., &lim2.; run; * CREAMOS MV CON LOS CORTES DESEADOS; data _null_; set sal; call symput("inf", &nom_lim1.); call symput("sup", &nom_lim2.); run; * REALIZAMOS EL FILTRO; data &salida.; set &entrada.; if &varib. > &inf. and &varib. < &sup.; run; proc delete data=sal; run; %mend; Su ejemplo de uso correspondiente:
...