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

Gamma分布模拟概率:SAS转R代码正确性验证求助

SAS转R:Gamma分布模拟概率bhrsim的代码修正

问题说明

需要将一段SAS实现的基于Gamma分布模拟概率bhrsim的代码转换为R语言,同时对SAS中call rangam未同时使用alpha和beta参数存在疑惑,且自行编写的R代码结果与SAS输出差异较大,需检查修正。

SAS原代码

data aa;

seed1    = 11111111 ;
seed2    = 33333333 ;
bhralpha = 2 ;
bhrbeta  = 2 ;

%let rep=50;

do i=1 to &rep;

call rangam(seed1,bhralpha,xgam1);
call rangam(seed2,bhrbeta,xgam2);

bhrsim=xgam1/(xgam1+xgam2);

output;
end;

proc print;
    var seed1 seed2 bhralpha bhrbeta xgam1 xgam2 bhrsim ;
run;

SAS输出结果(整理为R格式)

SAS.bhrsim <- c(0.43771, 0.28190, 0.47057, 0.30099, 0.25343,
                0.67331, 0.66465, 0.85924, 0.80344, 0.07354,
                0.16228, 0.92554, 0.52711, 0.56944, 0.10370,
                0.05858, 0.89869, 0.88515, 0.74498, 0.17853,
                0.71263, 0.49174, 0.21546, 0.42798, 0.26264,
                0.52674, 0.41922, 0.71119, 0.92044, 0.69456,
                0.33825, 0.55214, 0.42025, 0.93093, 0.20075,
                0.50655, 0.53586, 0.41479, 0.91006, 0.61604,
                0.71669, 0.72271, 0.91053, 0.73377, 0.50403,
                0.28722, 0.54455, 0.26749, 0.58494, 0.17943)

mean(SAS.bhrsim)
#[1] 0.5226472

你的R尝试代码

set.seed(1234)

rep <- 50

bhralpha <- 2
bhrbeta  <- 2

xgam1 <- rgamma(rep, shape = bhralpha, scale = bhrbeta)
xgam2 <- rgamma(rep, shape = bhralpha, scale = bhrbeta)

bhrsim <- xgam1 / (xgam1 + xgam2)

mean(xgam1)
#[1] 3.698261

mean(xgam2)
#[1] 4.427575

mean(bhrsim)
#[1] 0.4477643

R.bhrsim <- c(0.34655843, 0.71945276, 0.20861699, 0.30611308, 0.55605485,
              0.55064680, 0.69470936, 0.45576462, 0.30185399, 0.10438540,
              0.48265790, 0.75655704, 0.42791822, 0.26072882, 0.45523966,
              0.45975115, 0.21874035, 0.22447877, 0.34634855, 0.38155777,
              0.11296304, 0.48800715, 0.37407339, 0.50943619, 0.71306467,
              0.85602900, 0.88723711, 0.05755638, 0.63186913, 0.13553985,
              0.67087093, 0.26015097, 0.26414524, 0.14128396, 0.71854283,
              0.77900243, 0.53769594, 0.46026569, 0.09196446, 0.67574945,
              0.24611917, 0.54923784, 0.60613130, 0.67733881, 0.22317935,
              0.64392641, 0.43528504, 0.44700128, 0.55522003, 0.38119564)

错误分析与修正

你的R代码存在两个关键错误:

  • Gamma分布参数不匹配:SAS的call rangam(seed, alpha, x)生成的是形状参数为alpha,尺度参数固定为1的Gamma分布,而你在R中错误指定了scale = bhrbeta(尺度为2),导致生成的Gamma变量均值为shape*scale=2*2=4,与SAS中Gamma变量均值shape*1=2的分布完全不同。
  • xgam2的形状参数错误:SAS中xgam2是用bhrbeta=2作为形状参数生成的Gamma变量,但你在R中写成了shape = bhralpha,逻辑上不符合原代码的设定(若bhrbeta为其他值,错误会直接显现)。

需要说明的是,bhrsim <- xgam1/(xgam1+xgam2)这一步的计算逻辑是正确的:当XGamma(a,1)、YGamma(b,1)时,X/(X+Y)服从Beta(a,b)分布,理论均值为a/(a+b),这里a=b=2,理论均值为0.5,SAS输出的均值0.52符合模拟结果的随机性。

修正后的R代码

# 模拟SAS的两个独立种子逻辑
set.seed(11111111)
xgam1 <- rgamma(50, shape = 2, scale = 1) # 尺度为1,匹配SAS的rangam
set.seed(33333333)
xgam2 <- rgamma(50, shape = 2, scale = 1) # 形状参数为bhrbeta=2,尺度1

bhrsim <- xgam1/(xgam1+xgam2)
mean(bhrsim)
# 输出会接近0.5,和SAS的0.52一致(模拟随机性导致的差异)

由于R与SAS的随机数生成算法不同,无法通过种子完全复现SAS的精确结果,但修正参数后,模拟的分布特征会与SAS一致。

内容的提问来源于stack exchange,提问作者Mark Miller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:35:09