Skip to content

Latest commit

 

History

History
125 lines (96 loc) · 7.64 KB

File metadata and controls

125 lines (96 loc) · 7.64 KB

Missing data: what the pipeline assumes and which way it bends

Generated by scripts/R/11_missing_data.R, which recomputes every quantity below from the data and stops if one of them stops reproducing. Do not edit by hand.

Each entry carries one of three verdicts. tested means the direction was checked against data, and the check is named. conservative means the direction is known to understate exposure and the discarded alternative is recorded, so the cost of the choice is visible. unknown means it cannot be settled with what we have, and what it would take is recorded.

Where a direction is arguable and untestable, the pipeline takes the branch that understates exposure and says so here.

Panel: 1,134 panelists, 4,398,822 visits to 64,074 domains, 34,512 of them scanned.

Visit counting: page records versus sessions

  • Means: realityMine_web records one row per page load; the desktop and mobile files record one row per session, with a page_views count
  • Code does: the visit panel is built from realityMine_web alone, one visit per page record
    03_import: build_visit_panel
  • Scale: 4,398,822 visits, against the 6,236,834 previously published
  • Direction: the old count overstated the denominator, understating rates
  • Verdict: tested - The committed yg_ind_domain.csv summed all three RealityMine files. realityMine_web is a strict superset of the other two, so that sum counted the same browsing twice under two different units. Correcting it leaves the analytic universe untouched and lowers levels about 2%. The demographic gaps widen slightly rather than narrowing, because the double-count was proportionally larger for younger, higher-education panelists.

Unscanned domains

  • Means: Blacklight never returned a scan for the domain
  • Code does: contributes zero to the numerator, stays in the denominator
    03_import + 05_person: left join, unmatched measures scored zero
  • Scale: 21.0% of visits
  • Direction: understates
  • Verdict: conservative - Bounded by strand B: the published 5.19 ad trackers per visit becomes [6.19, 8.04] under calibrated fills. Directly measured, a rescanned sample of these domains carries MORE tracking than the scanned population (8.11 against 6.43), so the floor is real. Alternative (mean fill) would give 6.64.

Scans returning zero on all seven measures

  • Means: a logged-out landing page showed nothing; the site may still track behind a login
  • Code does: treated as a genuine zero, indistinguishable from a measured absence
    03_import: measures initialised to 0 per card
  • Scale: 20.2% of visits, 8,186 domains
  • Direction: understates
  • Verdict: tested - facebook.com alone is 7.2% of panel visits and scores zero on all seven. build_allzero_sensitivity re-runs the headline excluding these visits and imputing them at the mean of domains that did show tracking: the age gap holds in sign and significance under all three. No conclusion depends on the zero. The level does: exposure is understated.

WhoTracksMe absent

  • Means: WhoTracksMe has no telemetry for the domain
  • Code does: who_* divides by WTM-covered visits rather than filling zero
    05_person: who_visits denominator
  • Scale: 27.2% of visits, only 4,261 domains covered (6.7%)
  • Direction: was understating; now conditional
  • Verdict: tested - Absence is not zero. WhoTracksMe never reports below 1.02 trackers per page load, so its process cannot emit 'measured none'. Blacklight measures 5.62 ad trackers per visit on the domains WTM lacks against 6.62 on those it covers.

HTTP Archive cookie rank cap

  • Means: the cookie query was capped at rank 100k; the domain was never asked about
  • Code does: left missing, with a flag; formerly filled zero
    10_validity: ha_by_domain and the cookies_queried mask
  • Scale: 58% of domain-crawls in 2022, 66% by mid-2025
  • Direction: was manufacturing a downward trend
  • Verdict: tested - The capped share grew across crawl dates, so zero-filling read a change in what was queried as a change in what sites do. It also inverted the calibrated fill, and measure_fills raises if the absent arm ever predicts more than the present one. The same cap damped the same-instrument cookie drift until the comparison was restricted to domains queried at both dates.

Per-user scan coverage

  • Means: each person's rate is their true rate times their coverage
  • Code does: attenuates every level by roughly a quarter
    rates divide by all visits, numerator covers scanned only
  • Scale: mean coverage 0.774, sd 0.15, range 0.00 to 1.00
  • Direction: understates levels
  • Verdict: tested - Coverage is flat across age and education, so it does not manufacture the demographic gaps. It does understate levels, and any statement of the form 'the average adult meets X trackers per visit' is low by roughly the complement of that mean.

Path-keyed blocklist rules

  • Means: Blacklight stores hostnames, so a rule keyed on a URL path cannot fire
  • Code does: reported as an interval, not a point
    collect/blocking/03_apply_blocklists
  • Scale: 8% of EasyList and 14% of EasyPrivacy network rules
  • Direction: understates blocking, overstates residual
  • Verdict: conservative - Every residual carries an identification bound: block only what a domain rule certainly stops, versus credit every host the list names. The Facebook pixel is the clean case, since EasyPrivacy stops it only with path rules. Kept separate from sampling uncertainty throughout.

Facebook Pixel and Google Analytics (Remarketing) attribution

  • Means: these cards name no responsible domain, so the third party is assumed
  • Code does: assigned a fixed host set, flagged, excluded from every headline
    09_blocking: UNATTRIBUTED
  • Scale: 2 of 7 measures
  • Direction: unknown
  • Verdict: conservative - Reported but never headlined. Settling it needs the request URLs Blacklight does not store.

Third-party cookie attribution

  • Means: a card gives a cookie count and a domain list, not a mapping
  • Code does: residual counted per cookie-setting domain, not per cookie
    09_blocking: third_party_cookie_domains
  • Scale: all cookie residuals
  • Direction: unknown
  • Verdict: conservative - The published cookie count is carried alongside as a scale reference rather than being split.

Card absent from a scan payload

  • Means: the test did not run, or ran and found nothing, and the two are indistinguishable
  • Code does: recorded as zero either way
    03_import: measures initialised to 0
  • Scale: unquantified
  • Direction: understates
  • Verdict: unknown - Settling it needs a per-card presence census across the scan payloads.

Panelists with no usable browsing

  • Means: recruited but logged nothing that could be attributed to a domain
  • Code does: excluded from the analytic sample
    05_person: inner join on visits
  • Scale: 66 of 1,200 recruited
  • Direction: unknown
  • Verdict: unknown - The paper states this moves no demographic margin by more than a point. Whether they differ on browsing behaviour is not observable, since they have none.

Panel-vendor domains in the denominator

  • Means: visits to the survey platform are metered like any other browsing
  • Code does: counted in tt_visits, so they dilute every rate
    none; they are ordinary visits
  • Scale: decipherinc.com alone is 1.91% of all visits, the 8th largest domain
  • Direction: understates rates
  • Verdict: unknown - Whether panel-participation browsing belongs in the denominator is a definitional question, not a measurement one.