如何使前一个循环值在“中”的当前迭代中有效;套用;(“for”循环的“apply”系列版本)?

如何使前一个循环值在“中”的当前迭代中有效;套用;(“for”循环的“apply”系列版本)?,r,loops,for-loop,apply,R,Loops,For Loop,Apply,用于循环: N <- 500; ro <- 0.6; a <- 1 set.seed(1) v <- ts(rnorm(N,0,1)) # [1] -0.626453811 0.183643324 -0.835628612 1.595280802 0.329507772 # [496] -1.108909998 0.307566624 -1.106894472 0.347653649 -0.873264535 y <- ts(rep(0,N)) #

用于
循环:

N <- 500; 
ro <- 0.6; a <- 1
set.seed(1)
v <- ts(rnorm(N,0,1))

# [1] -0.626453811  0.183643324 -0.835628612  1.595280802  0.329507772 
# [496] -1.108909998  0.307566624 -1.106894472  0.347653649 -0.873264535

y <- ts(rep(0,N)) # y[1]:=0 defined
for (t in 2:500){ y[t] <- a + ro*y[t-1] + v[t] }

y
# [1]  0.00000000  [2] 1.18364332  
# [3] 0.87455738=1+0.6*1.18364332+(-0.835628612)  
# [4] 3.12001523=1+0.6*0.87455738+(1.595280802)
# [499]  2.55513301  1.65981527

mean(y) #2.549763

上述代码没有给出
for
循环的结果。我发现了错误:在
apply
中,在迭代方程中,没有使用
y
的先前值;相反,
y这里有一个递归函数
函数
,它的作用与循环相同:

my.fct <- function(t, initial.value){
  if(t == 1){
    return(initial.value)
  }
  if(t > 1){
    vec <- my.fct(t-1, initial.value)
    val <- vec[length(vec)]
    newval <- a + ro*val + v[t]
    newvec <- c(vec, newval)
    return(newvec)
  }
}
# Indeed it yields the same result:
> sum(my.fct(N, 0) == y)-N
[1] 0

比较性能:

# function
start.time <- Sys.time()
y <- ts(my.fct(N, 0))
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Time difference of 0.006044865 secs

# loop
start.time <- Sys.time()
y <- ts(rep(0,N))
for (t in 2:500){ y[t] <- a + ro*y[t-1] + v[t] }
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Time difference of 0.01205611 secs
#函数
开始时间AR(1)过程:

$$y_t=\alpha+\rho y_{t-1}+\nu_t\hspace{1cm}t=2,…,n+1$$ $$(\nu\u t\sim N(0,1))$$

(如果在n obs中包含初始$$y_1$$值,则t可在t=n处最终确定)

通过数学等效: $$y_t=ρ^t(\frac{y_1}{\rho}+\sum{j=2}{t}\frac{\alpha+\nu{j}}{\rho^j})(t=2,…,n;y{1是预先指定的)$$

解决方案1(亨利的优雅):

rm(list=ls())#通过删除所有对象来清除工作区

N为什么要避免
for
循环?您的循环足够公平。你为什么要更改它?
y[-1]@Cath,
apply
对我来说似乎更聪明。也就是说,我刚刚了解到,
apply
并不是
for
loop的矢量化解决方案。@erdonancevher:累积总和是基于
y[m]/ro^m-y[m-1]=a/ro^m+v[m]/ro^m
的,并且需要合并
y[1]
,在审查时,我可能放错了位置-可能类似于此修订版
y[-1]是的,在这种情况下,您应该增加嵌套表达式的最大数量
选项(表达式=…)
,在某些情况下,还应增加保护堆栈的大小(如果出现错误
保护堆栈溢出
)。有关更多详细信息,请参见此处@Cath R有一个限制嵌套表达式数量的选项(如建议的
options(expressions=)
:“表达式”:设置将要计算的嵌套表达式数量的限制。有效值为25…500000,默认值为5000…
my.fct(6000,0)
导致
错误:计算嵌套太深:无限递归/options(expressions=)?
使用我的默认表达式=5000。这降低了我接受上述解决方案作为答案的热情。
options()$expressions
应至少与参数
t
一样高,因此请尝试设置
选项(expressions=50000)
。此外,如前所述,如果出现
保护堆栈溢出
,则必须增加
--最大ppsize
(c.f.)
N <- 500; ro <- 0.6; a <- 1
set.seed(1)
v <- ts(rnorm(N,0,1))
my.fct(500,0) # yields exactly the same values in the "for" loop 
# function
start.time <- Sys.time()
y <- ts(my.fct(N, 0))
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Time difference of 0.006044865 secs

# loop
start.time <- Sys.time()
y <- ts(rep(0,N))
for (t in 2:500){ y[t] <- a + ro*y[t-1] + v[t] }
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Time difference of 0.01205611 secs
rm(list = ls()) # Clear workspace by deleting all objects
N <- 500; ro <- 0.6; a <- 1
set.seed(1)
v <- ts(rnorm(N,0,1))
y <- ts(rep(0,N)) # y[1]:=0 defined
y[-1] <- ro^(2:N) * (y[1]/ro + cumsum((a+v[-1]) / ro^(2:N)))
y # yields exactly the same values in the "for" loop 
(mean(y)) # 2.549763
rm(list = ls()) #  Clear workspace by deleting all objects
my.fct <- function(t, initial.value){
  if(t == 1){ return(initial.value) }
  if(t > 1){
    vec <- my.fct(t-1, initial.value)
    val <- vec[length(vec)]
    newval <- a + ro*val + v[t]
    newvec <- c(vec, newval)
    return(newvec)
  }
}

N <- 500; ro <- 0.6; a <- 1
set.seed(1)
v <- ts(rnorm(N,0,1))
my.fct(500,0) # yields exactly the same values in the "for" loop
mean(my.fct(500,0)) # 2.549763