在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
没有评论:
发表评论