简体   繁体   中英

Monte Carlo to Estimate Theta using Gamma Distribution

在此处输入图像描述

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)

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

θ = 0 (x 4.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 (x 4.5 /2) at sampled values
  3. Mean value of those computed values would be the integral computed by MC

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 MC estimation of your integral θ is 1.160716∓0.1275271

What is implemented here is following, eg http://www.math.chalmers.se/Stat/Grundutb/CTH/tms150/1112/MC.pdf , 6.1.2, where g(x) is our power function (x 4.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.

Eg, I could write

θ = 0 (x 4.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.5 5.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.

The best way to estimate theta given its definition is

theta <- integrate(function(x) x^4.5 * exp(-2*x), from = 0, to = Inf)

Giving:

theta
#> [1] 1.156623

Another way to handle this is by seeing that the constant lambda^rate / gamma(rate) can be taken outside of the cdf integral, and since we know that the cdf at infinity is 1, then theta must equal gamma(rate)/lambda^rate

gamma(5.5)/2^5.5
#> [1] 1.156623

Note that we can also write functions for your pdf and cdf and plot them:

pdf <- function(t, rate, lambda) {
  (lambda^rate)/gamma(rate) * t^(rate-1) * exp(-2 * t)
}

cdf <- function(x, rate, lambda) {
  sapply(x, function(y) {
    integrate(pdf, lower = 0, upper = y, lambda = lambda, rate = rate)$value
  })
}

curve(pdf(x, 5.5, 2), from = 0, to = 10)


curve(cdf(x, 5.5, 2), from = 0, to = 10)

It's not quite clear how you would want a Monte Carlo simulation to help you with any of this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM