There are several common ways to compute the percent change in a time series. This section illustrates the use of LAG and DIF functions by showing SAS statements for various kinds of percent change calculations.

To compute percent change from the previous period, divide the difference of the series by the lagged value of the series and multiply by 100.

data uscpi; set uscpi; pctchng = dif( cpi ) / lag( cpi ) * 100; label pctchng = "Monthly Percent Change, At Monthly Rates"; run;

Often, changes from the previous period are expressed at annual rates. This is done by exponentiation of the current-to-previous period ratio to the number of periods in a year and expressing the result as a percent change. For example, the following statements compute the month-over-month change in CPI as a percent change at annual rates:

data uscpi; set uscpi; pctchng = ( ( cpi / lag( cpi ) ) ** 12 - 1 ) * 100; label pctchng = "Monthly Percent Change, At Annual Rates"; run;

To compute percent change from the same period in the previous year, use LAG and DIF functions with a lagging period equal to the number of periods in a year. (For quarterly data, use LAG4 and DIF4. For monthly data, use LAG12 and DIF12.)

For example, the following statements compute monthly percent change in CPI from the same month one year ago:

data uscpi; set uscpi; pctchng = dif12( cpi ) / lag12( cpi ) * 100; label pctchng = "Percent Change from One Year Ago"; run;

To compute year-over-year percent change measured at a given period within the year, subset the series of percent changes from the same period in the previous year to form a yearly data set. Use an IF or WHERE statement to select observations for the period within each year on which the year-over-year changes are based.

For example, the following statements compute year-over-year percent change in CPI from December of the previous year to December of the current year:

data annual; set uscpi; pctchng = dif12( cpi ) / lag12( cpi ) * 100; label pctchng = "Percent Change: December to December"; if month( date ) = 12; format date year4.; run;

To compute changes in yearly averages, first aggregate the series to an annual series by using the EXPAND procedure, and then compute the percent change of the annual series. (See Chapter 15: The EXPAND Procedure, for more information about PROC EXPAND.)

For example, the following statements compute percent changes in the annual averages of CPI:

proc expand data=uscpi out=annual from=month to=year; convert cpi / observed=average method=aggregate; run; data annual; set annual; pctchng = dif( cpi ) / lag( cpi ) * 100; label pctchng = "Percent Change in Yearly Averages"; run;

It is also possible to compute percent change in the average over the most recent yearly span. For example, the following statements compute monthly percent change in the average of CPI over the most recent 12 months from the average over the previous 12 months:

data uscpi; retain sum12 0; drop sum12 ave12 cpilag12; set uscpi; sum12 = sum12 + cpi; cpilag12 = lag12( cpi ); if cpilag12 ^= . then sum12 = sum12 - cpilag12; if lag11( cpi ) ^= . then ave12 = sum12 / 12; pctchng = dif12( ave12 ) / lag12( ave12 ) * 100; label pctchng = "Percent Change in 12 Month Moving Ave."; run;

This example is a complex use of LAG and DIF functions that requires care in handling the initialization of the moving-window averaging process. The LAG12 of CPI is checked for missing values to determine when more than 12 values have been accumulated, and older values must be removed from the moving sum. The LAG11 of CPI is checked for missing values to determine when at least 12 values have been accumulated; AVE12 will be missing when LAG11 of CPI is missing. The DROP statement prevents temporary variables from being added to the data set.

Note that the DIF and LAG functions must execute for every observation, or the queues of remembered values will not operate correctly. The CPILAG12 calculation must be separate from the IF statement. The PCTCHNG calculation must not be conditional on the IF statement.

The EXPAND procedure provides an alternative way to compute moving averages.