I am doing some analysis on some simple data, and I am trying to plot auto-correlation and partial auto-correlation. Using these plots, I am trying to find the P and Q value to plot in my ARIMA model.
I can see on the graphs, but I am wondering if I can explicitly find, for each graph, where the plot crosses the axhline?
plt.subplot(122)
plt.plot(lag_pacf)
plt.axhline(y=0, linestyle = '--', color = 'grey')
plt.axhline(y=-1.96/np.sqrt(len(log_moving_average_difference)),linestyle = '--',color = 'red')
plt.axhline(y=1.96/np.sqrt(len(log_moving_average_difference)),linestyle = '--', color = 'green')
plt.title('Partial Autocorelation Function')
So in the above code, can I find, and show, where the lag_pacf plot crosses the axhlines that I have predetermined?
Thanks
You'll need to calculate the intersections between the line segments of lag_pacf and y's:
from matplotlib import pyplot as plt
import numpy as np
lag_pacf = np.random.randint(-10,10,30)
log_moving_average_difference = [i for i in range(30)]
#plt.subplot(122)
plt.plot(lag_pacf)
plt.axhline(y=0, linestyle = '--', color = 'grey')
plt.axhline(y=-1.96/np.sqrt(len(log_moving_average_difference)),linestyle = '--',color = 'red')
plt.axhline(y=1.96/np.sqrt(len(log_moving_average_difference)),linestyle = '--', color = 'green')
plt.title('Partial Autocorelation Function')
plt.xlim(0,30)
plt.ylim(-10,10)
plt.show()def line_intersection(line1, line2):xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) #Typo was heredef det(a, b):return a[0] * b[1] - a[1] * b[0]div = det(xdiff, ydiff)if div == 0:return Noned = (det(*line1), det(*line2))x = det(d, xdiff) / divy = det(d, ydiff) / divreturn x, ydef near(a, b, rtol=1e-5, atol=1e-8):return abs(a - b) < (atol + rtol * abs(b))
def crosses(line1, line2):"""Return True if line segment line1 intersects line segment line2 and line1 and line2 are not parallel."""(x1,y1), (x2,y2) = line1(u1,v1), (u2,v2) = line2(a,b), (c,d) = (x2-x1, u1-u2), (y2-y1, v1-v2)e, f = u1-x1, v1-y1denom = float(a*d - b*c)if near(denom, 0):# parallelreturn Falseelse:t = (e*d - b*f)/denoms = (a*f - e*c)/denom# When 0<=t<=1 and 0<=s<=1 the point of intersection occurs within the# line segmentsreturn 0<=t<=1 and 0<=s<=1plt.plot(lag_pacf)
plt.axhline(y=0, linestyle = '--', color = 'grey')
plt.axhline(y=-1.96/np.sqrt(len(log_moving_average_difference)),linestyle = '--',color = 'red')
plt.axhline(y=1.96/np.sqrt(len(log_moving_average_difference)),linestyle = '--', color = 'green')
plt.title('Partial Autocorelation Function')yys = [0,-1.96/np.sqrt(len(log_moving_average_difference)),1.96/np.sqrt(len(log_moving_average_difference))]
xx, yy = [],[]
xo,yo = [k for k in range(30)],lag_pacf
d = 20
for i in range(1,len(lag_pacf)):for k in yys:p1 = np.array([xo[i-1],yo[i-1]],dtype='float')p2 = np.array([xo[i],yo[i]],dtype='float')k1 = np.array([xo[i-1],k],dtype='float')k2 = np.array([xo[i],k],dtype='float')if crosses((p2,p1),(k1,k2)):seg = line_intersection((p2,p1),(k1,k2))if seg is not None:xx.append(seg[0])yy.append(seg[1]-d)plt.scatter(seg[0],seg[1],c='red')
plt.xlim(0,30)
plt.ylim(-10,10)
plt.show()
, for this completely randomized example:
I obtained this: