R语言中sapply函数与for循环计算结果存差异,求解原因
为什么两段R代码输出有差异(首个元素相同)
我编写了两段功能应完全一致的R代码——一段采用for循环实现,另一段使用sapply函数。但二者输出结果存在细微差异,有趣的是输出向量的首个元素值完全相同。请问造成该差异的原因是什么?
方法1(sapply实现)
set.seed(967) n <- replicate(1000, 200) ACF2MA <- sapply(n, function(n1) { acf(arima.sim(n1, model=list(ma=c(0.4))), plot=FALSE)$acf[3] }) ACF2AR <- sapply(n, function(n1) { acf(arima.sim(n1, model=list(ar=c(0.45))), plot=FALSE)$acf[3] })
方法2(for循环实现)
ACF2AR1 <- 1:1000 for (i in 1:1000) { YMA <- arima.sim(n=200, model=list(ma=c(0.4))) YAR <- arima.sim(n=200, model=list(ar=c(0.45))) ACF2MA1[i] <- acf(YMA, plot=FALSE)$acf[3] ACF2AR1[i] <- acf(YAR, plot=FALSE)$acf[3] }
我原本预期两段代码会得到完全相同的结果。
差异原因
核心问题是随机数生成的调用顺序不一致:
- 方法1的执行逻辑是:先连续调用1000次
arima.sim生成MA序列,完成所有MA的ACF计算后,再连续调用1000次arima.sim生成AR序列。 - 方法2的执行逻辑是:每次循环都先生成1个MA序列,紧接着生成1个AR序列,以此交替完成1000次循环。
R的随机数生成是按调用顺序消耗随机种子的,两种方式下,除了第一个MA序列(都是set.seed(967)初始化后的第一次随机数调用),后续的随机数序列完全不同,因此生成的时间序列存在差异,最终计算出的ACF值也就不一样。
而首个元素相同的原因很简单:两种方式里,第一个MA序列都是种子初始化后的第一次arima.sim调用,生成的序列完全一致,对应的ACF自然相同。
注:方法2中
ACF2MA1未预先初始化,属于代码小问题,但不是导致结果差异的原因。
内容的提问来源于stack exchange,提问作者ma25613
相关产品推荐
相关产品推荐

