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.

6 pensiamientos en “La función LAG de SAS

  • Ana

    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

    Responder
  • Pijarry

    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;

    Responder
  • rvaquerizo

    Hola,

    Emplea retain:

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

    Saludos.

    Responder
  • Lucas

    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!

    Responder
  • Wilfredo Gonzalez

    Saludos tengo un archivo SAS. Ese archivo contiene una variable en particular. esa variable tiene N datos. Y yo quiero calcular la media para los dos primeros datos. luego para los tres primeros datos para los cuatros primeros datos para los cinco primeros datos … hasta calcular la media con todos los datos… Podrían ayudarme con ese procedimiento???

    Responder
    • rvaquerizo

      ¿Tienes N datos en una variable o N variables? Pon un paso data ficticio para entender el problema porque es muy complejo

      Responder

Deja un comentario

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