2016-01-03 56 views
2

我想了解如何從零開始計算自相關函數R。如果有人指導我如何使用cor(x=y, y=lag(x=y, k=2))獲得ACF時,將非常感謝yts對象。我已經嘗試了use參數[use = "complete.obs" # c("everything", "all.obs", "complete.obs", "na.or.complete", "pairwise.complete.obs")]的所有選擇。由於從頭開始計算自相關函數R

set.seed(1) 
y <-ts(data = rnorm(20), start = c(2010, 1), frequency = 4) 
y 

# Qtr1  Qtr2  Qtr3  Qtr4 
# 2010 0.91897737 0.78213630 0.07456498 -1.98935170 
# 2011 0.61982575 -0.05612874 -0.15579551 -1.47075238 
# 2012 -0.47815006 0.41794156 1.35867955 -0.10278773 
# 2013 0.38767161 -0.05380504 -1.37705956 -0.41499456 
# 2014 -0.39428995 -0.05931340 1.10002537 0.76317575 

acf(x=y, plot=FALSE) 
# Autocorrelations of series ‘y’, by lag 
# 
# 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 
# 1.000 -0.122 -0.185 -0.049 0.147 -0.283 -0.255 0.212 0.097 -0.120 -0.181 0.286 -0.063 0.094 

cor(
     x = y 
    , y = lag(x=y, k=2) 
    , use = "complete.obs" # c("everything", "all.obs", "complete.obs", "na.or.complete", "pairwise.complete.obs") 
    ) 

# [1] 1 
+0

http://stackoverflow.com/a/32570260/3573401 – Khashaa

回答

1

看起來你有兩個問題。

第一個問題cor(x, lag(x, k = k))將始終爲1,因爲這兩個系列不是時間上對齊的。 需要使用cor

X <- ts.union(yt = y, yt2 = lag(x = y, k = 2)) 
head(X) 
##   yt  yt2 
## [1,]  NA -0.62645 
## [2,]  NA 0.18364 
## [3,] -0.62645 -0.83563 
## [4,] 0.18364 1.59528 
## [5,] -0.83563 0.32951 
## [6,] 1.59528 -0.82047 
tail(X) 
##    yt  yt2 
## [17,] 1.124931 -0.01619 
## [18,] -0.044934 0.94384 
## [19,] -0.016190 0.82122 
## [20,] 0.943836 0.59390 
## [21,] 0.821221  NA 
## [22,] 0.593901  NA 

的問題之前,使用​​或cbind.ts是,如果沒有時間索引,原始數據是相同的(具有時間偏移)。你可以測試自己

x1 <- as.vector(y) 
x2 <- as.vector(lag(y, k = 2)) 
all.equal(x1, x2) 
## [1] TRUE 

因此,如果您計算AA時間序列及其滯後之間的相關係數,可以用X(創建使用​​)

cor(X[, 1], X[, 2], use = "complete.obs") 
## [1] -0.19018 

不過結果從不同acf(y, plot = FALSE)$acf[3]

acf(y, plot = FALSE)$acf[3] 
## [1] -0.18521 

這給我們帶來了第二個原因爲什麼你不能使用cor計算acf

的ACF的數學定義假設至少二階平穩(均值和方差等於每個滯後):

enter image description here

但如果使用cor的標準實現,則對於每個系列,將計算平均值和方差的不同值(滯後值將與原始系列不同)。

c0 <- var(y) 
m <- mean(y) 
n <- length(y) 
ct <- sum((X[, 1] - m) * (X[, 2] - m), na.rm = TRUE)/(n - 1) 
(rt <- ct/c0) 
## [1] -0.18521 

all.equal(rt, acf(y, plot = FALSE)$acf[3]) 
## [1] TRUE 
+0

謝謝@dickoa有用的答案。如果您也指導如何計算PACF,我們將不勝感激。我發現[這](http://stats.stackexchange.com/q/18599/3903),但我沒有得到正確的答案。有什麼想法嗎。 – MYaseen208

+0

@ MYaseen208通常使用Yule-Walker遞歸方法估計someAR係數需要計算pacf更困難。 http://stats.stackexchange.com/questions/18599/pacf-manual-calculation – dickoa

0

年得到@khashaa提供的鏈接,按照正確的答案。謝謝

acf(x=y, plot=FALSE) 
# Autocorrelations of series ‘y’, by lag 
# 
# 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 
# 1.000 -0.122 -0.185 -0.049 0.147 -0.283 -0.255 0.212 0.097 -0.120 -0.181 0.286 -0.063 0.094 

sum((y-mean(y))*(lag(x=y, k=0)-mean(y)))/sum((y-mean(y))^2) 
[1] 1 
sum((y-mean(y))*(lag(x=y, k=1)-mean(y)))/sum((y-mean(y))^2) 
[1] -0.1222859 
sum((y-mean(y))*(lag(x=y, k=2)-mean(y)))/sum((y-mean(y))^2) 
[1] -0.1852114 
sum((y-mean(y))*(lag(x=y, k=3)-mean(y)))/sum((y-mean(y))^2) 
[1] -0.04940401