# Load packages
library(bayesrules)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
#posterior pdf of mu
Y<-c(7.1,8.9,8.4,8.6)
mean(Y)
## [1] 8.25
summarize_normal_normal(mean = 10, sd = 1.2,sigma = 1.3,y_bar =8.25, n = 4)
## model mean mode var sd
## 1 prior 10.00000 10.00000 1.4400000 1.2000000
## 2 posterior 8.64698 8.64698 0.3266577 0.5715398
#a)Utilize grid approximation with grid values μ∈{5,6,7,…,15} to approximate the posterior model of μ.
#Step 1: Define a grid of 11 mu values
grid_data <- data.frame(mu_grid = seq(from = 5, to = 15, length = 11))
#Step 2: Evaluate the prior & likelihood at each μ
grid_data <- grid_data %>%
mutate(prior = dnorm(mu_grid, 10, 1.2),
likelihood = dnorm(7.1, mu_grid) * dnorm(8.9, mu_grid) * dnorm(8.4, mu_grid) * dnorm(8.6, mu_grid))
#Step 3: Approximate the posterior
grid_data <- grid_data %>%
mutate(unnormalized = likelihood * prior,
posterior = unnormalized / sum(unnormalized))
# Examine the grid approximated posterior
round(grid_data, 2)
## mu_grid prior likelihood unnormalized posterior
## 1 5 0.00 0.00 0 0.00
## 2 6 0.00 0.00 0 0.00
## 3 7 0.01 0.00 0 0.00
## 4 8 0.08 0.01 0 0.49
## 5 9 0.23 0.00 0 0.51
## 6 10 0.33 0.00 0 0.00
## 7 11 0.23 0.00 0 0.00
## 8 12 0.08 0.00 0 0.00
## 9 13 0.01 0.00 0 0.00
## 10 14 0.00 0.00 0 0.00
## 11 15 0.00 0.00 0 0.00
# Plot the grid approximated posterior
ggplot(grid_data, aes(x = mu_grid, y = posterior)) +
geom_point() +
geom_segment(aes(x = mu_grid, xend = mu_grid, y = 0, yend = posterior))

#Set the seed
set.seed(841339)
#Step 4: sample from the discretized posterior
post_sample <- sample_n(grid_data, size = 10000,
weight = posterior, replace = TRUE)
# Histogram of the grid simulation with posterior pdf
ggplot(post_sample, aes(x = mu_grid)) +
geom_histogram(aes(y = ..density..), color = "white") +
stat_function(fun = dnorm, args = list(8.64698, 0.5715398)) +
lims(x = c(0, 15))
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_bar()`).

#b)Repeat part a using a grid of 201 equally spaced values between 5 and 15.
#Step 1: Define a grid of 11 mu values
grid_data <- data.frame(mu_grid = seq(from = 5, to = 15, length = 201))
#Step 2: Evaluate the prior & likelihood at each μ
grid_data <- grid_data %>%
mutate(prior = dnorm(mu_grid, 10, 1.2),
likelihood = dnorm(7.1, mu_grid) * dnorm(8.9, mu_grid) * dnorm(8.4, mu_grid) * dnorm(8.6, mu_grid))
#Step 3: Approximate the posterior
grid_data <- grid_data %>%
mutate(unnormalized = likelihood * prior,
posterior = unnormalized / sum(unnormalized))
# Examine the grid approximated posterior
round(grid_data, 2)
## mu_grid prior likelihood unnormalized posterior
## 1 5.00 0.00 0.00 0 0.00
## 2 5.05 0.00 0.00 0 0.00
## 3 5.10 0.00 0.00 0 0.00
## 4 5.15 0.00 0.00 0 0.00
## 5 5.20 0.00 0.00 0 0.00
## 6 5.25 0.00 0.00 0 0.00
## 7 5.30 0.00 0.00 0 0.00
## 8 5.35 0.00 0.00 0 0.00
## 9 5.40 0.00 0.00 0 0.00
## 10 5.45 0.00 0.00 0 0.00
## 11 5.50 0.00 0.00 0 0.00
## 12 5.55 0.00 0.00 0 0.00
## 13 5.60 0.00 0.00 0 0.00
## 14 5.65 0.00 0.00 0 0.00
## 15 5.70 0.00 0.00 0 0.00
## 16 5.75 0.00 0.00 0 0.00
## 17 5.80 0.00 0.00 0 0.00
## 18 5.85 0.00 0.00 0 0.00
## 19 5.90 0.00 0.00 0 0.00
## 20 5.95 0.00 0.00 0 0.00
## 21 6.00 0.00 0.00 0 0.00
## 22 6.05 0.00 0.00 0 0.00
## 23 6.10 0.00 0.00 0 0.00
## 24 6.15 0.00 0.00 0 0.00
## 25 6.20 0.00 0.00 0 0.00
## 26 6.25 0.00 0.00 0 0.00
## 27 6.30 0.00 0.00 0 0.00
## 28 6.35 0.00 0.00 0 0.00
## 29 6.40 0.00 0.00 0 0.00
## 30 6.45 0.00 0.00 0 0.00
## 31 6.50 0.00 0.00 0 0.00
## 32 6.55 0.01 0.00 0 0.00
## 33 6.60 0.01 0.00 0 0.00
## 34 6.65 0.01 0.00 0 0.00
## 35 6.70 0.01 0.00 0 0.00
## 36 6.75 0.01 0.00 0 0.00
## 37 6.80 0.01 0.00 0 0.00
## 38 6.85 0.01 0.00 0 0.00
## 39 6.90 0.01 0.00 0 0.00
## 40 6.95 0.01 0.00 0 0.00
## 41 7.00 0.01 0.00 0 0.00
## 42 7.05 0.02 0.00 0 0.00
## 43 7.10 0.02 0.00 0 0.00
## 44 7.15 0.02 0.00 0 0.00
## 45 7.20 0.02 0.00 0 0.00
## 46 7.25 0.02 0.00 0 0.00
## 47 7.30 0.03 0.00 0 0.00
## 48 7.35 0.03 0.00 0 0.00
## 49 7.40 0.03 0.00 0 0.00
## 50 7.45 0.03 0.00 0 0.00
## 51 7.50 0.04 0.00 0 0.00
## 52 7.55 0.04 0.00 0 0.00
## 53 7.60 0.04 0.00 0 0.01
## 54 7.65 0.05 0.00 0 0.01
## 55 7.70 0.05 0.01 0 0.01
## 56 7.75 0.06 0.01 0 0.01
## 57 7.80 0.06 0.01 0 0.01
## 58 7.85 0.07 0.01 0 0.02
## 59 7.90 0.07 0.01 0 0.02
## 60 7.95 0.08 0.01 0 0.02
## 61 8.00 0.08 0.01 0 0.02
## 62 8.05 0.09 0.01 0 0.03
## 63 8.10 0.09 0.01 0 0.03
## 64 8.15 0.10 0.01 0 0.03
## 65 8.20 0.11 0.01 0 0.03
## 66 8.25 0.11 0.01 0 0.04
## 67 8.30 0.12 0.01 0 0.04
## 68 8.35 0.13 0.01 0 0.04
## 69 8.40 0.14 0.01 0 0.04
## 70 8.45 0.14 0.01 0 0.04
## 71 8.50 0.15 0.01 0 0.04
## 72 8.55 0.16 0.01 0 0.04
## 73 8.60 0.17 0.01 0 0.04
## 74 8.65 0.18 0.01 0 0.04
## 75 8.70 0.18 0.01 0 0.04
## 76 8.75 0.19 0.01 0 0.04
## 77 8.80 0.20 0.01 0 0.04
## 78 8.85 0.21 0.00 0 0.03
## 79 8.90 0.22 0.00 0 0.03
## 80 8.95 0.23 0.00 0 0.03
## 81 9.00 0.23 0.00 0 0.02
## 82 9.05 0.24 0.00 0 0.02
## 83 9.10 0.25 0.00 0 0.02
## 84 9.15 0.26 0.00 0 0.02
## 85 9.20 0.27 0.00 0 0.01
## 86 9.25 0.27 0.00 0 0.01
## 87 9.30 0.28 0.00 0 0.01
## 88 9.35 0.29 0.00 0 0.01
## 89 9.40 0.29 0.00 0 0.01
## 90 9.45 0.30 0.00 0 0.01
## 91 9.50 0.30 0.00 0 0.00
## 92 9.55 0.31 0.00 0 0.00
## 93 9.60 0.31 0.00 0 0.00
## 94 9.65 0.32 0.00 0 0.00
## 95 9.70 0.32 0.00 0 0.00
## 96 9.75 0.33 0.00 0 0.00
## 97 9.80 0.33 0.00 0 0.00
## 98 9.85 0.33 0.00 0 0.00
## 99 9.90 0.33 0.00 0 0.00
## 100 9.95 0.33 0.00 0 0.00
## 101 10.00 0.33 0.00 0 0.00
## 102 10.05 0.33 0.00 0 0.00
## 103 10.10 0.33 0.00 0 0.00
## 104 10.15 0.33 0.00 0 0.00
## 105 10.20 0.33 0.00 0 0.00
## 106 10.25 0.33 0.00 0 0.00
## 107 10.30 0.32 0.00 0 0.00
## 108 10.35 0.32 0.00 0 0.00
## 109 10.40 0.31 0.00 0 0.00
## 110 10.45 0.31 0.00 0 0.00
## 111 10.50 0.30 0.00 0 0.00
## 112 10.55 0.30 0.00 0 0.00
## 113 10.60 0.29 0.00 0 0.00
## 114 10.65 0.29 0.00 0 0.00
## 115 10.70 0.28 0.00 0 0.00
## 116 10.75 0.27 0.00 0 0.00
## 117 10.80 0.27 0.00 0 0.00
## 118 10.85 0.26 0.00 0 0.00
## 119 10.90 0.25 0.00 0 0.00
## 120 10.95 0.24 0.00 0 0.00
## 121 11.00 0.23 0.00 0 0.00
## 122 11.05 0.23 0.00 0 0.00
## 123 11.10 0.22 0.00 0 0.00
## 124 11.15 0.21 0.00 0 0.00
## 125 11.20 0.20 0.00 0 0.00
## 126 11.25 0.19 0.00 0 0.00
## 127 11.30 0.18 0.00 0 0.00
## 128 11.35 0.18 0.00 0 0.00
## 129 11.40 0.17 0.00 0 0.00
## 130 11.45 0.16 0.00 0 0.00
## 131 11.50 0.15 0.00 0 0.00
## 132 11.55 0.14 0.00 0 0.00
## 133 11.60 0.14 0.00 0 0.00
## 134 11.65 0.13 0.00 0 0.00
## 135 11.70 0.12 0.00 0 0.00
## 136 11.75 0.11 0.00 0 0.00
## 137 11.80 0.11 0.00 0 0.00
## 138 11.85 0.10 0.00 0 0.00
## 139 11.90 0.09 0.00 0 0.00
## 140 11.95 0.09 0.00 0 0.00
## 141 12.00 0.08 0.00 0 0.00
## 142 12.05 0.08 0.00 0 0.00
## 143 12.10 0.07 0.00 0 0.00
## 144 12.15 0.07 0.00 0 0.00
## 145 12.20 0.06 0.00 0 0.00
## 146 12.25 0.06 0.00 0 0.00
## 147 12.30 0.05 0.00 0 0.00
## 148 12.35 0.05 0.00 0 0.00
## 149 12.40 0.04 0.00 0 0.00
## 150 12.45 0.04 0.00 0 0.00
## 151 12.50 0.04 0.00 0 0.00
## 152 12.55 0.03 0.00 0 0.00
## 153 12.60 0.03 0.00 0 0.00
## 154 12.65 0.03 0.00 0 0.00
## 155 12.70 0.03 0.00 0 0.00
## 156 12.75 0.02 0.00 0 0.00
## 157 12.80 0.02 0.00 0 0.00
## 158 12.85 0.02 0.00 0 0.00
## 159 12.90 0.02 0.00 0 0.00
## 160 12.95 0.02 0.00 0 0.00
## 161 13.00 0.01 0.00 0 0.00
## 162 13.05 0.01 0.00 0 0.00
## 163 13.10 0.01 0.00 0 0.00
## 164 13.15 0.01 0.00 0 0.00
## 165 13.20 0.01 0.00 0 0.00
## 166 13.25 0.01 0.00 0 0.00
## 167 13.30 0.01 0.00 0 0.00
## 168 13.35 0.01 0.00 0 0.00
## 169 13.40 0.01 0.00 0 0.00
## 170 13.45 0.01 0.00 0 0.00
## 171 13.50 0.00 0.00 0 0.00
## 172 13.55 0.00 0.00 0 0.00
## 173 13.60 0.00 0.00 0 0.00
## 174 13.65 0.00 0.00 0 0.00
## 175 13.70 0.00 0.00 0 0.00
## 176 13.75 0.00 0.00 0 0.00
## 177 13.80 0.00 0.00 0 0.00
## 178 13.85 0.00 0.00 0 0.00
## 179 13.90 0.00 0.00 0 0.00
## 180 13.95 0.00 0.00 0 0.00
## 181 14.00 0.00 0.00 0 0.00
## 182 14.05 0.00 0.00 0 0.00
## 183 14.10 0.00 0.00 0 0.00
## 184 14.15 0.00 0.00 0 0.00
## 185 14.20 0.00 0.00 0 0.00
## 186 14.25 0.00 0.00 0 0.00
## 187 14.30 0.00 0.00 0 0.00
## 188 14.35 0.00 0.00 0 0.00
## 189 14.40 0.00 0.00 0 0.00
## 190 14.45 0.00 0.00 0 0.00
## 191 14.50 0.00 0.00 0 0.00
## 192 14.55 0.00 0.00 0 0.00
## 193 14.60 0.00 0.00 0 0.00
## 194 14.65 0.00 0.00 0 0.00
## 195 14.70 0.00 0.00 0 0.00
## 196 14.75 0.00 0.00 0 0.00
## 197 14.80 0.00 0.00 0 0.00
## 198 14.85 0.00 0.00 0 0.00
## 199 14.90 0.00 0.00 0 0.00
## 200 14.95 0.00 0.00 0 0.00
## 201 15.00 0.00 0.00 0 0.00
# Plot the grid approximated posterior
ggplot(grid_data, aes(x = mu_grid, y = posterior)) +
geom_point() +
geom_segment(aes(x = mu_grid, xend = mu_grid, y = 0, yend = posterior))

#Set the seed
set.seed(841339)
#Step 4: sample from the discretized posterior
post_sample <- sample_n(grid_data, size = 10000,
weight = posterior, replace = TRUE)
# Histogram of the grid simulation with posterior pdf
ggplot(post_sample, aes(x = mu_grid)) +
geom_histogram(aes(y = ..density..), color = "white") +
stat_function(fun = dnorm, args = list(8.64698, 0.5715398)) +
lims(x = c(0, 15))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_bar()`).
