我对AR(1)时间序列采用蒙特卡罗方法。我必须生成10,000个100长度的时间序列,之后我必须为每个时间序列获得第一步自相关rho_1。我的问题是我只获得自相关的NA值,并且计算需要花费很多时间。我对计算AR(1)时间序列没有任何问题。 谢谢你的帮助:))
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 :(得分: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.这也会使你的时间序列非平稳,并且如果有一个强正斜率,cor()
函数可能会返回{{ 1}}作为估计的相关性,与模拟的AR系数的值无关。我假设您希望长期均值在1附近徘徊,因此在模拟后将1简单地添加到整个时间序列中,而不是在每个时间步进行迭代。
假设您确实希望通过在每个时间步添加一些常量(a)来生成非平稳时间序列,您可以执行以下操作:
1
我希望这会有所帮助。