สูตร ACF และ PACF


18

ฉันต้องการสร้างรหัสสำหรับการลงจุด ACF และ PACF จากข้อมูลอนุกรมเวลา เช่นเดียวกับพล็อตที่สร้างจาก minitab (ด้านล่าง)

พล็อต ACF

PACF การวางแผน

ฉันพยายามค้นหาสูตรแล้ว แต่ฉันยังไม่เข้าใจ คุณจะบอกสูตรและวิธีการใช้ให้ฉันได้ไหม เส้นสีแดงแนวนอนของพล็อต ACF และ PACF ด้านบนคืออะไร สูตรคืออะไร?

ขอขอบคุณ,


1
@javlacalle สูตรที่คุณให้นั้นถูกต้องหรือไม่? มันจะไม่ทำงานถ้า n Σ T = 1 ( Y T - ˉ Y ) < 0
ρ(k)=1nkt=k+1n(yty¯)(ytky¯)1nt=1n(yty¯)1nkt=k+1n(ytky¯),
ใช่ไหม? ควรเป็นดังนี้ $$ \ 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}} \ ,,
t=1n(yty¯)<0and/ort=k+1n(ytky¯)<0
conighion

@conighion คุณพูดถูกต้องขอบคุณ ฉันไม่เคยเห็นมาก่อน ฉันได้แก้ไขแล้ว
javlacalle

คำตอบ:


33

Autocorrelations

ความสัมพันธ์ระหว่างสองตัวแปรy1,y2ถูกกำหนดเป็น:

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

โดยที่ E คือตัวดำเนินการที่คาดหวังμ1และμ2เป็นวิธีการตามลำดับสำหรับy1และy2และσ1,σ2เป็นค่าเบี่ยงเบนมาตรฐาน

ในบริบทของตัวแปรเดี่ยวเช่นauto -correlation y1เป็นชุดดั้งเดิมและy2เป็นรุ่นที่ล้าหลัง ตามนิยามข้างต้น autocorrelations ตัวอย่างของการสั่งซื้อk=0,1,2,...สามารถรับได้โดยการคำนวณนิพจน์ต่อไปนี้กับข้อสังเกตชุดyเสื้อ , t=1,2,...,n :

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

โดยที่y¯คือค่าเฉลี่ยตัวอย่างของข้อมูล

ความสัมพันธ์บางส่วน

บางส่วน autocorrelations วัดการพึ่งพาเชิงเส้นของตัวแปรหนึ่งหลังจากลบผลกระทบของตัวแปรอื่น ๆ ที่ส่งผลกระทบต่อตัวแปรทั้งสอง ยกตัวอย่างเช่นอัตบางส่วนของคำสั่งมาตรการผล (การพึ่งพาอาศัยเชิงเส้น) ของyt2ในytหลังจากลบผลกระทบของyt1ทั้งytและyt2 2

แต่ละ autocorrelation สามารถรับได้เป็นชุดของการถดถอยของแบบฟอร์ม:

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

ที่y~tเป็นชุดเดิมลบเฉลี่ยตัวอย่างyty¯ Y การประมาณϕ22จะให้ค่าของออโตคอร์เรเลชันสัมพันธ์บางส่วนของคำสั่งที่ 2 การขยายการถดถอยด้วยkล่าช้าเพิ่มเติมการประมาณการของคำสุดท้ายจะให้ความสัมพันธ์บางส่วนของออเดอร์k k

อีกทางเลือกหนึ่งในการคำนวณตัวอย่างอัตโนมัติบางส่วนคือการแก้ระบบดังต่อไปนี้สำหรับการสั่งซื้อแต่ละครั้งk :

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

โดยที่ρ()เป็นตัวอย่างอัตโนมัติ การทำแผนที่ระหว่าง autocorrelations ตัวอย่างและ autocorrelations บางส่วนนี้เป็นที่รู้จักกัน recursion เดอร์บิน-เลวินสัน วิธีนี้ค่อนข้างง่ายที่จะนำไปใช้ประกอบการอธิบาย ตัวอย่างเช่นในซอฟต์แวร์ 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α/2n , โดยที่z1α/2คือ quantile1α/2ในการแจกแจงแบบเกาส์, เช่น 1.96 สำหรับแถบความเชื่อมั่น 95%

บางครั้งแถบความมั่นใจที่เพิ่มขึ้นเมื่อมีการใช้คำสั่งเพิ่มขึ้น ในกรณีนี้วงดนตรีสามารถกำหนดเป็น±z1α/21n(1+2i=1kρ(i)2))


1
(+1) ทำไมทั้งสองวงแตกต่างกันอย่างมั่นใจ?
Scortchi - Reinstate Monica

