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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:54:03