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 a Lucas Cancelar respuesta

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