如何在bmixture包中为混合Gamma分布添加偏度参数生成样本?
混合右偏Gamma分布样本生成问题
问题描述
原本计划使用bmixture包生成两个混合且严重右偏的Gamma分布样本,但运行以下代码后,生成的分布近似正态而非右偏:
library(bmixture) set.seed(345) nn <- 10000 wt <- c(0.85,0.20) #weight2 mu <- c(20,70) sd <- c(1,1.2) x <- rmixgamma(n=nn,weight=wt,alpha=mu,beta=sd) hist(x, breaks = 40, freq=FALSE)
问题原因
你对rmixgamma函数的参数理解有误:该函数的alpha是Gamma分布的形状参数,beta是速率参数,而非你误以为的均值和标准差。
Gamma分布的核心性质:
- 均值 =
alpha / beta - 标准差 =
sqrt(alpha) / beta - 偏度 =
2 / sqrt(alpha)
你设置的alpha=20和70属于较大的形状参数,此时Gamma分布会因中心极限定理趋近于正态分布,偏度极低(分别约为0.447和0.239),混合后自然呈现近似正态的形态。
解决方法:引入强右偏性
要生成严重右偏的混合Gamma分布,需要减小形状参数alpha(偏度与sqrt(alpha)成反比,alpha越小,偏度越大),同时可通过调整beta来控制均值。
以下是修正后的示例代码,生成两个强右偏的Gamma混合样本:
library(bmixture) set.seed(345) nn <- 10000 wt <- c(0.85, 0.15) # 权重和需为1,原代码0.85+0.20=1.05有误,已修正 # 设置小形状参数以获得强右偏,同时调整beta控制均值 alpha <- c(2, 3) # 形状参数,偏度分别为2/sqrt(2)≈1.41、2/sqrt(3)≈1.15 beta <- c(0.1, 0.1) # 速率参数,对应均值为2/0.1=20,3/0.1=30 x <- rmixgamma(n=nn, weight=wt, alpha=alpha, beta=beta) hist(x, breaks=40, freq=FALSE, main="混合强右偏Gamma分布直方图")
关键说明
- 若要更极端的右偏,可进一步减小
alpha(比如设为0.5,偏度可达2/sqrt(0.5)≈2.83) - 注意权重和必须为1,原代码中
wt=c(0.85,0.20)的和为1.05,属于非法输入,已修正 - 可通过公式
beta = alpha / 目标均值来计算对应速率参数,确保均值符合预期
内容的提问来源于stack exchange,提问作者iGada
相关产品推荐
相关产品推荐

