Skip to contents

Computes z-scores accounting for sampling variability using de Moivre's equation. This normalizes observed values by their expected standard error.

Usage

funnel_zscore(observed, expected, sample_size, type = c("count", "proportion"))

Arguments

observed

Numeric vector of observed counts or rates

expected

Numeric vector of expected values (e.g., from base rate)

sample_size

Numeric vector of sample sizes (e.g., population)

type

Type of data: "count" (Poisson) or "proportion" (binomial)

Value

Numeric vector of z-scores

Details

For count data (Poisson), SE = sqrt(expected). For proportion data (binomial), SE = sqrt(p * (1-p) / n).

Larger sample sizes result in smaller standard errors, so the same deviation is more "surprising" for larger samples.

Examples

# Observed crimes vs expected (from overall rate)
observed <- c(50, 100, 150)
expected <- c(45, 95, 160)
sample_size <- c(10000, 50000, 100000)
funnel_zscore(observed, expected, sample_size, type = "count")
#> [1]  0.7453560  0.5129892 -0.7905694