2
@Scortchi Band คงที่จะใช้เมื่อทำการทดสอบเพื่อความเป็นอิสระในขณะที่วงดนตรีที่เพิ่มขึ้นบางครั้งใช้เมื่อระบุรูปแบบ ARIMA
javlacalle

1
ทั้งสองวิธีการสำหรับการคำนวณวงดนตรีที่ความเชื่อมั่นมีการอธิบายในรายละเอียดเล็ก ๆ น้อย ๆที่นี่
Scortchi - Reinstate Monica

คำอธิบายที่สมบูรณ์แบบ!
Jan Rothkegel

1
ρ(k)

9

"ฉันต้องการสร้างรหัสสำหรับการลงจุด ACF และ PACF จากข้อมูลอนุกรมเวลา"

แม้ว่า OP นั้นค่อนข้างคลุมเครือ แต่ก็อาจเป็นไปได้ที่จะกำหนดเป้าหมายเป็นสูตรการเข้ารหัสสไตล์มากกว่าสูตรพีชคณิตเชิงเส้น


tt1tst333

ตัวอย่าง:

เราจะสร้างซีรีส์ครั้งที่มีลวดลายไซน์แบบไซเคิลวางทับบนเทรนด์ไลน์และเสียงรบกวนและวางแผน R ACF ที่สร้างขึ้น ฉันได้รับตัวอย่างนี้จากโพสต์ออนไลน์โดย Christoph Scherber และเพิ่งเพิ่มเสียง:

x=seq(pi, 10 * pi, 0.1)
y = 0.1 * x + sin(x) + rnorm(x)
y = ts(y, start=1800)

enter image description here

โดยปกติเราจะต้องทดสอบข้อมูลสำหรับความคงที่ (หรือเพียงแค่ดูพล็อตด้านบน) แต่เรารู้ว่ามีแนวโน้มอยู่ในนั้นดังนั้นให้ข้ามส่วนนี้และไปยังขั้นตอนที่ไม่ได้รับความนิยม:

model=lm(y ~ I(1801:2083))
st.y = y - predict(model)

enter image description here

ตอนนี้เราพร้อมที่จะจัดการกับอนุกรมเวลานี้โดยการสร้าง ACF เป็นครั้งแรกด้วยacf()ฟังก์ชันใน R จากนั้นเปรียบเทียบผลลัพธ์กับลูปชั่วคราวที่ฉันรวบรวม:

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).

enter image description here


ตกลง. นั่นประสบความสำเร็จ ไปยังPACF มีความยุ่งยากมากขึ้นในการแฮ็ค ... ความคิดที่นี่คือการโคลน TS ครั้งแรกหลาย ๆ ครั้งจากนั้นเลือกจุดเวลาหลายจุด อย่างไรก็ตามแทนที่จะเชื่อมโยงกับอนุกรมเวลาเริ่มต้นเรารวบรวมความล่าช้าทั้งหมดในระหว่างและทำการวิเคราะห์การถดถอยเพื่อให้ความแตกต่างที่อธิบายโดยจุดเวลาก่อนหน้านี้สามารถถูกแยกออก (ควบคุม) ตัวอย่างเช่นหากเรามุ่งเน้นไปที่ PACF ที่สิ้นสุดในเวลาเสื้อsเสื้อ-4, เราเก็บ เสื้อsเสื้อ, เสื้อsเสื้อ-1, เสื้อsเสื้อ-2 และ เสื้อsเสื้อ-3เช่นเดียวกับ เสื้อsเสื้อ-4และเราถดถอย เสื้อsเสื้อ~เสื้อsเสื้อ-1+เสื้อsเสื้อ-2+เสื้อsเสื้อ-3+เสื้อsเสื้อ-4 ผ่านจุดกำเนิดและรักษาค่าสัมประสิทธิ์เท่านั้นเสื้อsเสื้อ-4:

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 และสร้างด้วยตนเอง:

enter image description here

ที่ความคิดที่ถูกต้องข้างประเด็นการคำนวณน่าจะสามารถมองเห็นได้เมื่อเปรียบเทียบกับการPACFpacf(st.y, plot = F)


รหัสที่นี่


1

ในทางปฏิบัติเราพบข้อผิดพลาด (เสียงรบกวน) ซึ่งแสดงโดย อีเสื้อ แถบความเชื่อมั่นช่วยให้คุณทราบว่าระดับสามารถพิจารณาเป็นเสียงรบกวนเท่านั้น (เพราะประมาณ 95% ครั้งจะเข้าสู่วงดนตรี)


ยินดีต้อนรับสู่ 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]

การจัดรูปแบบโค้ด Hmmm ไม่ดี:
Sada
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.