Recentering removes the expected instrument implied by the shock-assignment process, so identification comes only from deviations of shocks from their (conditional) mean. Two methods:
`"demean"` (default): subtract the single exposure-weighted mean shock \(\bar g\). Leaves the point estimate unchanged but makes the identifying variation explicit.
`"permute"`: subtract the *block-specific simple average* shock, i.e. recenter within exchangeability groups. Under uniform within-block permutation every cell in a block is equally likely to receive each of the block's shocks, so \(E[g_n]\) is the unweighted within-block mean; subtracting it gives the expectation of the instrument under that assignment process (Borusyak & Hull), computed analytically. With no `block` this recenters by the grand unweighted mean.
For randomization-inference p-values based on the same permutation idea, see [ssb_ri()].
Usage
ssb_recenter(design, method = c("demean", "permute"), block = NULL, ...)Examples
sim <- ssb_simulate(n_loc = 80, n_sec = 10, seed = 1)
d <- ssb_design(sim$data, sim$shares, sim$shocks, exogenous = "shift")
ssb_recenter(d, method = "demean")
#> <ssBartik design>
#> route : exogenous SHIFT
#> units : 80 sectors/cells : 10
#> outcome/trt: y ~ x
#> controls : (none)
#> weights : (none) cluster : (none)
#> shares sum to one : yes