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.

4 comentarios en “La función LAG de SAS

  1. Hola alguien sabe como crear una variable acumulada, que no sea con proc freq, ya que este enel data set no te las saca…
    Gracias

  2. buenas,

    tengo que hacer sumas acumuladas, pero no lo consigo con la función LAG. Tiene alguna restricción o requisito¿?

    Muchas gracias por todo

    data tabla;
    input id $ x $ y;
    cards;
    1 304 100
    2 92 200
    3 204 300
    4 268 400
    5 171 500
    6 16 600
    7 654 700
    8 307 800
    9 36 900
    10 59 1000
    ;run;

    data tabla_2;
    set tabla;
    z=x-y;
    x_acum=sum(x,lag(x_acum));
    y_acum=sum(y,lag(y_acum));
    run;

    data tabla_3;
    set tabla;
    z=y-x;
    x_ant=lag(x_acum);
    x_acum=sum(x,x_ant);
    y_ant=lag(y_acum);
    y_acum=sum(y,y_ant);
    run;

  3. Hola! Muy buen blog, me parece excelente!
    Simplemente una aclaración respecto del uso de la memoria. En la página de soporte de SAS se señala, en referencia a la memoria, que la memoria necesaria será de n cantidad de lags por cantidad de bytes de la variable, lo de 100 se debe a que el ejemplo era un lag100 simplemente:

    Memory Limit for the LAG Function
    When the LAG function is compiled, SAS allocates memory in a queue to hold the values of the variable that is listed in the LAG function. For example, if the variable in function LAG100(x) is numeric with a length of 8 bytes, then the memory that is needed is 8 times 100, or 800 bytes. Therefore, the memory limit for the LAG function is based on the memory that SAS allocates, which varies with different operating environments.

    Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

[bws_google_captcha]