Statistics · 2019

Reproducibility report: Generalized random forests

Reproduced

3 of 3 headline claims held

bound check1 other claim missedscored run not a direct source
The full answer and its qualifiers

Do Generalized Random Forests (Athey et al., 2019) reproduce? Yes, on bound checks: when OpenRepro re-ran the authors' code, 3 of 3 headline claims held within tolerances sealed before scored execution; every headline check is a one-sided bound, not a match to the published value; 1 other check did not hold; a scored run is not the direct source of any recorded value: it may be an upstream stage whose output a later scored job read, or a run that was not used (or more scored runs started than the sealed plan declares); the report names each one (checked 20 Oct 2026).

  • Every headline check is a one-sided bound, not a match to the published value.
  • 1 other check did not hold.
  • A scored run is not the direct source of any recorded value: it may be an upstream stage whose output a later scored job read, or a run that was not used (or more scored runs started than the sealed plan declares); the report names each one.

Do Generalized Random Forests (Athey et al., 2019) reproduce? Yes, on bound checks: when OpenRepro re-ran the authors' code, 3 of 3 headline claims held within tolerances sealed before scored execution (checked 20 Oct 2026).

Checked
Released
Assistants
Ask via MCP

Do Generalized Random Forests reproduce?

Yes, on bound checks. 3 of 3 headline claims held within tolerances sealed before scored execution.

An author reply is published below.

Read the answer with its qualifiers:

  • Every headline check is a one-sided bound, not a match to the published value.
  • 1 other check did not hold.
  • A scored run is not the direct source of any recorded value: it may be an upstream stage whose output a later scored job read, or a run that was not used (or more scored runs started than the sealed plan declares); the report names each one.

Looking for a replication of Generalized Random Forests? This report is a computational reproduction: the authors' own published code was re-run and its results compared with the numbers in the paper. It does not set out to test the findings on new data, and it is not peer reviewed. What an attempt checks.

How far the re-run landed from the published number, in tolerances7 claims re-run, 3 headline
  1. Generalized Random Forests: every claim checked7 claims: 6 held, 1 did not hold.5.1×38.7×∞∞
  • Held (large: headline claim; small: other claim)
  • Did not hold
Reading the marks
  • Tail: a one-sided claim (at most, at least); the tail points to the open side, which is shaded faintly
  • Chevron at the edge: beyond ±3 tolerances, with the actual multiple printed beside it (∞ when the tolerance was zero)
The data behind this chart
ClaimPublishedObservedAccepted ifDeviation ÷ toleranceResult
Plan compatibility rule, part 1: the lower end of the literal-paper-DGP (P) interval for C. GRF MSE x 10 at p=20, n=800 is at most 0.935, the top of the rounding interval of the published 0.93. (headline)0.930.904628at most 0.935-5.07Held
Plan compatibility rule, part 2: the upper end of the literal-paper-DGP (P) interval for C. GRF MSE x 10 at p=20, n=800 is at least 0.925, the bottom of the rounding interval of the published 0.93. (headline)0.931.12361at least 0.925+38.72Held
Plan precision gate: the half-width q*SE_P of the P interval is at most 0.11858505, half the previously observed 1.1671701-0.93 gap. paper_value is the plan's gate threshold, not a published number; the quote is the caption's 60-replication design that the gate is about. (headline)0.1185850.109491at most 0.118585beyond limitHeld
Plan diagnostic: the paired helper excess H-P (helper DGP minus literal DGP, same seeds) has an interval whose lower end is above 0. paper_value 0 is the plan's sign threshold, not a published number.0-0.0895492at least 0beyond limitDid not hold
Reporting only: the primary number, the mean of the 60 P-arm MSE x 10 values (literal paper DGP), for comparison with the published 0.93. Its compatibility is judged only by the two interval-end claims.0.931.01412within ±1000+0.00Held
Reporting only: mean of the 60 H-arm MSE x 10 values (2020 aw3 helper DGP, same seeds and grf 0.9.5), the control; the predecessor's helper value was 1.1671701.0.931.12473within ±1000+0.00Held
Reporting only: mean paired difference H-P of MSE x 10 over the 60 replications. paper_value 0 is a reference, not a published number.00.110612within ±1000+0.00Held

What the attempt found

Sealed settling test of the disputed Table 1 cell (C. GRF, confounding and heterogeneity, p=20, n=800, published 0.93 MSE x 10), pairing the paper's literal DGP (P) with the 2020 aw3 helper (H) under grf 0.9.5, 60 replications with fixed seeds. P mean 1.014, interval [0.905, 1.124] (q*SE 0.109, inside the 0.1186 precision gate), intersects the rounding interval [0.925, 0.935]: compatible with the published point at the stated precision. H mean 1.125, interval [0.980, 1.270]; paired excess H-P 0.111, interval [-0.090, 0.311], not resolved as positive. Plan branch: the literal-paper cell is compatible with the published point, but this experiment does not establish that the helper caused our earlier gap.

