从 Stata 中的指数分布生成随机样本

generating a random sample from an exponential distribution in Stata

我正在尝试在 Stata 中使用随机样本 10000 进行模拟 (i) 变量 X 和 pdf f(x) = 2*x*exp(-x^2), X>0,以及 (ii) Y=X^2 我算出F的cdf是1-exp(-x^2),所以F的倒数是sqrt(-ln(1-u). 我在 Stata 中使用了以下代码:

(1)  
 clear  
 set obs 10000  
 set seed 527665  
 gen u= runiform()  
 gen x= sqrt(-ln(1-u))  
 histogram x  
 summ x, detail  
(mean 0.88, sd 0.46)  
  

(2)  
clear  
set obs 10000  
set seed 527665  
gen u= runiform()  
gen x= (sqrt(-ln(1-u)))^2  
summ x, detail  
(mean 0.99, sd 0.99) 

(3)    
clear  
set obs 10000  
set seed 527665  
gen u= rexponential(1)  
gen x= 2*u*exp(-(u^2))  
summ x, detail  
(mean 0.49, sd 0.28)  

(4)
clear  
set obs 10000  
set seed 527665  
gen v= runiform()  
gen u=1/v  
gen x= 2*u*exp(-(u^2))  
histogram x  
summ x, detail  
(mean 0.22, sd 0.26)

我的疑问是:(i)(1)和(2)是基于概率积分变换的,我遇到过,但不明白。如果 (1) 和 (2) 是有效的方法,这背后的直觉是什么,(ii) (3) 的输出似乎不正确;我不确定我是否正确地应用了 rexponential 函数,scale 参数是什么(在 stata 帮助中似乎没有对此的解释)(iii)(4)的输出似乎也不正确,我是想知道为什么这种方法有缺陷。

谢谢

好吧,我觉得你做的分布没问题

如果

PDF(x) = 2 x exp(-x2), x in [0...Infinity) then

CDF(x) = 1 - exp(-x2)

这意味着它基本上是指数分布 RV 的平方根。 Exponential distribution 采样完成 使用 -ln(1-u)-ln(u)

我没有Stata,只看代码

(1) 看起来不错,您对指数进行采样并得到它的平方根

(2) 看起来您正在采样指数的平方根并立即将其平方。 你会以指数方式恢复,我相信

(3) 我不知道它应该是什么意思,平方指数的指数?应该是

clear  
set obs 10000  
set seed 527665  
gen u = rexponential(1)  
gen x = sqrt(u)
summ x, detail  

reexponential() 与 -ln(1-runiform())

相同

(4) 没有意义。平方制服的指数?

我很快写了简单的Python代码来说明

import numpy as np
import matplotlib.pyplot as plt

x = np.random.random(100000) // uniform in [0...1)
xx = np.sqrt(-np.log(1.0-x)) // -log(1-x) is exponential, then square root

q = np.linspace(0.0, 3.0, 101)
z = 2.0*q*np.exp(-q*q)

n, bins, patches = plt.hist(xx, 50, density=True, facecolor='g', alpha=0.75)
plt.plot(q, z, 'r-')
plt.show()

有图