ACF 및 PACF 공식


18

시계열 데이터에서 ACF 및 PACF를 플로팅하기위한 코드를 만들고 싶습니다. 미니탭에서 생성 된 플롯과 동일합니다 (아래).

ACF 플로팅

PACF 플로팅

수식을 검색하려고했지만 여전히 잘 이해하지 못합니다. 공식과 사용 방법을 알려주시겠습니까? 위의 ACF 및 PACF 플롯에서 빨간색 가로선은 무엇입니까? 공식은 무엇입니까?

감사합니다,


1
@javlacalle 당신이 제공 한 공식이 맞습니까? n t = 1 ( y tˉ 이면 작동하지 않습니다
ρ(k)=1nkt=k+1n(y와이¯)(와이케이와이¯)1=1(와이와이¯)1케이=케이+1(와이케이와이¯),
맞습니까? 다음과 같아야합니까? $$ \ rho (k) = \ frac {\ frac {1} {nk} \ sum_ {t = k + 1} ^ n (y_t-\ bar {y}) (y_ {tk}-\ bar {y} )} {\ sqrt {\ frac {1} {n} \ sum_ {t = 1} ^ n (y_t-\ bar {y}) ^ 2} \ sqrt {\ frac {1} {nk} \ sum_ {t = k + 1} ^ n (y_ {tk}-\ bar {y}) ^ 2}} \ ,,
=1(와이와이¯)<0그리고 / 또는=케이+1(와이케이와이¯)<0
conighion

@conighion 감사합니다. 나는 전에 그것을 보지 못했다. 나는 그것을 고쳤다.
javlacalle

답변:


33

자기 상관

두 변수 y1,y2 간의 상관 관계 는 다음과 같이 정의됩니다.

ρ=E[(y1μ1)(y2μ2)]σ1σ2=Cov(y1,y2)σ1σ2,

여기서 E는 기대 연산자, μ1μ2 는 각각 y1y2σ1,σ2 에 대한 평균 이며, σ 2 는 표준 편차입니다.

단일 변수, 즉 자동 상관 의 맥락 에서 y1 은 원본 계열이고 y2 는 지연된 버전입니다. 상기 정의에 따라, 차수 k = 0 , 1 , 2 , ... 의 샘플 자기 상관 . . .k=0,1,2,...관측 된 시리즈 yt , t = 1 , 2 ,로 다음 식을 계산하여 얻을 수 있습니다 . . . , nt=1,2,...,n :

ρ(k)=1nkt=k+1n(yty¯)(ytky¯)1nt=1n(yty¯)21nkt=k+1n(ytky¯)2,

여기서 y¯ 는 데이터의 표본 평균입니다.

부분 자기 상관

부분 자기 상관은 두 변수에 영향을 미치는 다른 변수의 영향을 제거한 후 한 변수의 선형 의존성을 측정합니다. 예를 들어, 순서 대책 효과 (선형 의존성)의 부분의 자기 상관 yt2 에서 yt 의 영향을 제거한 후 yt1 에서 모두 ytyt2 .

각 부분 자기 상관은 다음과 같은 형태의 일련의 회귀로 얻을 수 있습니다.

y~t=ϕ21y~t1+ϕ22y~t2+et,

여기서 y~t 는 원래 시리즈에서 표본 평균을 뺀 yty¯ 입니다. 추정치ϕ22kk

샘플 부분 자기 상관을 계산하는 다른 방법은 각 주문 k 에 대해 다음 시스템을 해결하는 것입니다 .

(ρ(0)ρ(1)ρ(k1)ρ(1)ρ(0)ρ(k2)ρ(k1)ρ(k2)ρ(0))(ϕk1ϕk2ϕkk)=(ρ(1)ρ(2)ρ(k)),

여기서 ρ() 는 샘플 자기 상관입니다. 샘플 자기 상관과 부분 자기 상관 사이의 이러한 매핑을 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

자신감 밴드

신뢰 구간은 표본 자기 상관의 값으로 계산할 수 있습니다 ±z1α/2nz1α/21α/2

때때로 차수가 증가함에 따라 증가하는 신뢰 구간이 사용됩니다. 이 경우 밴드는 로 정의 될 수 있습니다±1α/21(1+2나는=1케이ρ(나는)2)


1
(+1) 왜 두 개의 다른 신뢰 구간입니까?
Scortchi-Monica Monica 복원

2
@Scortchi Constant 밴드는 독립성을 테스트 할 때 사용되는 반면 증가하는 밴드는 ARIMA 모델을 식별 할 때 때때로 사용됩니다.
javlacalle

1
신뢰 대역을 계산하는 두 가지 방법이 여기에 조금 더 자세히 설명되어 있습니다 .
Scortchi-Monica Monica 복원

완벽한 설명!
Jan Rothkegel

1
ρ(k)

9

"시계열 데이터에서 ACF 및 PACF를 플로팅하기위한 코드를 만들고 싶습니다."

OP는 약간 모호하지만 선형 대수 모델 공식보다 "레시피"스타일 코딩 공식에 더 적합 할 수 있습니다.


tt1tst3 의 마지막 제거해야합니다.33 시간순으로)를 .

예:

트렌드 라인에 겹쳐진 주기적 사인 패턴과 노이즈로 시간 계열을 조정하고 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).

여기에 이미지 설명을 입력하십시오


tst4tsttst1tst2tst3tst4tsttst1+tst2+tst3+tst4 tst4

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 생성 및 수동 계산을 다시 플로팅합니다.

여기에 이미지 설명을 입력하십시오

아이디어가 올바른지, 가능한 계산 문제 옆에 비교하여 볼 수 있습니다 PACFpacf(st.y, plot = F) .


여기에 코드를 작성 하십시오 .


1

이자형


CV에 오신 것을 환영합니다. OP가 어떻게 진행되는지에 대한 자세한 정보를 추가하는 것이 좋습니다. 각 줄이 무엇을 나타내는 지에 대한 정보를 추가하십시오.
Repmat

1

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]

흠 코드 형식이 잘못되었습니다 :
Sada
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.