【问题标题】:generating a random sample from an exponential distribution in Stata从Stata中的指数分布生成随机样本
【发布时间】:2020-12-30 00:09:24
【问题描述】:

我正在尝试在 Stata 中使用 10000 个随机样本进行模拟,用于 (i) 带有 pdf 的变量 X 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)的输出似乎不正确;我不确定我是否正确应用了指数函数,以及比例参数是什么(在 stata 帮助中似乎对此没有解释)(iii)(4)的输出似乎也不正确,我是想知道为什么这种方法有缺陷。

谢谢

【问题讨论】:

    标签: random stata exponential-distribution


    【解决方案1】:

    嗯,我认为你的分发方式没问题

    如果

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

    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()
    

    有图片

    【讨论】:

    • 对于(4),如果gen v= runiform() 生成0到1之间的随机数,会不会v的倒数,1/v,给出0到无穷大之间的随机数
    • @Matt 好的,但它仍然没有意义。你的PDF里面没有分割,为什么要分割均匀分布的RV?它应该是指数的平方根,可以通过 -ln(1-u) 或 rexponential() 我在代码中输入。您可以绘制直方图并进行比较
    • @Matt 我已经更新了答案,在直方图顶部添加了重叠的 PDF,一切看起来都不错
    • gen x = sqrt(rexponential(1)) 更直接一点。
    • @NickCox 当然,也可能效率更高
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2011-05-11
    • 2020-01-10
    相关资源
    最近更新 更多