Durbin developed a recursive formula for the pacfś given the acf($r_k$'s): \[ \phi_k= \phi_{k,k} = \begin{cases} r_1 & \text{for $k=1$}\\ \frac{r_k - \sum_{j=1}^{k-1} \phi_{k-1} r_{k-j} }{1 -\sum_{j=1}^{k-1}\phi_{k-1,j} r_j} & \text{for $k>1$}\\ \end{cases} \] \[ \[\phi_{k,j} = \begin{cases} \phi_{k-1, j} -\phi_{k}\phi_{k-1,k-j} & \text{for $j = 1,2, \ldots, k-1$}\\ \phi_{k,k} & \text{for $j =k$}\\ \end{cases} \]
Here is our initial Python implementation of the recursive function.
def durbin(r, lag = 1):
#print"debug: inside durbin, lag=", lag
def phi(k, j):
#print "calling phi with ", k, j
if k == j:
if k == 1:
return r[1]
else:
N= r[k] - sum([phi(k-1, k-1) * r[k-j] for j in range(1,k)])
D= 1 - sum([phi(k-1, j) * r[j] for j in range(1, k)])
return N/D
else:
return sum([phi(k-1,j) - phi(k,k) * phi(k-1,k-j) for j in range(1, k)])
return phi(lag,lag)
def acf(X, k=1):
"""
Computes the sample autocorrelation function coeffficient.
for given lag k and input data X.
"""
if k == 0:
return 1.0
flen = float(len(X))
xbar = float(sum([x for x in X])) / flen
D = sum([(x-xbar)**2 for x in X])
N = sum([ (x-xbar)* (xtpk -xbar) for (x, xtpk) in zip(X[:-k],X[k:])])
return N/D
def sacf(X, maxlag):
return [acf(X, i) for i in range(maxlag+1)] #includes 0 lag
#data from Danao's text. page 323.
X = ['772.9', '909.4', '1080.3', '1276.2', '1380.6', '1354.8',
'1096.9', '1066.7', '1108.7', '1109', '1203.7', '1328.2', '1380',
'1435.3', '1416.2', '1494.9', '1525.6', '1551.1', '1539.2',
'1629.1', '1665.3', '1708.7', '1799.4', '1873.3', '1973.3',
'2087.6', '2208.3', '2271.4', '2365.6', '2423.3', '2416.2',
'2484.8', '2608.5', '2744.1', '2729.3', '2695', '2826.7',
'2958.6', '3115.2', '3192.4', '3187.1', '3248.8', '3166',
'3279.1', '3489.9', '3585.2', '3676.5']
def Test1(maxlag):
"""
Prints out values of acf and pacf for the Danao data set.
"""
Y = [float(x) for x in X]
r = sacf(Y, maxlag)
for lag in range(1, 5):
print r[lag], durbin(r, lag)
if __name__== "__main__":
Test1(17)
The recursion is actually performed by an internal function phi() which accepts two arguments k, j. However, the output of the above even for low lag value of 5 is not so good( we may have miscoded the algorithm!). Anyway we present it in the hope that a gentle reader will show us the way to properly implement Durbin's algorithm! We will recheck and recheck the formulas.
A corrected version has been successfully written. Here is the wrong results returned by our first implementation.
$ python durbin.py python durbin.py 0 0.925682317386 0.925682317386 1 0.852706579655 -0.0292160394675 2 0.787096604484 5.86791773408 3 0.737850083142 -3.27133094039
Notice the very bad value of 5.867+ for i = 2, lag = 3. No partial autocorrelations are ever greater than 1!
duh...
No comments:
Post a Comment