Some example data to test code against is always a good idea.
Your requirement
If its the first id then i need to set my lag field to 0
would translate to
IF FIRST.ID THEN LAG_FIELD=0.00;
when you include First.date you get each date setting the lag to 0.
You really don't want to call LAG as part of the result of any IF statement as the queue nature of the lag function means that the lag looks at the last time the condition was true, not the previous record.
So something along the lines of
RETAIN LAG_FIELD;
lv = lag(variable);
IF FIRST.ID THEN LAG_FIELD=0.00;
ELSE if first.DATE then LAG_FIELD=lv;
/* after verifying the code is working as intended then
drop lv;
*/
Adding zero to a retained numeric value is the same as doing nothing. So I am not sure why you have the "else lag_field+0;"