Skip to contents

Iterates the expected discovered-crime counts of two regions under a patrol allocation proportional to those counts. Under the naive update the region with the higher true rate absorbs the whole patrol whatever the ratio of the rates; under the corrected update the allocation converges to the true-rate proportion.

Usage

morie_feedback_loop_meanfield(
  lam_a,
  lam_b,
  c_a0,
  c_b0,
  n_steps = 100L,
  update = c("naive", "corrected"),
  rho = 0
)

Arguments

lam_a, lam_b

True crime rates (per patrol visit) of regions A and B; positive.

c_a0, c_b0

Initial discovered-crime counts; positive.

n_steps

Number of steps to iterate.

update

"naive" (discovered counts fed back as they are) or "corrected" (each discovery discounted by the presence that produced it, so the increment is the true rate).

rho

Share of crimes that reach the record through public reports independent of patrol presence, in [0, 1]. With rho > 0 the naive share is proved never to exceed \(\max(x_0, \lambda_A/(\lambda_A + \rho\lambda_B))\) (Research.P4.rho_cap): reports cap the loop strictly below 1 but strictly above the true-rate proportion unless rho = 1.

Value

A data frame with step, share_a (share of patrol sent to A), c_a, c_b, and the attribute "limit" giving the proved limit of the share (see morie_feedback_loop_limit).

Details

The runaway is a limit statement, and the limit is approached logarithmically: the one-step drift is \(x(1-x)(\lambda_A-\lambda_B)/c_n\) with \(c_n\) growing linearly, so the share moves like a harmonic sum. From a 10/10 start with rates 0.3 and 0.2 the share reaches 0.89 after 20,000 steps and 0.97 after two million; from a 1/99 start with rates 0.21 and 0.20 it moves from 0.010 to 0.015 in two million steps. A claim that a feedback loop "will" concentrate patrols therefore has to state its horizon; the theorem gives the destination, the recursion gives the speed.

References

Ensign D, Friedler SA, Neville S, Scheidegger C, Venkatasubramanian S (2018). Runaway feedback loops in predictive policing. Proceedings of Machine Learning Research 81, 160-171.

See also

morie_feedback_loop_sim for the stochastic urn, morie_feedback_loop_limit for the proved limits.

Examples

mf <- morie_feedback_loop_meanfield(0.3, 0.2, 10, 10, n_steps = 200)
tail(mf$share_a, 1)          # climbing towards 1, not towards 0.6
#> [1] 0.6214194
attr(mf, "limit")
#> $share_a
#> [1] 1
#> 
#> $theorem
#> [1] "Research.P4.naiveShare_tendsto_one"
#> 
#> $note
#> [1] "runaway: the higher-rate region absorbs the whole patrol"
#> 
cf <- morie_feedback_loop_meanfield(0.3, 0.2, 10, 10, n_steps = 200,
                                    update = "corrected")
tail(cf$share_a, 1)          # approaching 0.3 / 0.5 = 0.6
#> [1] 0.5833333