Formación

Funciones de ventana, SAS y bases de datos

Hace unos meses padecí (eso sí, brevemente) un proyecto que consistía en la migración de cierto código en SAS (¡nos lo pasaron como un documento de 20 hojas de Word!) a otro lenguaje de programación.

Esencialmente, desde la nueva plataforma habrían de lanzarse consultas a cierta base de datos (cuando el código SAS permitiese resolver los cálculos como una consulta de SQL) y procesarse los resultados procedimentalmente desde el nuevo lenguaje de programación cuando SQL ,declarativo, no fuese suficiente. Surgió el problema de que el lenguaje procedimental era incapaz de procesar bloques tan grandes de información. Pero ésa es otra historia.

Intro RCommander: 1. Qué es RCommander

RCommander es un interfaz gráfico de usuario de R (siglas GUI en inglés) y nos permite acceder a múltiples capacidades gráficas y estadísticas de R a través de menús, sin olvidarnos de sus posibilidades de acceso a distintos entornos de datos. Yo lo defino como un «AutoR» pero es otro paquete de R. Por ello es gratuito y muy fácil de instalar. Tan fácil como instalar R y buscar en CRAN RComdr. Descargamos el paquete, lo guardamos en library y ya disponemos de la más potente herramienta para la estadística y no hemos tenido que utilizar en ningún momento el número de nuestra VISA. RCommander requiere de múltiples paquetes de R por ello cuando en R ejecutemos library(Rcmdr) o carguemos el paquete mediante el menú podemos tener un mensaje como este:

Trucos sas. Autonumérico con PROC SQL

Rápido. Me ha llegado una consulta que me preguntaba como crear un campo autonumérico con PROC SQL. Tenemos que emplear la funciòn monotonic():

data uno;

do i=1 to 100;

output; end;

run;

proc sql;

create table uno as select

monotonic() as obs,

a.*

from uno a

where mod(i,2)=0;

quit;

Equivale al n de un paso data. Es una tontería pero a un lector del blog le ha venido bien. Saludos.

Monográfico. Datos agrupados en SAS

A continuación os planteo un monográfico más orientado a principiantes con SAS. Vamos a realizar un acercamiento a los conjuntos de datos SAS agrupados por variables. La premisa fundamental es: un conjunto de datos SAS está agrupado por una variable si está ordenado por ella. Para ordenar variables empleamos el PROC SORT:

PROC SORT DATA= ; BY (DESCENDING) ; RUN;

Repetimos un conjunto de datos SAS puede agruparse por una o varias variables si está ordenado por ellas. Algunas de las posibilidades que nos ofrecen este tipo de conjuntos de datos son:

Laboratorio de código SAS. Comparativa entre IF y WHERE

Inicio hoy otra serie de mensajes para analizar el uso óptimo del código SAS. La intención es comparar distintas ejecuciones y obtener un pequeño reporte con la metodología y el tiempo empleado en su ejecución. Para evitar el efecto que pueda causar la concurrencia en un servidor con SAS se realizarán múltiples ejecuciones. He intentado que el código que utilizo para comparar las ejecuciones sea lo más sencillo posible. Soy consciente que se puede usar un código más «profesional» o un código más «sencillo» pero lo que planteo a continuación me parece la mejor solución. La idea es hacer una macro que haga N ejecuciones para evitar el efecto concurrencia. Cada método tendrá una ejecución, esta ejecución se controlará con una macrovariable con la hora del sistema. Esta mv se guardará en una tabla SAS junto con un nombre que le damos al método y la ejecución realizada. Al final lo más sencillo es ordenar por el tiempo de ejecución e imprimir el resultado.

Trucos SAS. Identificar registros duplicados

Muy rápido, para identificar registros duplicados existen múltiples formas. Seguramente haré un monográfico sobre este tema pero de momento dejo una píldora:

data aleatorio;

do i=1 to 100000;

id=ranpoi(23456,56781);

if ranuni(5)>=0.3 then output;

end;

run;

proc sql;

create table repes (where=(rep>1)) as select

id, count(id) as rep

from aleatorio

group by 1;

quit;

proc sql;

create table repes (where=(rep=1)) as select

id, count(id) as rep

from aleatorio

group by 1;

quit;

Contamos registros y empleamos where como opción de escritura. Muy fácil y perfectamente entendible. No puedo entretenerme más que mi hija me reclama…

Macros SAS. Calular la longitud de un número.

Ha llegado hoy una búsqueda que no ha permanecido en AyD ni 20 segundos. Quería calcular la longitud de un número con SAS. Como yo estoy aquí para compartir mis conocimientos y hay una persona que los necesita aquí está esta macro que espero o sea de utilidad:

%macro largo(num);

length(compress(put(&num.,32.)))

%mend;

Esta macro recibe un parámetro que ha de ser un número y lo que hace es transformarlo a carácter comprimido y calcular su longitud. Veamos ejemplos de uso:

