p_grid <- seq( from=0 , to=1 , length.out=1000 )
prior <- rep( 1 , 1000 )
likelihood <- dbinom( 6 , size=9 , prob=p_grid )
posterior <- likelihood * prior
posterior <- posterior / sum(posterior)
set.seed(100)
samples <- sample( p_grid , prob=posterior , size=1e4 , replace=TRUE )
plot(x = p_grid, y = posterior, type = "l")
Use the values in samples to answer the questions that follow.
3E1. How much posterior probability lies below p = 0.2?
sum(samples < 0.2) / 1e4
## [1] 4e-04
3E2. How much posterior probability lies above p = 0.8?
mean(samples > 0.8)
## [1] 0.1116
3E3. How much posterior probability lies between p = 0.2 and p = 0.8?
mean(samples > 0.2 & samples < 0.8)
## [1] 0.888
3E4. 20% of the posterior probability lies below which value of p?
quantile(samples, 0.20)
## 20%
## 0.5185185
3E5. 20% of the posterior probability lies above which value of p?
quantile(samples, 1 - 0.20)
## 80%
## 0.7557558
3E6. Which values of p contain the narrowest interval equal to 66% of the posterior probability?
library(rethinking)
## Loading required package: rstan
## Loading required package: StanHeaders
## Loading required package: ggplot2
## rstan (Version 2.19.3, GitRev: 2e1f913d3ca3)
## For execution on a local, multicore CPU with excess RAM we recommend calling
## options(mc.cores = parallel::detectCores()).
## To avoid recompilation of unchanged Stan programs, we recommend calling
## rstan_options(auto_write = TRUE)
## For improved execution time, we recommend calling
## Sys.setenv(LOCAL_CPPFLAGS = '-march=corei7 -mtune=corei7')
## although this causes Stan to throw an error on a few processors.
## Loading required package: parallel
## Loading required package: dagitty
## rethinking (Version 2.01)
##
## Attaching package: 'rethinking'
## The following object is masked from 'package:stats':
##
## rstudent
HPDI(samples, prob = 0.66)
## |0.66 0.66|
## 0.5085085 0.7737738
3E7. Which values of p contain 66% of the posterior probability, assuming equal posterior probability both below and above the interval?
PI( samples, prob = 0.66 )
## 17% 83%
## 0.5025025 0.7697698
3M1. Suppose the globe tossing data had turned out to be 8 water in 15 tosses. Construct the posterior distribution, using grid approximation. Use the same flat prior as before.
p_grid <- seq(from = 0, to = 1, length.out = 1e3)
prior <- rep(1, 1e3)
likelihood <- dbinom( 8, size=15, prob=p_grid)
posterior <- likelihood * prior
posterior <- posterior / sum(posterior)
plot(x = p_grid, y = posterior, type = "l")
3M2. Draw 10,000 samples from the grid approximation from above. Then use the samples to calculate the 90% HPDI for p.
samples <- sample(p_grid, prob = posterior, size = 1e4, replace = TRUE)
HPDI(samples, prob = .90)
## |0.9 0.9|
## 0.3293293 0.7167167
3M3. Construct a posterior predictive check for this model and data. This means simulate the distribution of samples, averaging over the posterior uncertainty in p. What is the probability of observing 8 water in 15 tosses?
set.seed(121)
w <- rbinom(1e4, size = 15, prob = samples)
simplehist(w)
mean(w == 8)
## [1] 0.1492
3M4. Using the posterior distribution constructed from the new (8/15) data, now calculate the probability of observing 6 water in 9 tosses.
w <- rbinom(1e4, size = 9, prob = samples)
simplehist(w)
mean(w == 6)
## [1] 0.1782
3M5. Start over at 3M1, but now use a prior that is zero below p = 0.5 and a constant above p = 0.5. This corresponds to prior information that a majority of the Earth’s surface is water. Repeat each problem above and compare the inferences. What difference does the better prior make? If it helps, compare inferences (using both priors) to the true value p = 0.7.
#redo 3M1
p_grid <- seq(from = 0, to = 1, length.out = 1e3)
prior <- ifelse(p_grid < .5, 0, 1)
likelihood <- dbinom(8, size = 15, prob = p_grid)
posterior <- likelihood * prior
posterior <- posterior / sum(posterior)
plot(x = p_grid, y = posterior, type = "l")
#Compare with 3M1, all posterior probability values have become zero when P < 0.5 and the height of the curve (p>0.5) increased. It seems the the probability mass that has been assigned below 0.5 increase the height of reminder curve.
#redo 3M2
samples <- sample(p_grid, prob = posterior, size = 1e4, replace = TRUE)
HPDI(samples, prob = .90)
## |0.9 0.9|
## 0.5005005 0.7087087
#Lower bond of HPDI was impacted more, which increased from 0.32 to 0.50. The higher bond was not impacted much. Therefore the probability mass that was p<0.5 must have shifted to be between p=0.5 and p=0.71. otherwise the upper bound would have changed.
#redo 3M3
w <- rbinom(1e4, size = 15, prob = samples)
simplehist(w)
##The histogram is now less symmetrical as it looks lower on the left-hand side. The modal predicted value also shifted from 8 to 9. The probability of observing 8 water in 15 tosses has increase slightly.
#redo 3M4
w <- rbinom(1e4, size = 9, prob = samples)
simplehist(w)
mean(w == 6)
## [1] 0.2342
##The model value has shifted from 5 to 6, and the probality of observing 6 water in 9 tosses has increase from 19% to 23% .
3M6. Suppose you want to estimate the Earth’s proportion of water very precisely. Specifically, you want the 99% percentile interval of the posterior distribution of p to be only 0.05 wide. This means the distance between the upper and lower bound of the interval should be 0.05. How many times will you have to toss the globe to do this?
set.seed(151)
compute_pi_width <- function(N, true_p) {
likelihood <- dbinom( round(N*true_p), size=N, prob=p_grid )
posterior <- likelihood * prior
posterior <- posterior / sum(posterior)
samples <- sample(p_grid, prob=posterior, size=1e4, replace=TRUE )
interval <- PI(samples, prob=0.99)
names(interval) <- NULL
diff( interval )
}
#Based on the statement of 3M5. I use the true propotion of water as 0.7
true_p <- 0.7
N <- 1000
compute_pi_width(N, true_p)
## [1] 0.07307307
N <- 1500
compute_pi_width(N, true_p)
## [1] 0.06106106
N <- 2000
compute_pi_width(N, true_p)
## [1] 0.05205205
N <- 2200
compute_pi_width(N, true_p)
## [1] 0.05005005
# After tried couple times we can see when we toss 2200 the interval should be close to 0.05