R语言中基于条件筛选向量值并绘制TRUE条件样本
Hey 你好!看起来你在尝试用接受拒绝法生成符合cos²(x)/π分布的样本,但代码里有几个小问题,导致没法正确筛选出可接受的样本并绘图。咱们一步步修正,然后实现你要的绘图效果:
第一步:修正代码逻辑,保存候选样本
首先,你需要先保存用来计算密度的x候选样本,这样才能和后续的接受状态一一对应。另外,接受拒绝法的判断逻辑也需要调整——应该用0到1之间的均匀随机数和归一化后的密度值比较,而不是用0到2π的数:
# 定义目标密度函数(你写的这个没问题,3.142813是π的近似值) rcos2 <- function(x) { ((cos(x))^2)/3.142813 } # 先生成x的候选样本(来自建议分布:0到2π的均匀分布) x_candidates <- runif(1000, 0, 2*pi) # 计算每个候选x对应的目标密度值 dens_values <- rcos2(x_candidates) # 计算目标密度的最大值(理论上是1/π≈0.3183,和你的近似值匹配) maxdens <- max(dens_values) # 接受拒绝法的正确判断:用0-1的均匀随机数和归一化密度值比较 u <- runif(1000) # 生成0到1之间的均匀数 accepted <- ifelse(u < (dens_values/maxdens), TRUE, FALSE)
第二步:提取被接受的样本并绘图
现在accepted是和x_candidates一一对应的逻辑向量,我们可以用逻辑索引提取出所有被接受的x值,然后根据需求绘制直方图或密度图:
方式1:绘制直方图(直观展示样本分布)
# 提取被接受的x样本 accepted_x <- x_candidates[accepted] # 绘制直方图,同时叠加目标密度曲线做对比 hist(accepted_x, freq = FALSE, main = "符合cos²(x)/π分布的接受样本", xlab = "x", col = "#cce5ff", border = "white") # 添加目标密度曲线 curve(rcos2(x), from = 0, to = 2*pi, col = "#ff4d4d", lwd = 2, add = TRUE)
方式2:绘制密度估计曲线(看样本密度和目标密度的拟合度)
# 绘制样本的密度估计曲线 plot(density(accepted_x), main = "接受样本的密度估计", xlab = "x", col = "#3399ff", lwd = 2) # 叠加目标密度曲线 curve(rcos2(x), from = 0, to = 2*pi, col = "#ff4d4d", lwd = 2, add = TRUE) # 添加图例 legend("topright", legend = c("样本密度估计", "目标密度"), col = c("#3399ff", "#ff4d4d"), lwd = 2)
说说你原代码里的问题
你原代码中的accepted判断逻辑有两个问题:
- 你用了
runif(1000,0,2*pi)生成的06.28的数和`sample/maxdens`(01之间)比较,几乎所有结果都是FALSE,这完全不符合接受拒绝法的逻辑; - 你没有保存生成
sample时的x值,所以即使判断正确,也没法对应到哪些x是被接受的。
内容的提问来源于stack exchange,提问作者CringleVonChubbleslerry
相关产品推荐
相关产品推荐