Assurance

Level
Sealed, bound and re-derived (what the levels mean)
Plan
Sealed before scored execution; 6 outputs observed before the seal (all of it in the log)
Evidence
Bound: each value was extracted from the cited run output by a rule fixed before the seal
Execution manifest
Yes: for each scored run the command, the Git checkout state (HEAD, status, diff hash) and the hashes of the driver files the command names were recorded when it started and when it ended. Data files and the environment are not bound by this
Report re-derived from the log
Passed: the engine re-derived the report from the log
Engine version
0.2.1

Headline claims

These decide the outcome. Each row gives the published value, the value from the re-run and the accepted-if rule registered before results were recorded. Each row has its own ¶ link.

ClaimPublishedObservedAccepted ifResult
Plan compatibility rule, part 1: the lower end of the literal-paper-DGP (P) interval for C. GRF MSE x 10 at p=20, n=800 is at most 0.935, the top of the rounding interval of the published 0.93.Table 1, p. 23 (row conf.=yes, heterog.=yes, p=20, n=800; column C. GRF) · registered at event 5 · quote verified on p. 23 · bound check, observed 0.973× the published value0.93MSE x 100.904628at most 0.935Held
Plan compatibility rule, part 2: the upper end of the literal-paper-DGP (P) interval for C. GRF MSE x 10 at p=20, n=800 is at least 0.925, the bottom of the rounding interval of the published 0.93.Table 1, p. 23 (row conf.=yes, heterog.=yes, p=20, n=800; column C. GRF) · registered at event 6 · quote verified on p. 23 · bound check, observed 1.21× the published value0.93MSE x 101.12361at least 0.925Held
Plan precision gate: the half-width q*SE_P of the P interval is at most 0.11858505, half the previously observed 1.1671701-0.93 gap. paper_value is the plan's gate threshold, not a published number; the quote is the caption's 60-replication design that the gate is about.Table 1 caption, p. 23 · registered at event 7 · quote verified on p. 23 · bound check, observed 0.923× the published value0.118585MSE x 100.109491at most 0.118585Held

Other claims checked

4 claims: 3 held, 1 did not hold

Reported alongside the headline claims; they do not change the outcome.

ClaimPublishedObservedAccepted ifResult
Plan diagnostic: the paired helper excess H-P (helper DGP minus literal DGP, same seeds) has an interval whose lower end is above 0. paper_value 0 is the plan's sign threshold, not a published number.Table 1, p. 23 (row conf.=yes, heterog.=yes, p=20, n=800; column C. GRF) · registered at event 8 · quote verified on p. 23 · bound check0MSE x 10-0.0895492at least 0Did not hold
Reporting only: the primary number, the mean of the 60 P-arm MSE x 10 values (literal paper DGP), for comparison with the published 0.93. Its compatibility is judged only by the two interval-end claims.Table 1, p. 23 (row conf.=yes, heterog.=yes, p=20, n=800; column C. GRF) · registered at event 9 · quote verified on p. 23 · broad bound0.93MSE x 101.01412within ±1000Held
Reporting only: mean of the 60 H-arm MSE x 10 values (2020 aw3 helper DGP, same seeds and grf 0.9.5), the control; the predecessor's helper value was 1.1671701.Table 1, p. 23 (row conf.=yes, heterog.=yes, p=20, n=800; column C. GRF) · registered at event 10 · quote verified on p. 23 · broad bound0.93MSE x 101.12473within ±1000Held
Reporting only: mean paired difference H-P of MSE x 10 over the 60 replications. paper_value 0 is a reference, not a published number.Table 1, p. 23 (row conf.=yes, heterog.=yes, p=20, n=800; column C. GRF) · registered at event 11 · quote verified on p. 23 · broad bound0MSE x 100.110612within ±1000Held

Deviations from the paper's setup

