2013-06-18 277 views
1

我對AR(1)時間序列的蒙特卡羅方法做了些什麼。我必須生成10,000個時間序列,長度爲100,之後我必須爲每個時間序列獲得第一步自相關rho_1。我的問題是,我只是得到自相關的NA值,並且計算要花費很多時間。我對計算AR(1)時間序列沒有任何問題。 謝謝您的幫助:)R:矩陣的自相關

gen_ar <- function(a,b,length,start) 
{ 
z<-rep(0,length)         
e<-rnorm(n=length,sd=1) 
z[1]<-start 
    for (i in 2:length) 
    { 
    z[i]<-a+b*z[i-1]+e[i] 
    } 
z 
} 

mc <- matrix(c(rep(0,10000000)),nrow=10000) 
for (i in 1:10000) 
{ 
    mc[i,] <- gen_ar(0.99,1,100,0) 
} 

ac <- matrix(c(rep(0,10000)),nrow=1) 
    for (i in 1:10000){ 
    for (j in 1:99){ 
    ac[i] <- cor(mc[i,j],mc[i,j+1]) 
    } 
    } 

回答

0

統計之外,我認爲,這達到自己的目標,我沒有得到NA的。我改變了它所做的B/C的方式,你說它變慢了。

mc <- matrix(rep(NA,1E5), nrow=100) 
for(i in seq_len(100)){ 
    mc[,i] <- arima.sim(model=list(ar=0.99), n=100, sd=1) + 1 
} 

myAR <- function(x){ 
    cor(x[-1], x[-length(x)]) 
} 

answer <- apply(mc, 2, myAR) 

我跳過了最後一組嵌套的for循環,並與apply()取而代之。閱讀起來似乎更容易,而且可能會更快。另外,爲了使用apply(),我創建了一個名爲myAR的函數,它執行的計算結果與cor()在您的for()循環中所做的相同。

現在,我做了一些統計調整。主要是,這些都在模擬步驟中。首先,你的模擬AR(1)過程的係數等於1,這對我來說似乎很奇怪(這不是固定的,而arima.sim()甚至不會讓你模擬這種類型的處理)。

此外,您的「a」參數在每個時間步驟將時間序列加1。換句話說,您的時間序列從1到100單調遞增,因爲係數等於1.這也會使您的時間序列不穩定,並且如此強的正斜率函數可能會返回1作爲估計的相關性,而不管模擬的AR係數的值如何。我假設你想要長期平均值懸停在1附近,所以1被簡單地加到整個時間序列中,而不是在每個時間步迭代迭代。

假設你是希望通過添加一些常數(一)在每個時間步,你可以做到以下幾點,以產生非平穩時間序列:

myInnov <- function(N=100, a=1, SD=1) {a + rnorm(n=N, sd=SD)} 
mc2 <- matrix(rep(NA,1E7), nrow=100) 
for(i in seq_len(1E5)){ 
    mc2[,i] <- arima.sim(model=list(ar=0.99), n=100, innov=myInnov(a=1, N=100, SD=1)) + 1 
} 

我希望這會有所幫助。