# Simulate: 30 players · 20 matches · outcome = fouls (count)
set.seed(99)
foul_data <- map_dfr(1:30, function(i) {
u_i <- rnorm(1, 0, 0.4)
position <- sample(c("Defender","Midfielder","Forward"), 1)
tibble(
player = paste0("P", str_pad(i, 2, "left", "0")),
position = position,
minutes = sample(seq(20, 90, by = 5), 20, replace = TRUE),
fouls = rnbinom(20,
mu = exp(0.8 +
ifelse(position=="Midfielder", -0.27, 0) +
ifelse(position=="Forward", -0.45, 0) +
u_i) * (minutes / 90),
size = 2)
)
})
# Step 1: try Poisson
m_pois <- glmer(fouls ~ position + offset(log(minutes / 90)) + (1 | player),
data = foul_data, family = poisson)
check_overdispersion(m_pois)