시계열 데이터에서 ACF 및 PACF를 플로팅하기위한 코드를 만들고 싶습니다. 미니탭에서 생성 된 플롯과 동일합니다 (아래).
수식을 검색하려고했지만 여전히 잘 이해하지 못합니다. 공식과 사용 방법을 알려주시겠습니까? 위의 ACF 및 PACF 플롯에서 빨간색 가로선은 무엇입니까? 공식은 무엇입니까?
감사합니다,
시계열 데이터에서 ACF 및 PACF를 플로팅하기위한 코드를 만들고 싶습니다. 미니탭에서 생성 된 플롯과 동일합니다 (아래).
수식을 검색하려고했지만 여전히 잘 이해하지 못합니다. 공식과 사용 방법을 알려주시겠습니까? 위의 ACF 및 PACF 플롯에서 빨간색 가로선은 무엇입니까? 공식은 무엇입니까?
감사합니다,
답변:
자기 상관
두 변수 간의 상관 관계 는 다음과 같이 정의됩니다.
여기서 E는 기대 연산자, 및 는 각각 과 와 에 대한 평균 이며, σ 2 는 표준 편차입니다.
단일 변수, 즉 자동 상관 의 맥락 에서 은 원본 계열이고 는 지연된 버전입니다. 상기 정의에 따라, 차수 k = 0 , 1 , 2 , ... 의 샘플 자기 상관 . . .관측 된 시리즈 , t = 1 , 2 ,로 다음 식을 계산하여 얻을 수 있습니다 . . . , n :
여기서 는 데이터의 표본 평균입니다.
부분 자기 상관
부분 자기 상관은 두 변수에 영향을 미치는 다른 변수의 영향을 제거한 후 한 변수의 선형 의존성을 측정합니다. 예를 들어, 순서 대책 효과 (선형 의존성)의 부분의 자기 상관 에서 의 영향을 제거한 후 에서 모두 및 .
각 부분 자기 상관은 다음과 같은 형태의 일련의 회귀로 얻을 수 있습니다.
여기서 는 원래 시리즈에서 표본 평균을 뺀 입니다. 추정치
샘플 부분 자기 상관을 계산하는 다른 방법은 각 주문 에 대해 다음 시스템을 해결하는 것입니다 .
여기서 는 샘플 자기 상관입니다. 샘플 자기 상관과 부분 자기 상관 사이의 이러한 매핑을 Durbin-Levinson 재귀라고 합니다. 이 방법은 설명을 위해 구현하기가 비교적 쉽습니다. 예를 들어, R 소프트웨어에서 다음과 같이 차수 5의 부분 자기 상관을 얻을 수 있습니다.
# sample data
x <- diff(AirPassengers)
# autocorrelations
sacf <- acf(x, lag.max = 10, plot = FALSE)$acf[,,1]
# solve the system of equations
res1 <- solve(toeplitz(sacf[1:5]), sacf[2:6])
res1
# [1] 0.29992688 -0.18784728 -0.08468517 -0.22463189 0.01008379
# benchmark result
res2 <- pacf(x, lag.max = 5, plot = FALSE)$acf[,,1]
res2
# [1] 0.30285526 -0.21344644 -0.16044680 -0.22163003 0.01008379
all.equal(res1[5], res2[5])
# [1] TRUE
자신감 밴드
신뢰 구간은 표본 자기 상관의 값으로 계산할 수 있습니다
때때로 차수가 증가함에 따라 증가하는 신뢰 구간이 사용됩니다. 이 경우 밴드는 로 정의 될 수 있습니다
"시계열 데이터에서 ACF 및 PACF를 플로팅하기위한 코드를 만들고 싶습니다."
OP는 약간 모호하지만 선형 대수 모델 공식보다 "레시피"스타일 코딩 공식에 더 적합 할 수 있습니다.
예:
트렌드 라인에 겹쳐진 주기적 사인 패턴과 노이즈로 시간 계열을 조정하고 R 생성 ACF를 플로팅합니다. Christoph Scherber 의 온라인 게시물 에서이 예제를 가져 와서 노이즈를 추가했습니다.
x=seq(pi, 10 * pi, 0.1)
y = 0.1 * x + sin(x) + rnorm(x)
y = ts(y, start=1800)
보통 우리는 정상 성을 위해 데이터를 테스트해야 할 것입니다 (또는 위의 그림을 보아라). 우리는 추세가 있음을 알고 있으므로이 부분을 건너 뛰고 추세 제거 단계로 직접 이동하십시오.
model=lm(y ~ I(1801:2083))
st.y = y - predict(model)
이제 우리는 먼저 acf()
R 의 함수를 사용 하여 ACF를 생성 한 다음 결과를 함께 만든 임시 루프와 비교 하여이 시계열을 해결할 준비가되었습니다 .
ACF = 0 # Starting an empty vector to capture the auto-correlations.
ACF[1] = cor(st.y, st.y) # The first entry in the ACF is the correlation with itself (1).
for(i in 1:30){ # Took 30 points to parallel the output of `acf()`
lag = st.y[-c(1:i)] # Introducing lags in the stationary ts.
clipped.y = st.y[1:length(lag)] # Compensating by reducing length of ts.
ACF[i + 1] = cor(clipped.y, lag) # Storing each correlation.
}
acf(st.y) # Plotting the built-in function (left)
plot(ACF, type="h", main="ACF Manual calculation"); abline(h = 0) # and my results (right).
PACF = 0 # Starting up an empty storage vector.
for(j in 2:25){ # Picked up 25 lag points to parallel R `pacf()` output.
cols = j
rows = length(st.y) - j + 1 # To end up with equal length vectors we clip.
lag = matrix(0, rows, j) # The storage matrix for different groups of lagged vectors.
for(i in 1:cols){
lag[ ,i] = st.y[i : (i + rows - 1)] #Clipping progressively to get lagged ts's.
}
lag = as.data.frame(lag)
fit = lm(lag$V1 ~ . - 1, data = lag) # Running an OLS for every group.
PACF[j] = coef(fit)[j - 1] # Getting the slope for the last lagged ts.
}
마지막으로 나란히 R 생성 및 수동 계산을 다시 플로팅합니다.
아이디어가 올바른지, 가능한 계산 문제 옆에 비교하여 볼 수 있습니다 PACF
로pacf(st.y, plot = F)
.
ACF를 계산하는 파이썬 코드는 다음과 같습니다.
def shift(x,b):
if ( b <= 0 ):
return x
d = np.array(x);
d1 = d
d1[b:] = d[:-b]
d1[0:b] = 0
return d1
# One way of doing it using bare bones
# - you divide by first to normalize - because corr(x,x) = 1
x = np.arange(0,10)
xo = x - x.mean()
cors = [ np.correlate(xo,shift(xo,i))[0] for i in range(len(x1)) ]
print (cors/cors[0] )
#-- Here is another way - you divide by first to normalize
cors = np.correlate(xo,xo,'full')[n-1:]
cors/cors[0]