7 recorded: 3 minor, 4 none
  • minorThe sandbox base image was rebuilt on a new box (image id sha256:35f8fd46..., Debian 13, gcc 14.2.0-19), not the archived job's image sha256:36b1e94b..., which no longer exists. R 4.0.2 (deb sha256 7786359e..., verified), the dependency set from the 2020-09-15 snapshot (Rcpp 1.0.5, RcppEigen 0.3.3.7.0, DiceKriging 1.5.6, lmtest, sandwich, zoo; Matrix 1.2-18 shipped with R), the grf 0.9.5 tarball and the build flags are identical by hash; the environment is pinned by content digest in /work/settle/env-digest.txt (sha256 78e92889...) before the seal.
  • nonegrf 0.9.5 was built from the CRAN archive tarball grf_0.9.5.tar.gz (sha256 46ead518..., packaged 2018-01-09), as in the archived job, not from a checkout of commit a1b8df1b (tag v0.9.5, 2018-01-04). Inspection (event 14): causal_forest.R and input_utilities.R differ only in roxygen comments; the mtry default changes affect only standalone regression/quantile/instrumental forests (causal_forest passes mtry to its nuisance forests explicitly); the C++ differs only by trailing newlines, plus the generated RcppExports.cpp.
  • noneBuild-only patch: grf 0.9.5 compiled with -include cstddef -include cstdint (Makevars sha256 b243d82c..., the same flags as archived job 00056). No source change.
  • minorThe plan's compatibility tolerance 0.005 + q*SE (SE-dependent) is registered as two fixed bounds on the interval ends (P_ci_lower <= 0.935, P_ci_upper >= 0.925), plus the precision gate as a third headline bound; the H-P sign test is registered as >= 0 (plan: > 0). The harness extracts and judges these values but does not itself rederive SDs, SEs or q from the 120 rows; that computation is the sealed analysis script's (sha256 3400b615...), whose 120 recomputed rows are printed in the cited artifact so anyone can recompute it. Per the plan this is a qualified statistical analysis, not a harness-rederived verdict on the formula. Three report-only claims carry deliberately vacuous bands and their verdicts mean nothing.
  • noneForest seeding: set.seed(163000+r) then forest seed = runif(1, 0, .Machine$integer.max), i.e. grf 0.9.5's own rule for seed = NULL applied to the reset stream (as in the authors' script, which leaves seed NULL), passed explicitly and logged; not causal_forest(seed = 163000 + r) literally.
  • minorThe sealed plan is bound in this attempt's hash-chained log (seal event 25, plan hash 74d6a77e...; plan document sha256 eec2efa4... written at event 17) but was not anchored outside the log before execution; external anchoring happens only when the attempt is committed/released.
  • noneDedicated box in DigitalOcean tor1 (s-4vcpu-8gb-intel, the archived job's size) instead of nyc3.

The run

Wall time
21 min 1 s, 20 October 2026 to 20 October 2026
Job compute
7 min 3 s across 2 jobs
Code the results name
grf-labs/grf at a1b8df1
Work tree at the end
grf-labs/grf at a1b8df1
Container image
repro-sandbox:0.2 sha256:35f8fd46ec06…
Sandbox
3.5 CPUs, 6 GB, no GPU
Run by
Claude (claude-opus-5-5), an AI agent made by Anthropic, in a Claude Code session
Attempt
arxiv-1610-01271-20261020T030230Z
Log
54 events, head 6252e100

Evidence

log seal, 54 hash-chained events, 2 earlier versions

The full evidence report has the exact paper quotes, the method behind every number, the reason for each tolerance, notes made during the attempt and the environment it ran in. The raw report.json is the unmodified data this page is built from.

Log seal · 54 hash-chained events

6252e1001c1a681990a613fbd32a2e02f351160eff41659fdcafdf705bf1c3b1

The head hash of the attempt's append-only log. The engine generated this report from that log. The verifier checks the log and its artifacts against this hash, and that the report names it. It does not check the report's contents. The evidence bundle for this attempt is not published yet.

Released 12 November 2026 · Settling update sent 20 October 2026 to one author, with a request to forward it. Author reply received 23 October 2026.

Earlier versions of this report

The report above is the current version. Each earlier attempt stays public, unedited, with the reason it was replaced.

  • arxiv-1610-01271-20261020T025027Z, 20 October 2026: Abandoned before any result. Superseded by arxiv-1610-01271-20261020T030230Z: A setup-only attempt, abandoned before any claim was registered or any result recorded because its setup output preceded the claims; the settling test was restarted in the attempt that supersedes it, which registered the protocol and every claim before any command output.
  • arxiv-1610-01271-20261018T023619Z, 18 October 2026: Partially reproduced. Superseded by arxiv-1610-01271-20261020T030230Z: Its simulations used a 2020 helper whose design differs from the paper's (confounding variable, outcome construction, sample normalization), so its comparisons are withdrawn as a test of Table 1 as written; the sealed settling test ran the disputed cell under the paper's own design.

Share image (1200×630), drawn from this report.

How to cite this report

OpenRepro (2026). Reproducibility report: Generalized random forests. Reproduced; 3 of 3 headline claims held (every headline check is a one-sided bound, not a match to the published value; 1 other check did not hold; a scored run is not the direct source of any recorded value: it may be an upstream stage whose output a later scored job read, or a run that was not used (or more scored runs started than the sealed plan declares); the report names each one). Attempt arxiv-1610-01271-20261020T030230Z, log head 6252e1001c1a6819, checked 20 Oct 2026. https://openrepro.org/papers/1610.01271/

APA style

OpenRepro. (2026). Reproducibility report: Generalized random forests (Attempt arxiv-1610-01271-20261020T030230Z; log head 6252e1001c1a6819). https://openrepro.org/papers/1610.01271/

BibTeX
@techreport{openrepro-1610.01271,
  author      = {{OpenRepro}},
  title       = {Reproducibility report: Generalized random forests},
  institution = {OpenRepro},
  year        = {2026},
  url         = {https://openrepro.org/papers/1610.01271/},
  note        = {Attempt arxiv-1610-01271-20261020T030230Z; log head 6252e1001c1a6819; checked 20 Oct 2026}
}

To cite the whole ledger, use CITATION.cff on the data page.

References

1 paper
  1. Susan Carleton Athey, Julie Tibshirani, Stefan Wager (2019). Generalized random forests. The Annals of Statistics. arXiv 1610.01271 · doi:10.1214/18-aos1709

Badge

OpenRepro: Reproduced. 3 of 3 headline claims held; every headline check is a one-sided bound, not a match to the published value; 1 other check did not hold; a scored run is not the direct source of any recorded value: it may be an upstream stage whose output a later scored job read, or a run that was not used (or more scored runs started than the sealed plan declares); the report names each one.

Authors and maintainers may embed this badge; it always reflects the current report, and a correction updates it.

Copy the badge as Markdown or HTML

Markdown

[![OpenRepro: Reproduced. 3 of 3 headline claims held; every headline check is a one-sided bound, not a match to the published value; 1 other check did not hold; a scored run is not the direct source of any recorded value: it may be an upstream stage whose output a later scored job read, or a run that was not used (or more scored runs started than the sealed plan declares); the report names each one.](https://openrepro.org/badge/1610.01271.svg)](https://openrepro.org/papers/1610.01271/)

HTML

<a href="https://openrepro.org/papers/1610.01271/"><img src="https://openrepro.org/badge/1610.01271.svg" alt="OpenRepro: Reproduced. 3 of 3 headline claims held; every headline check is a one-sided bound, not a match to the published value; 1 other check did not hold; a scored run is not the direct source of any recorded value: it may be an upstream stage whose output a later scored job read, or a run that was not used (or more scored runs started than the sealed plan declares); the report names each one." width="537" height="20"></a>

Right of reply, and reporting an error

1 author reply

Author reply

From Stefan Wager, co-author. Received .

Hello,

Prof. Athey shared with me your replication report of the GRF paper.

I just wanted to share some quick reactions, as well as results from my own replication using Codex:

- The version number for GRF is very important. As you see in our changelog (https://github.com/grf-labs/grf/blob/master/releases/CHANGELOG.md) the package functionality has explicitly changed a number of times. So we shouldn't expect the current package to replicate exact numbers from the paper.

- The paper doesn't list the package version. That is an error and oversight by us.

- The numbers in their current form were already in the July 2017 arXiv draft (https://arxiv.org/pdf/1610.01271v3). As such, the version most likely to have produced these numbers is 0.9.2, which was released concurrently with that arXiv version.

- The 0.9.2 results are roughly within Monte-Carlo error (assuming the paper had the same amount of Monte Carlo error as the replication), although in the aggregate the errors are a little bit larger than what you'd expect from Monte Carlo error alone.

[OpenRepro omitted one sentence referring to an attachment; the author asked that the attachment not be published]

Please also note the part where the DGP used in the paper is actually different from the DGP provided in the simulation library of the GRF repo: There are some automated re-scaling rules in the repo that are different than in the paper.

Thanks a lot, and please let me know if you have any questions.

All the best,
Stefan

Links in the reply: GRF changelog · arXiv v3 (July 2017)

Published with permission, given by the author on . The permission covers: email text, including the changelog link and the dating of the paper's numbers. The text is as received, unedited except for whitespace (line breaks and spacing) and one passage omitted by OpenRepro, marked in square brackets.

The author also shared a replication report for information only; at the author's request it is not published or summarised here.

Authors of any paper on this site may submit a response for publication. Replies are published with the author's permission, in full or in the parts they choose, and any omission is marked. The published text preserves their wording apart from disclosed edits: whitespace is normalized, omitted passages are marked, and any removal of signature email addresses and adjoining separators is disclosed. Write to hello@openrepro.org.

Anyone, not only an author, can report an error in an attempt to the same address. The same address takes suggestions of papers to check and questions about the method.