Hace tiempo ya os propuse una chapuza para eliminar outliers de forma multivariante. Por supuesto quedabaeliminar 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 os 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.;
quit;
*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: