3.4

N <- 10000
sim <- rbinom(N, size = 15, prob = 0.2)  

mean(sim == 5)
[1] 0.1081
mean(sim >= 5)
[1] 0.1726
mean(sim < 3)
[1] 0.385
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.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
alpha <- 0.8
n <- 20
p <- 0.5
y <- 0:n

pmf <- alpha * dbinom(y, n, p)
pmf[y == 0] <- (1 - alpha) + alpha * dbinom(0, n, p)

mydata <- data.frame(y = y, py = pmf)

(ggplot(data = mydata)
  + geom_col(aes(x = y, y = py), width = .5)
  + scale_x_continuous(breaks = 0:20)
  + labs(x = 'y', y = 'p(y)', title = 'Zero-Inflated Binomial pmf (alpha=0.8, n=20, p=0.5)')
  + theme_classic(base_size = 18)
)

cdf <- (1 - alpha) + alpha * pbinom(y, n, p)

median_val <- min(y[cdf >= 0.5])
median_val
[1] 9