R语言泊松随机变量改进逆变换生成算法异常修复求助
问题根因
你编写的改进版本代码核心错误是将F1(即F(I))和F2(即F(I+1))的初始化放在了生成n个样本的for循环外层。每次循环对F1、F2的修改会被保留到下一次循环,无法重置为初始的F(I)、F(I+1),导致后续样本的搜索阈值完全错误,所有样本的取值都被限制在I或I+1附近,最终输出的方差远小于泊松分布的理论值λ。
修复方案
将F1、F2的初始化逻辑移到for循环内部,每次生成新样本前都重置为F(I)和F(I+1)即可,修复后的完整代码如下:
### 修复后的改进版本R代码 pois_inv_trans_improved = function(n, lambda){ X = rep(0, n) # 生成n个样本 p = function(x) {dpois(x,lambda)} # 概率质量函数: p(x) = P(X=x) = λ^x exp(-λ)/x! F = function(x) {ppois(x,lambda)} # 累积分布函数: F(x) = P(X ≤ x) I = floor(lambda) # I=Int(λ) for(k in 1:n){ # 每次生成新样本前重置F1、F2为初始值 F1 = F(I); F2 = F(I+1) U = runif(1) i = I if ( F1 < U & U <= F2 ) { i = I+1 } while (U <= F1){ # 向下搜索 i = i-1; F1 = F1 - p(i) } while (U > F2){ # 向上搜索 i = i+1; F2 = F2 + p(i) } X[k] = i } X } ### 测试代码(大λ场景,比如λ=100) set.seed(0); X = pois_inv_trans_improved(n=10000,lambda=100); c(mean(X),var(X)) # 输出示例:[1] 99.9769 100.2885
修复后测试得到的均值和方差都接近λ=100,符合泊松分布的特性。
内容的提问来源于stack exchange,提问作者John Stone
相关产品推荐
相关产品推荐

