Archivo de la etiqueta: lag

La función LAG de SAS

La función LAG de SAS nos devuelve el valor de la observación _n_-n de la variable indicada. Me explico con un ejemplo:

data lagn;
do i=1 to 10;
lag_1=lag(i);
lag_2=lag2(i);
lag_3=lag3(i);
lag_4=lag4(i);
lag_5=lag5(i);
lag_6=lag6(i);
output;end;
run;

Esto produce:

lag.PNG
LAG(i) nos da el valor de i para la observación anterior, LAG2(i) nos da el valor de las 2 observaciones anteriores,… En el caso de encontrarnos en las primeras observaciones el valor que devuelve es el missing. Con ella podemos evitar trabajar con RETAIN a la hora de hacer sumas acumuladas:


data lagn;
set lagn;
sum_acum=sum(i,lag(i));
run;

Calcular diferencias entre observaciones:


data lagn;
set lagn;
if _n_=1 then dif=0;
dif=i-lag(i);
run;

Y por supuesto medias móviles:

data lagn;
set lagn;
total_3=sum(i,lag(i),lag2(i));
if _n_<3 then divisor=_n_;
else divisor=3;
media_3=total_3/divisor;
run;

Hay formas más elegantes de obtener medias móviles, además podemos parametrizar este proceso. La función LAGn está limitada en n en función de la memoria. En la ayuda de SAS nos indica que necesitamos 100 bytes por el n deseado, de esta forma LAG10 requiere 1000 bytes de memoria. En mi caso nunca me he visto obligado a necesitar más de LAG12. Espero que este breve repaso os ayude a conocer mejor esta funció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.

En esencia, lo que SQL era incapaz (¿lo era realmente? sigamos leyendo…) de procesar eran pasos data muy simples pero que contenían llamadas a la función lag. Esta función, en esencia, ordena a SAS en un paso data recordar el valor de cierta variable en la línea anterior para compararlo con el de la presente. Se usa principalmente para calcular incrementos cuando los datos están ordenados temporalmente.

Las nuevas especificaciones de SQL (la 2003 y la 2008) introdujeron y detallaron el uso de funciones de ventana. Las funciones de ventana son extensiones de las clásicas consultas con “group by”. Éstas últimas sólo permiten devolver una fila por cada nivel de agrupamiento. Las funciones de ventana permiten operar sobre el bloque completo que define un nivel y:

  • Devolver tantas filas como contiene el bloque
  • Devolver valores basados en la totalidad de las filas del bloque
  • Si los bloques, además, se ordenan, tener acceso al primer valor (o último, o enésimo) de cada bloque; o a la fila anterior (mediante lag).

Puede leerse más al respecto aquí y aquí.

Estoy seguro de que el uso de este tipo de extensiones ahorrará a muchos desarrolladores kilómetros de líneas de código y eones de tiempo de depuración.