rsimulationmontecarlogamma-distributiongamma

Monte Carlo to Estimate Theta using Gamma Distribution


enter image description here

I would like to run a monte carlo simulation in r to estimate theta. Could someone please recommend some resources and suggests for how I could do this?

I have started with creating a sample with the gamma distribution and using the shape and rate of the distribution, but I am unsure of where to go next with this.

x = seq(0.25, 2.5, by = 0.25)
PHI <- pgamma(x, shape = 5.5, 2)
CDF <- c()
n= 10000

set.seed(12481632)
y = rgamma(n, shape = 5.5, rate = 2)

Solution

  • You could rewrite your expression for θ, factoring out exponential distribution.

    θ = 0 (x4.5/2) (2 e-2x) dx

    Here (2 e-2x) is exponential distribution with rate=2, which suggests how to integrate it using Monte Carlo.

    1. Sample random values from exponential
    2. Compute function (x4.5/2) at sampled values
    3. Mean value of those computed values would be the integral computed by M-C

    Code, R 4.0.3 x64, Win 10

    set.seed(312345)
    n <- 10000
    
    x <- rexp(n, rate = 2.0)
    
    f <- 0.5*x**4.5
    
    mean(f)
    

    prints

    [1] 1.160716
    

    You could even estimate statistical error as

    sd(f)/sqrt(n)
    

    which prints

    [1] 0.1275271
    

    Thus M-C estimation of your integral θ is 1.160716∓0.1275271

    What is implemented here is following, e.g. http://www.math.chalmers.se/Stat/Grundutb/CTH/tms150/1112/MC.pdf, 6.1.2, where g(x) is our power function (x4.5/2), and f(x) is our exponential distribution.

    UPDATE

    Just to clarify one thing - there is no single canonical way to split under-the-integral expression into sampling PDF f(x) and computable function g(x), mean value of which would be our integral.

    E.g., I could write

    θ = 0 (x4.5 e-x) (e-x) dx

    e-x would be the PDF f(x). Simple exponential with rate=1, and g(x) how has exponential leftover part. Similar code

    set.seed(312345)
    n <- 10000
    
    f <- rexp(n, rate = 1.0)
    
    g <- f**4.5*exp(-f)
    
    print(mean(g))
    print(sd(g)/sqrt(n))
    

    produced integral value of 1.148697∓0.02158325. It is a bit better approach, because statistical error is smaller.

    You could even write it as

    θ = Γ(5.5) 0.55.5 0 1 G(x| shape=5.5, scale=0.5) dx

    where Γ(x) is gamma-function and G(x| shape, scale) is Gamma-distribution. So you could sample from gamma-distribution and g(x)=1 for any sampled x. Thus, this will give you precise answer. Code

    set.seed(312345)
    
    f <- rgamma(n, 5.5, scale=0.5)
    g <- f**0.0 # g is equal to 1 for any value of f
    print(mean(g)*gamma(5.5)*0.5**5.5)
    print(sd(g)/sqrt(n))
    

    produced integral value of 1.156623∓0.