You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:47:36