2010-04-14

R: replicate and <<-

在R里,replicate和<<-结合起来是很方便的,当然这也可能存在习惯上或审美上差异。下面是生成AR(1)过程的三个实现:
f <- function(n, c, phi) {
  x<-0 
  replicate(n,
    (function(){x <<- c+phi*x+rnorm(1)})())
}

g <- function(n,c,phi) {
  v<-c() 
  x<-0 
  for(i in (1:n)) {
     x <- c+phi*x+rnorm(1); 
     v <- c(v,x)
  } 
  v
}

h <- function(n,c,phi) {
  v <- vector("numeric",n)
  x<-0
  for(i in (1:n)) {
    x <- c+phi*x+rnorm(1)
    v[i]<-x
  }
  v
}
AR回归一下所产生的序列
> ar(f(5000,0,1))

Call:
ar(x = f(5000, 0, 1))

Coefficients:
     1  
0.9979  

Order selected 1  sigma^2 estimated as  1.072 

显然,f的实现是相当简洁。来看一下它们的执行性能:在第一组n=50000运行中,显然g的实现性能是最差的。从第二组(序列大小是第一组的10倍)来看,当n越来越大时,内存自动分配的问题就显露出来了,h方法因为采用了预分配而性能胜出。
> sapply(c(f,g,h), 
   function(fn) system.time(fn(50000,0,1)))[3,]

[1] 0.669 9.912 0.716

> sapply(c(f,h), 
   function(fn) system.time(fn(500000,0,1)))[3,]

[1] 9.378 6.884

没有评论: