R语言如何嵌套循环实现250次模拟,每次输出1000条观测数据
实现方案
你不需要编写双层循环,原有的单组序列生成逻辑本身已经包含内层迭代,仅需在外层套一个控制模拟次数的循环即可。
1. 嵌套for循环版本
# 提前定义固定参数,方便后续修改 n_simulation <- 250 # 总模拟次数 valid_length <- 1000 # 每组有效观测数 burn_in_length <- 100 # 预热期长度 total_length <- valid_length + burn_in_length error_sd <- 0.2 # 提前初始化结果容器(矩阵,每列存1组模拟结果,效率远高于动态拼接) sim_result <- matrix(NA, nrow = valid_length, ncol = n_simulation) # 外层循环:控制重复模拟250次 for (sim_idx in 1:n_simulation) { # 直接复用你原来的单组模拟逻辑 e <- rnorm(total_length, mean = 0, sd = error_sd) Y_t <- c(0, 0) for (i in 3:total_length) { f1 <- 0.138 + (0.316 + 0.982 * Y_t[i-1]) * exp(-3.89 * (Y_t[i-1])^2) f2 <- -0.437 - (0.659 + 1260 * Y_t[i-1]) * exp(-3.89 * (Y_t[i-1])^2) Y_t[i] <- f1 * Y_t[i-1] + f2 * Y_t[i-2] + e[i] } # 去掉预热期后存入结果矩阵对应列 sim_result[, sim_idx] <- Y_t[(burn_in_length + 1):total_length] }
执行完成后sim_result是1000行、250列的矩阵,第k列就是第k次模拟得到的1000条有效观测。
2. 更简洁的R风格实现(无需显式写外层循环)
可以把单组模拟逻辑封装为函数,用R原生的replicate函数直接完成重复模拟,代码更简洁不易出错:
# 封装单组模拟函数 sim_single_group <- function(total_len = 1100, burn_in = 100, sd = 0.2) { e <- rnorm(total_len, mean = 0, sd = sd) Y_t <- c(0, 0) for (i in 3:total_len) { f1 <- 0.138 + (0.316 + 0.982 * Y_t[i-1]) * exp(-3.89 * (Y_t[i-1])^2) f2 <- -0.437 - (0.659 + 1260 * Y_t[i-1]) * exp(-3.89 * (Y_t[i-1])^2) Y_t[i] <- f1 * Y_t[i-1] + f2 * Y_t[i-2] + e[i] } return(Y_t[(burn_in + 1):total_len]) } # 直接重复250次,得到的结果和循环版本完全一致 sim_result <- replicate(n = 250, expr = sim_single_group())
补充说明
- 如果需要单独处理每组结果,可以选择用列表存储:将初始化代码改为
sim_result <- vector("list", 250),赋值时改为sim_result[[sim_idx]]即可 - 如需复现模拟结果,运行所有代码前执行
set.seed(自定义整数)固定随机种子即可
内容的提问来源于stack exchange,提问作者Warhawk1987
相关产品推荐
相关产品推荐