Manual. Curso introducción de R. Capítulo 18: Modelos de regresión de Poisson

Cuando disponemos de un número de eventos que ocurren en un intervalo tiempo estamos ante una variable de poisson, además tiene que producirse que este número de eventos en intervalos sean independientes del número de eventos que ocurran fuera de ese intervalo de tiempo. En un intervalo muy pequeño la probabilidad de que ocurra un evento es proporcional al tamaño del intervalo y por último la probabilidad de que ocurran dos o más eventos en un intervalo muy pequeño es prácticamente 0. Cualquier variable medida en un intervalo de tiempo o en un intervalo espacial es una variable de Poisson, también se pueden emplear para medir frecuencias en intervalos de población (casos de cáncer en poblaciones, frecuencias siniestrales,…). Tiene como particularidad que la media y la varianza son iguales a p*s donde p es la probabilidad de ocurrencia de un evento de poisson en un intervalo de tiempo de tamaño unidad y s es el tamaño del intervalo de tiempo o espacial en estudio.

Simulación. Estimación de pi con el método Montecarlo

La simulación es un campo que está tomando una gran importancia. Nos está permitiendo evaluar comportamientos extremos sin ningún tipo de riesgos. Casi nadie se imaginaba que el escenario económico actual podía cambiar con la velocidad que lo está haciendo. Imaginemos una modificación brusca de los ratios de morosidad implicará que las entidades bancarias tengan que modificar sus fondos de previsión. Esta misma morosidad puede afectar a las aseguradoras de crédito que tienen que estimar sus provisiones técnicas. Ahora mismo es necesario simular las condiciones más extremas para los datos futuros y la simulación nos permite experimentar para aproximarnos al problema.

Lista de los lengajes de programación mas populares

Hacía mucho tiempo que no me daba una vuelta por TIOBE para conocer los lenguajes de programación más populares. Este estudio se realiza mensualmente y la verdad es que he encontrado pocos cambios con respecto a 2008. De los lenguajes que se tratan en este blog tenemos en el puesto 15 a SAS y en el puesto 30 a R. Vemos pocas cosas de Visual Basic y hemos rozado el PL/SQL. Debería de empezar a trabajar con MATLAB y Python.

Monográfico. Arboles de clasificación con RPART

Con este rápido monográfico voy a acercarnos a los árboles de regresión con R. Esta metodología de predicción realiza construcciones lógicas que establecen reglas que nos permiten clasificar observaciones en función de una variable respuesta y de las relaciones existentes entre las variables dependientes. En esta primera aproximación no no voy a entrar en algoritmos ni en tipos de árboles (hay suficiente documentación en la red) intentaré en despertar la curiosidad del lector sobre este tipo de análisis y sobre todo quiero acercar a R al mundo empresarial un ámbito donde creo que R no destaca (al menos en España).

Truco SAS. Transponer tablas con PROC TRANSPOSE, DATA o PROC SQL

Para transponer datasets disponemos en SAS del PROC TRANSPOSE. El ahora escribiente no es muy partidario de emplearlo. Prefiero otras metodologías para transponer conjuntos de datos SAS. Voy a trabajar con un ejemplo que os servirá para aproximaros al TRANSPOSE y para entender mejor las opciones de lectura de un PASO DATA y el funcionamiento del PROC SQL. La idea es, partiendo de una tabla de hechos por meses, transponer un campo importe. Vamos a simular una tabla con esa estructura:

Trucos SAS. Eliminar etiquetas en los conjunto de datos SAS

Hoy planteo un ejemplo de uso de las vistas de SASHELP con los nombres de las columnas de una tabla SAS. Además sirve para conocer mejor el PROC DATASETS y la creación de macro variables con el PROC SQL. Una macro que no es de mucha utilidad pero con la que podemos empezar a aproximarnos al lenguage macro de SAS:

%macro sinetiquetas(conj);

data _null_;

if index("&conj.",".")=0 then x="WORK";

else x=substr("&conj.",1,index("&conj.",".")+1) ;

call symput('libreria',x);

y=substr("&conj.",index("&conj.",".")+1,length("&conj.")) ;

call symput('tabla',y);

proc sql noprint;

select compress(name||"=''") into:l1 separated by " "

from sashelp.vcolumn

where libname=upcase("&libreria.") and memname=upcase("&tabla.") ;

quit;

proc datasets lib=&libreria. nolist;

modify &tabla.;

label &l1.;

quit;

%mend;

Primero buscamos con un paso data si es una tabla temporal o permanente. Creamos una macro variable con los nombres de las variables preparadas para eliminar etiquetas (var1=»). Las etiquetas las quitamos con DATASETS y MODIFY. La macro sólo necesita como parámetro la tabla sobre la que deseamos eliminar las etiquetas. A pesar de ser un truco fácil seguro que más de uno se precompila esta macro en sus sesiones SAS.