R语言随机游走首次到达指定点时间模拟异常问题求助
修正随机游走首次到达时间模拟的逻辑错误
你的模拟逻辑存在核心问题:代码只统计了在n_steps步内实际到达过的位置的首次相遇时间,完全忽略了那些在模拟步数内从未到达的位置。对于距离起点越远的位置,大部分模拟都无法在n_steps步内到达,最终纳入统计的只是少数“偶然快速到达”的样本,这就导致远位置的平均/中位数时间反而偏低,出现不符合对称性的“低谷”。
错误点拆解
- 原
simulate_walk函数仅返回当前游走路径中出现过的位置,未到达的位置没有数据记录 - 统计时仅对存在数据的位置计算均值,相当于只筛选了“成功到达”的样本,造成严重的选择偏差
方案1:针对单个目标位置模拟(推荐,匹配“首次到达指定点”的需求)
如果你的目标是计算到达某一指定点的平均时间,应该针对每个目标位置单独模拟,直到到达该位置(或设定最大步数避免极端情况无限循环):
set.seed(123) n_iterations <- 100000 max_steps <- 10000 # 设定最大步数,防止极端情况无限循环 # 模拟到达指定位置的首次步数 simulate_first_arrival <- function(target_pos) { current_pos <- 0 steps <- 0 while (current_pos != target_pos && steps < max_steps) { current_pos <- current_pos + sample(c(-1, 1), 1) steps <- steps + 1 } # 若达到最大步数仍未到达,返回NA(可根据需求调整处理方式) return(ifelse(steps < max_steps, steps, NA)) } # 示例:计算到达位置+5和-5的首次到达时间分布 target_positions <- c(-5, 5) arrival_times <- lapply(target_positions, function(pos) { replicate(n_iterations, simulate_first_arrival(pos)) }) # 整理结果并可视化 result_df <- data.frame( position = rep(target_positions, each = n_iterations), steps = unlist(arrival_times) ) # 过滤未到达的样本(或保留NA做更全面统计) result_df <- result_df[!is.na(result_df$steps), ] summary_data <- result_df %>% group_by(position) %>% summarize( mean_encounter = mean(steps), median_encounter = median(steps), q25 = quantile(steps, 0.25), q75 = quantile(steps, 0.75) ) ggplot(summary_data, aes(x = position, y = median_encounter)) + geom_line() + geom_ribbon(aes(ymin = q25, ymax = q75), alpha = 0.2) + geom_point() + labs(title = "首次到达指定位置的步数分布", x = "目标位置", y = "首次到达步数") + theme_minimal() + scale_y_continuous(limits = c(0, NA))
方案2:修正原批量模拟的统计逻辑
如果要保留批量模拟所有位置的逻辑,需要对每个位置记录所有模拟中是否到达,以及到达的首次时间,未到达的用NA标记,统计时可选择计算条件均值(仅针对到达的样本)或包含未到达的情况:
set.seed(123) n_iterations <- 100000 n_steps <- 100 simulate_walk <- function() { walk <- cumsum(c(0, sample(c(-1, 1), n_steps, replace = TRUE))) # 包含起点0 # 生成当前路径覆盖的所有位置范围 all_pos <- min(walk):max(walk) # 对每个位置计算首次到达时间,未到达则标记为NA first_encounters <- sapply(all_pos, function(pos) { idx <- which(walk == pos) if (length(idx) > 0) min(idx) else NA }) return(data.frame(position = all_pos, first_encounter = first_encounters)) } all_encounters <- replicate(n_iterations, simulate_walk(), simplify = FALSE) result <- do.call(rbind, all_encounters) # 统计时:同时计算到达概率和条件均值(仅针对到达样本) summary_data <- result %>% group_by(position) %>% summarize( arrival_prob = mean(!is.na(first_encounter)), # 该位置的到达概率 mean_encounter = mean(first_encounter, na.rm = TRUE), median_encounter = median(first_encounter, na.rm = TRUE), q25 = quantile(first_encounter, 0.25, na.rm = TRUE), q75 = quantile(first_encounter, 0.75, na.rm = TRUE) ) ggplot(summary_data, aes(x = position, y = median_encounter)) + geom_line() + geom_ribbon(aes(ymin = q25, ymax = q75), alpha = 0.2) + geom_point() + labs(title = "各位置首次到达步数分布(仅统计到达样本)", x = "位置", y = "首次到达步数") + theme_minimal() + scale_y_continuous(limits = c(0, NA))
内容的提问来源于stack exchange,提问作者heartofdarkness
相关产品推荐
相关产品推荐

