Same study as exercise 1 — Uruguay's cash transfer and the question
of whether welfare buys political loyalty — but now the
state-of-the-art estimator: rdrobust(),
which fits a local linear regression inside an
optimal bandwidth with
triangular-kernel weights.
pacman::p_load(tidyverse, rdrobust, causaldata)
data("gov_transfers", package = "causaldata")
rdrobust(): outcome Support, running variable
Income_Centered, cutoff c = 0. Read the
Conventional coefficient. The estimate is about
.
Is it statistically significant?
RDD <- rdrobust(gov_transfers$Support, gov_transfers$Income_Centered, c = 0)
summary(RDD)
Why so uncertain? In exercise 1 the parametric
model — using all the data — found a clear, significant
effect of about 0.10. Here rdrobust() cannot even reach
significance. Look at the bandwidth it chose
(h ≈ 0.005) and the number of observations left inside it.
The most likely reason the non-parametric estimate is so imprecise is
that
Turn the bandwidth up by hand.
rdrobust() takes an argument h to set the
bandwidth yourself. Re-run it with h = 0.02. The estimate
is now about
,
and it is statistically significant.
RDD_wide <- rdrobust(gov_transfers$Support, gov_transfers$Income_Centered, c = 0, h = 0.02)
summary(RDD_wide)
Mind the sign. In exercise 1 the parametric
\(\lambda\) was +0.10;
here rdrobust() reports about −0.10 for
the same effect. rdrobust() always estimates (value
just above the cutoff) − (value just below). In this study the
households who received the transfer are
below the cutoff. So the negative sign means:
Write one sentence as a # comment
reconciling the two exercises — then compare:
Both exercises say the transfer raised government support by roughly
0.10 on the 0–1 scale. The parametric model reported it
as +0.10 for a below-cutoff dummy;
rdrobust() reports it as −0.10 because it
measures the jump as above-minus-below, and the treated sit below. The
sign is bookkeeping — the substantive finding is identical. The lesson
is that at the MSE-optimal bandwidth the local estimate
was too imprecise to detect, and widening the window traded a little
bias for the precision needed to see the effect.
Discuss with your neighbour.
rdrobust() picked a smaller bandwidth than the
one that finally revealed the effect. Is the algorithm "wrong"? What is
it optimising, and why might that differ from "find me a significant
result"?h until the stars pile up. Why
would that be p-hacking, and what protects an honest
RDD against it?rdrobust, or the hand-widened one?
Defend your choice.rdrobust optimal-bandwidth estimate (the principled
default), and show the estimate is stable across a range of
bandwidths — honesty about uncertainty beats a single starred
number.