Corrections and updates

Book preface · Complete table comparison

This page brings together corrections to the published hard-copy edition, numerical differences in the current online edition, and software updates for the R edition of Empirical Research in Accounting: Tools and Methods. The categories remain separate so readers can distinguish errors to mark in their copy from updated results and optional code changes.

Errata

These entries identify errors in the printed hardback and give directions for correcting that edition. Page numbers refer to printed folios, not PDF viewer page numbers. Changes to displayed results appear separately under Table and numerical updates. Optional changes and software updates appear under Code compatibility and online updates.

Typos, typesetting issues and other corrections

  • p. 4 (correction): In the final paragraph, replace “selection models” with “generalized linear models”.
  • p. 27 (typesetting): Add space to mutate(roe = ib / ceq).
  • p. 47 (typo): In “if you highlight the text from test_scores |>”, reference to test_scores should be to camp_scores.
  • p. 54 (typo): In the first full paragraph, the two references to size should be to cfo to match the code below.
  • p. 55 (typo): Replace size with cfo in “there is no visually discernible relation between size…”.
  • p. 59 (typesetting): Extra space after paragraph that begins with “Making causal inferences …”.
  • p. 60 (typo): Add apostrophe to get “researchers’ focus”.
  • p. 60 (typo): Remove comma from \(\mathbb{E}[X, \epsilon] \neq 0\).
  • p. 61 (typo): Change “of” to “off” to get “read off an estimate”.
  • p. 63 (typesetting): Remove space from “text book” for consistency.
  • p. 63 (typo): Change \(\alpha := \left(\alpha_0, \alpha_1, \alpha_2 \right)\) to \(\alpha := \left(\alpha_0, \alpha_2, \alpha_3 \right)\).
  • p. 64 (typo): In Q1 of the Section 4.1 exercises, \(\alpha\) should be \((\alpha_0, \alpha_2, \alpha_3)\), matching the corrected definition on p. 63. In Q5, industry corresponds to \(x_{i2}\), not \(x_{i3}\).
  • p. 64 (typo): Change “The section provides” to “This section provides”.
  • p. 64 (typo): Replace “either \(X\) and \(Z\), or \(Y\) and \(Z\)” with “\(Z\) with \(X\) or \(Y\)”.
  • p. 66 (typo): Replace “but that we” with “but we”.
  • p. 68 (typesetting): Add comma after “That is” before “regress”.
  • p. 69 (typo): Change “generalization of linear model” to “generalization of a linear model”.
  • p. 70 (typo): In Q2 of the Section 4.3 exercises, the reference should be to Table 4.1 (income regressions), not Table 4.2 (admissions regressions).
  • p. 71 (typesetting): Paragraph at bottom of page should be indented to make it clearer that it’s part of Q2.
  • p. 72 (typesetting): Paragraph below Figure 4.7 should go before it to make it clearer that it’s part of Q3.
  • p. 74 (typo): Word should be “causal” not “casual”.
  • p. 79 (typo): get_hgt_sample” should be get_hgt_sample() to be consistent with other code in the book (i.e., function references always include ()).
  • p. 95 (typo): Remove word “is” before “addresses concerns”.
  • p. 96 (typo): Replace “use” in “We first estimate use nest() …” with word “using”.
  • p. 101 (typo): Replace “cross-section than” with “cross-sectional dependence than”.
  • p. 103 (typo): Replace “paper” with “papers”.
  • p. 105 (typo): References to pg should be to db.
  • p. 105 (typo): Replace “onto” with “on”.
  • p. 120 (typo): In Q5, floor_date("month", date) should be floor_date(date, "month") to match code below.
  • p. 122 (typo): Add the words “is that” after “The basic idea of crsp.ccmxpf_lnkhist”.
  • p. 125 (typo): Remove the unnecessary comma after lead(linkdt) in code counting the number of overlapping rows.
  • p. 125 (typo): In footnote, replace “actually already use” with “actually already used”.
  • p. 131 (typo): Reference to gkvey should be to gvkey.
  • p. 146 (typo): In footnote 9, replace Siccodes12.zip with Siccodes48.zip in the URL for the 48-industry definitions.
  • p. 160 (typesetting): In Q2 amount/amount_left_on_table should be amount / amount_left_on_table to be consistent with other code in the book.
  • p. 177 (typo): In footnote, “backed” should be “backend”.
  • p. 182 (typo): Add the word “for” after “accounting income” to get “accounting income for a period”.
  • p. 184 (typo): Sentence beginning with “Does this also mean …” should end with “?” not “.”.
  • p. 185 (typo): Q5 should end with “?” not “.”.
  • p. 192: Add full stop after crsp.msf (just before assignment to me_values).
  • p. 193 (correction): In the paragraph immediately before plot_data <-, replace “Following Ball and Brown (1968)” with “Following Nichols and Wahlen (2004)”.
  • p. 195 (typo): In Q6, “the function pivot_wider” should be “pivot_wider()” to be consistent with other code in the book (i.e., function references always include ()).
  • p. 197 (typo): Delete the word “the” (fourth word on page).
  • p. 197 (typo): Add word “you” after “Why do” in Q6.
  • p. 203 (typo): The single-event figure plots trading volume. Its caption should be “Trading volume around earnings announcement: Single event,” not “Return volatility around earnings announcement: Single event.”
  • p. 204 (correction): Replace footnote 6 with “The header exchange variable is hexcd. The exchcd variable in crsp.stocknames is historical; the code below uses namedt and nameenddt to identify NYSE membership at the announcement date.”
  • p. 213 (typo): Replace “Inspired by , see 12” with “Inspired by Beaver (1968) (see Chapter 12)”.
  • p. 216 (correction): In the first paragraph, replace “over 2001 and 2002” with “over 2000–2002”, matching the date filter in the code.
  • pp. 217–218 (typo): The two references to “Panel D of Table 1” in the Zhang (2007) illustration should be to “Panel D of Table 2”.
  • p. 221 (correction): Replace “Fedex” with “Toyo Denki Seizo” in the fiscal-year example.
  • p. 225 (typo): Replace year and month with year() and month() respectively to be consistent with the rest of the book.
  • p. 227 (typo): In the sentence beginning “Presumably the idea …”, the second comp.funda should be comp.fundq.
  • p. 245 (typo): In footnote 1, replace “can be tightened and vary by context” with “can be tightened and that varies by context”.
  • p. 246 (typo): Formula for accruals comes from p. 107 of Hribar and Collins (2002), not p. 10.
  • p. 246 (typo): Change \(\Delta \mathit{DEP}\) to \(\mathit{DEP}\).
  • p. 247 (typo): Change “cash flow from operations” to “cash flows from operations” in Q3.
  • p. 253 (correction): Replace the final sentence, beginning “As such, we retain these firms”, with “We retain these firms for now, but create a related indicator variable (finance) that we can use with filter() later on.”
  • p. 255 (typesetting): In the ccm_link pipeline, indent each function call two spaces from the left margin, matching the other pipelines.
  • p. 255 (typo): Replaced “permnos” with “permno values”.
  • p. 257 (typo): Replace the sentence beginning “Some degree of assurance” with “Some degree of assurance is provided by the similarity of the values seen in Table 15.2 to those reported in Sloan (1996).”
  • p. 263 (typo): Change “cash flow from operating” to “cash flows from operating” in Q5.
  • p. 268 (typo): Reference to Q1 in Q3 should be to Q2.
  • p. 268 (typesetting): Word “Hint” is not italicized to match other chapters.
  • p. 269 (typo): Replace ‘just one form a wide class of “discretionary behaviour”’ with ‘just one form in a wide class of “discretionary behaviours”’.
  • p. 277 (typo): References to the variable type in results should be to the variable measure.
  • p. 278 (typo): Replace “earning management” with “earnings management” in table caption.
  • p. 285 (typo): Replace “earning management” with “earnings management”.
  • p. 286 (typesetting): In h_test_5(), replace dim(coefs)[1]==2 with dim(coefs)[1] == 2.
  • p. 295 (typo): Replace “their seriousness” with “the seriousness”.
  • p. 304 (typo): Move comma from after “analysis” to after “above”.
  • p. 307 (correction): Replace the passage from “His data collection involved” through “provided by the Broad Street pump” with “Snow conducted two separate investigations. In South London, he compared households supplied by Lambeth with those supplied by Southwark and Vauxhall; their intermingled customers provided the basis for the natural experiment. In Soho, he traced cases to the Broad Street pump, a local well, and investigated apparent exceptions such as brewery workers who drank beer. The Broad Street pump was not operated by Southwark and Vauxhall. These investigations provided complementary evidence for waterborne transmission.”
  • p. 311 (typo): Add the word “the” before “MSHA website”.
  • p. 315 (typo): Q3 should start with “According to the …” not “According the …”.
  • p. 340 (correction): Replace the sentence beginning “Kothari et al. (2005) also add an intercept term” with “Kothari et al. (2005) also add an intercept term to the Jones Model. To estimate the Modified Jones Model, they use sales changes net of changes in receivables in the industry-year regression (p. 174). In contrast, Fang et al. (2016) estimate discretionary accruals under the Modified Jones Model by applying the coefficients from the Jones Model to the analogous terms of the Modified Jones Model.” In footnote 24, replace “Kothari et al. (2005, p. 1263)” with “Fang et al. (2016, p. 1263)”. In the following paragraph, replace “To calculate performance-matched discretionary accruals, Kothari et al. (2005, p. 1263)” with “To calculate performance-matched discretionary accruals, Fang et al. (2016, p. 1263)”.
  • p. 345 (typo): Replace pm_disc_accruals_sorted with pmdas in the paragraph describing the final data merge.
  • p. 346 (typo): In FHK: Data steps Q7, replace controls_fyear with controls_filled.
  • p. 349 (correction): In FHK: Regression analysis Q6, replace “What is the range of values for year in sho_accruals?” with “What is the range of calendar years in sho_accruals, as derived from datadate?”
  • p. 349 (typesetting): The filter in Q8 should be filter() to be consistent with other code in the book.
  • p. 352 (correction): In both calls to reg_year_fe() in the definition of fms, add controls = TRUE, firm_fe = TRUE, retaining the existing cl_2 argument. This makes the observed models match the stated specification and the randomization draws. The resulting replacement values for Table 19.4 are recorded under Table and numerical updates.
  • p. 353, Section 19.7.1, Q1 (typo): Replace “merged this with reg_data_alt” with “merged it with the observations from sho_accruals to create reg_data_alt”.
  • p. 354, Section 19.7.1, Q2 (correction): In the hint, delete “; modifying the calculation of p_value should suffice” and end “again” with a full stop. The printed code does not define p_value; retain the question and the advice that the randomization need not be run again.
  • p. 359 (correction): In the canonical-diagram paragraph beginning “Our reasoning”, the causal effect is that of \(X\) on \(Y\), not \(Y\) on \(X\).
  • p. 359 (typo): In the draft-lottery paragraph, replace “determinate” with “determine”.
  • p. 361 (typo): In the opening continuation of the projection-matrix paragraph, replace \(P_X^{\mathsf{T}} = P_X\) with \(P_W^{\mathsf{T}} = P_W\).
  • p. 364 (correction): In the last paragraph, replace the clause beginning “where” after the three definitions of instruments with “where \(\eta_1\), \(\eta_2\), and \(\eta_3\) are independent draws from \(N(0,\sigma_\eta^2)\).” On p. 365, replace the malformed text “data setdf‘” with “data set df”.
  • p. 370 (correction): In discussion question 4, cite Ahern and Dittmar (2012), not (2016).
  • p. 372 (correction): In the sentence giving the error distribution after the equation for \(V_{i0}\), replace the normal distribution’s variance \(\sigma_\epsilon\) with \(\sigma_\epsilon^2\). In the paragraph beginning “The code in Listing 20.1”, replace “generating \(\gamma_i\) (gamma)” with “generating \(z_i\) (z)”.
  • p. 373 (typo): Replace “namely means” with “i.e.,”.
  • p. 380 (typo): Replace “perhaps help us” with “perhaps helps us”.
  • p. 380 (typo): In the first paragraph, replace “the remaining $1,250” with “the remaining $1,250 million”.
  • p. 383 (typesetting): Code creating disclosure was indented by four spaces. Should be two spaces.
  • p. 386 (clarification): In the sentence immediately before Table 21.4, insert “the first two columns of” before “Table 21.4”.
  • p. 386 (typo): Replace “year related to adoption” with “year relative to the year of adoption”.
  • p. 386 (correction): Replace “In a typical regression analysis with firm and year fixed effects, omission of controls will often not have a material impact on coefficient estimates” with “Firm fixed effects absorb time-invariant firm characteristics, but omitted time-varying controls can still affect coefficient estimates. State fixed effects can also matter when firms change headquarters state.”
  • pp. 388–389 (typesetting): Footnote on p. 389 about align argument belongs on p. 388.
  • p. 389 (typo): First sentence of Q1 should end with “.” not with “?”.
  • p. 394 (typo): “\(\gamma_2 D_i x_i\)” should be “\(\gamma_1 D_i x_i\)”.
  • p. 394 (correction): In the polynomial-regression equation, replace every occurrence of \(x_i\) with \((x_i-x_0)\), retaining the indicated powers. This makes \(\rho\) the jump at the cutoff. In the paragraph beginning “However”, replace “polynomial-based regressions of the form above” with “high-order, global polynomial regressions”.
  • p. 395 (correction): In the paragraph beginning “Suppose that shifting”, replace “then \(x_0\) is effectively random in that small range” with “then the threshold indicator \(Z_i=1\{x_i\geq x_0\}\) is the instrument, with assignment just above or below the cutoff assumed effectively random”. In the next paragraph, replace the treated-outcome term \(D_i\) with \(\rho\) in both occurrences of \(f(x_0)+D_i+\eta_i\); replace the right- and left-side conditional means with \(f(x_0)+\rho g_1(x_0)\) and \(f(x_0)+\rho g_0(x_0)\), respectively. In the displayed outcome-jump derivation, replace the intermediate equality involving potential outcomes with \(\rho[g_1(x_0)-g_0(x_0)]\), retaining the final result \(\pi\rho\).
  • p. 396 (typo): “In response to such concerns.” should be “In response to such concerns,”.
  • pp. 396–397 (correction): Replace the two sentences beginning “In response to such concerns” and ending “until 2010” with “In response to such concerns, the SEC initially required accelerated filers, generally firms with public float of at least $75 million, to comply with SOX 404 for fiscal years ending on or after 15 November 2004. Non-accelerated filers began management reporting for fiscal years ending on or after 15 December 2007 and were exempted from auditor attestation in 2010.”
  • p. 398 (typo): “Use the firm …” should be “Using the firm …”.
  • p. 398 (clarification): After the sentence ending “classification based solely on the values in publicfloat”, insert “Accelerated-filer status also depended on other eligibility criteria, including eligibility to use small-business reporting forms.”
  • p. 402 (correction): Replace the sentence beginning “The former aligns” with “The former approximates the firm-effects specification in Table 4 of Bloomfield (2021). The latter is an unadjusted contrast between the joint treated/post group and the remaining observations; it is not a complete difference-in-differences specification.” In the next paragraph, replace “confirm the result” with “are qualitatively similar to the result”. Retain footnote 12’s qualification about standard errors.
  • p. 403 (typo): Reference to auopin should be to auopic.
  • p. 403 (typo): Sentence ending with “each” should end with “each side of the cutoff”.
  • p. 404 (typo): In caption for Figure 22.2, add word “indicator” to say “SOX 404 report indicator” to make caption consistent with that for Figure 22.1.
  • p. 409 (typo): “inherently estimated” should be “inherently estimates”.
  • p. 411 (typesetting): Removed extra space in fyr < 11.
  • p. 419 (typo): Denominator in expression at the bottom of the page should be \(x_j\), not \(x_i\).
  • p. 420 (typo): Should be “… density function and the coefficient \(\beta_j\)” (i.e., not \(\beta_i\)).
  • p. 427 (typo): Remove word “below” from “following line of code below”.
  • p. 427 (typo): Replace “you many not need” with “you may not need”.
  • p. 431 (typo): Remove word “named” from sentence ending “above named”.
  • p. 431 (typo): Add word “function” after load_parquet() in footnote 13. Delete word “function” after read_parquet() in the same footnote.
  • p. 433 (typo): “increase from 1994 to 1995” should be “a significant increase from 1994 to 1995”.
  • p. 444 (typo): Replace “filings” with “filing” in “… around 10-K filings dates”.
  • p. 445 (typo): Remove word “use” from “can use collect”.
  • p. 448 (typo): “we saw winsorization in Chapter 25” should refer to Chapters 19 and 22.
  • p. 449: Remove all references to company, which was not used in the code.
  • p. 449 (typo): Remove words “fixed effects and” (code does not include fixed effects).
  • p. 452 (typo): “left half of Table 5 … (i.e., \(\beta_1 = 0\))” should be “left half of Table 5 … (i.e., \(\beta_1 = 0.8\))”.
  • p. 455 (typo): Change “assumed the independent of regressors” to “assumed to be independent of the regressors”.
  • p. 455 (typo): “strikingly difference estimates” should be “strikingly different estimates”.
  • p. 458 (typo): Add word “the” to “claim that Poisson regression”.
  • p. 459 (typo): Add missing left-quote around “misunderstanding” in Q5.
  • p. 459 (typo): “versions of the confounding variable” should be “versions of the dependent variables”.
  • p. 463 (typo): “the impact of” should be “the impacts of”.
  • p. 466 (typo): Delete “different” from “consider different two”.
  • p. 474 (typo): Replace “use matchit() function the” with “use the matchit() function from the”.
  • p. 476 (typo): Delete second of two commas in “as, , respectively”.
  • p. 482 (typo): Delete word “of” after “Equation (1)” in question 2.
  • p. 482: For clarity’s sake, replace “results presented above” in Q1 with “results presented in Table 25.7”.
  • p. 493 (correction): In the paragraph beginning “There are different approaches”, replace “use fiscal 2001 as their validation data set” with “use fiscal 2000 and 2001 as their validation data set”.
  • p. 500 (typo): In the first paragraph under NDCG@k, replace “can only investigate \(k\) frauds” with “can only investigate \(k\) cases”.
  • p. 504 (typesetting): Change auc in Q4 to auc() to be consistent with other code in the book.
  • p. 514 (typo): In Q3 of the Section 26.9 exercises, the AUC of 0.7228 in Panel B of Table 1 of Bao et al. (2022) is for RUSBoost, not the all-features logit model. Q4 correctly reports the all-features logit AUC of 0.6842.
  • p. 519 (typo): In the vector example, “This \(y_i\) is an \(n\)-tuple” should refer to the vector \(y\).
  • p. 519 (correction): In the displayed system of \(n\) equations, add \(\beta_0\) to the right-hand side of every row. Replace the final row with \(y_n=\beta_0+x_{1n}\beta_1+x_{2n}\beta_2+\cdots+x_{kn}\beta_k+\epsilon_n\).
  • p. 521 (typo): In the matrix-multiplication paragraph, replace “Not that” with “Note that” and replace the visible Markdown characters around “conformable” with ordinary bold formatting.
  • p. 521 (correction): In Definition A.2, replace the index ranges with \(i=1,\ldots,n\) and \(j=1,\ldots,m\). In the product-transpose proof, replace “for two square, invertible matrices” with “for conformable matrices” and write the element calculation as \([(AB)^{\mathsf T}]_{ij}=(AB)_{ji}=\sum_{k=1}^{\ell}a_{jk}b_{ki}=\sum_{k=1}^{\ell}(B^{\mathsf T})_{ik}(A^{\mathsf T})_{kj}=(B^{\mathsf T}A^{\mathsf T})_{ij}\), where \(\ell\) is the shared dimension.
  • p. 522 (correction): In Definition A.10, add “with full column rank” after “Given a matrix \(X\)”. In the symmetry proof, delete the repeated second line and write the next line as \(X\left((X^{\mathsf T}X)^{-1}\right)^{\mathsf T}X^{\mathsf T}\).
  • p. 522 (correction): In footnote 1, replace “variance \(\sigma^2 I\)” with “variance \(\sigma^2\)”. The error-vector covariance matrix in the main text remains \(\sigma^2 I\).
  • p. 523 (correction): Replace the displayed unbiasedness derivation with \(\mathbb E[\hat\beta\mid X]=\mathbb E[(X^{\mathsf T}X)^{-1}X^{\mathsf T}(X\beta+\epsilon)\mid X]=\beta+(X^{\mathsf T}X)^{-1}X^{\mathsf T}\mathbb E[\epsilon\mid X]=\beta\). Then add “By iterated expectations, \(\mathbb E[\hat\beta]=\beta\).”
  • p. 525 (typo): In the SQL/dplyr translation table, replace “used-defined” with “user-defined”.
  • p. 529 (correction): Replace “The following code illustrates that the order created above is lost when we merge with crsp.dsi” with “The earlier arrange() call does not modify apple. The following joined query has no ORDER BY clause and therefore does not guarantee row order.”
  • p. 539 (correction): In the first paragraph, replace “stored as integers” with “stored as numeric values; millisecond datetimes require double precision”. In the paragraph beginning “A third approach”, replace the sentence beginning “The parquet format is provided by Apache Arrow” with “Apache Parquet defines the file format. Apache Arrow provides libraries for reading and writing parquet files.”
  • p. 546 (correction): Replace the sentence beginning “After making these two edits” with “After changing listen_addresses, restart PostgreSQL; changing pg_hba.conf normally requires only reloading the configuration.” In the following sentence, replace “how to reboot the server” with “how to restart PostgreSQL”.
  • p. 547 (correction): Replace the final sentence with “PostgreSQL stores a hashed password verifier rather than Gemma’s plaintext password.”
  • p. 562 (correction): Bebchuk, Cohen and Hirst (2017) page range is 89–112.
  • p. 563 (correction): Call, Sharp and Wilde (2019) page range is 35–36.

Code corrections

These entries correct code printed in the hardback. Changes to calculations can also change displayed results.

  • p. 6 (correction): In the literal .Renviron example, use PGPORT = 9737, without the R integer suffix L. The separate Sys.setenv(PGPORT = 9737L) example on p. 5 is valid R.

  • p. 86: In get_means(), calculate the standard error as sd(x) / sqrt(length(x)), not sd(x) / sqrt(length(x) - 1). The sample-variance divisor is already included in sd().

  • p. 132: In the Dell PERMNO exercise, replaced filter(str_detect(comnam, '^DELL ')) with filter(ticker == "DELL") to match the question. The query now returns the two intended PERMNOs, 11081 and 18267.

  • p. 172: In the code creating split_returns, replace by = "permno" with by = c("permno", "exdt") in semi_join() so that eligibility is matched by split event.

  • p. 174: In the code creating nyse_splits_join, insert semi_join(split_sample, by = c("permno", "exdt")) |> between nyse_splits |> and mutate(...) to restrict the final event join to qualifying splits. Both this correction and the one on p. 172 are needed to keep ineligible splits out of the analysis.

  • p. 189: In the code creating full_panel, insert filter(!is.na(ret)) |> before group_by(). The existing filter(n_obs == max(n_obs)) after ungroup() then identifies the full panel using the number of usable monthly returns, excluding firm-years with missing returns in the intended window.

  • p. 191 (omitted code): Immediately after the paragraph beginning “The second set of data”, insert:

    t <- "ME_Breakpoints_CSV.zip"
    url <- str_c("https://mba.tuck.dartmouth.edu",
                 "/pages/faculty/ken.french/ftp/", t)
    if (!file.exists(t)) download.file(url, t, mode = "wb")
    temp <- read_lines(t)
  • p. 240 (correction): In get_deciles(), insert breaks[1] <- -Inf before the existing breaks[length(breaks)] <- Inf. In both calls to cut() in results_deciles, add include.lowest = TRUE. Values outside the previous quarter’s observed range are then assigned to the extreme deciles.

  • p. 249: The expression in the last line of the simulation should be df$se[i] <- df$se[i-1] + df$ni[i] - df$div[i], not df$se[i] <- df$se[i-1] + df$ni[i] - df$ni[i]. Because the dividend payout ratio is 100%, nothing in the book is affected by this issue.

  • pp. 255–257 (correction): In crsp_link and cum_size_rets, calculate start_month as floor_date(datadate, "month") + months(4) and end_month as floor_date(datadate, "month") + months(16). Rounding to the start of the month before adding months avoids missing dates when a fiscal year ends on a day absent from the destination month, such as 31 December plus four months. In the cum_size_rets join, use end_month > month in place of end_month >= month so that the benchmark covers the same twelve months as the stock-return window. These changes restore fiscal year ends previously lost from the linked regression sample and affect the reported regressions and portfolio returns.

  • p. 274 (correction): In test_sample, replace filter(n() >= 11) with filter(n() >= 13). In sample_1_firm_years, insert arrange(fyear) |> filter(row_number() > 2) |> immediately after group_by(gvkey) |>, and replace filter(rand == min(rand), fyear > min(fyear)) with filter(rand == min(rand)). In the preceding paragraph, replace “any year but the first year” with “any eligible year after the first two eligible observations”.

  • p. 275 (correction): In get_nda(), replace str_sub(as.character(sic), 1, 2) with str_pad(as.character(sic %/% 100), width = 2, pad = "0"), and replace group_by(sic2) immediately before calculating acc_ind with group_by(sic2, fyear).

  • pp. 282–283 (correction): In earn_deciles, insert calc_accruals() |> mutate(earn = ib / lag_at) |> immediately after acc_data_raw |>, and delete the later group_by(gvkey) |> arrange(fyear) |> mutate(earn = ib / lag(at)) |> ungroup() |>. Replace the complete sample_2_firm_years assignment with:

    sample_2_firm_years <-
      test_sample |>
      group_by(gvkey) |>
      arrange(fyear, .by_group = TRUE) |>
      mutate(event_ok = row_number() > 2) |>
      ungroup() |>
      inner_join(earn_deciles, by = c("gvkey", "fyear")) |>
      filter(earn_dec == 10, event_ok) |>
      mutate(rand = rnorm(n())) |>
      arrange(rand) |>
      distinct(gvkey, .keep_all = TRUE) |>
      slice_head(n = 1000) |>
      select(gvkey, fyear) |>
      mutate(part = TRUE)
  • p. 285 (correction): In manipulate(), replace lag(part) ~ sale - manip_amt with lag(part) ~ sale - lag(manip_amt). In the margin branch, replace sale - manip_amt_gross with sale - lag(manip_amt_gross) for the lag(part) case. In all four margin-branch conditions, replace ni_ratio > 0 with is.finite(ni_ratio) & ni_ratio > 0.

  • p. 337 (correction): In the code creating spreads, replace between(quarter, "2000-01-01", "2008-01-01") with between(quarter, "2001-01-01", "2008-01-01") to match the sample period stated in the text. The corrected online code and Table 19.2 use this window.

  • pp. 342 and 345 (correction): Replace get_ff_ind(48) with get_ff_ind(49) in both the main ff_data assignment and FHK: Data steps Q1, matching FHK’s supplied replication code. Their paper describes 48 industries; their code uses 49.

  • p. 342 (correction): In get_das(), move filter(lag(at) > 0) |> from immediately before the mutate(lag_fyear = ...) block to immediately after that block, before ungroup() |>. This prevents the filter from changing the rows used to calculate lags.

  • pp. 345 and 349 (replication correction): In both sho_accruals and sho_accruals_alt, delete group_by(fyear) |> immediately before the winsorization mutate() and the following ungroup(). This applies winsorization across sample years, matching FHK’s supplied replication code.

  • p. 346 (replication correction): In reg_year_fe(), replace the two-way clustering formula "~ year + gvkey" with "~ fyear + gvkey". In the feols() call, add ssc = ssc(t.df = "conventional"). Retain year in the fixed-effects formula. These changes use fiscal-year clustering and approximate the degrees-of-freedom convention in FHK’s supplied Stata code.

  • p. 349 (consequential change): After applying the winsorization correction on pp. 345 and 349, replace the final two sentences of Q2 with “The corrected code winsorizes across sample years. How would you modify the code to winsorize within each fiscal year? Does doing so make a difference?”

  • p. 382 (correction): In biggest_customers, insert filter(!is.na(sale), !is.na(salecs), sale > 0) |> before group_by(gvkey, datadate) |>, and replace the final mutate() with summarize(max_customer = max(salecs / sale), .groups = "drop"). This leaves one observation per firm-year for Figure 21.1.

  • p. 397 (typo): In the paragraph immediately below the displayed iliev_2010 data, replace mf with mr.

  • p. 407 (correction): In the intent-to-treat footnote, replace the nonexistent names fuzzy2004 and fuzzy2002 with float2004 and float2002.

  • p. 437 (correction): In vdis_df, replace inner_join(filing_8k, ...) with left_join(filing_8k, ...), retaining the join condition. After the first summarize() and before group_by(acc_num, gvkey, iid), insert mutate(across(starts_with("vdis_"), \(x) coalesce(x, 0L))) |>. Replace filter(vdis_p1y == max(vdis_p1y, na.rm = TRUE)) with window_order(desc(vdis_p1y), cik) |> filter(row_number() == 1L). These edits retain zero-count cases and one CIK per filing/security.

  • p. 445 (typo): In Chapter 23 Exercise 6, replace mfx() with get_mfx(), the name of the supplied marginal-effect helper.

  • pp. 449–450 (correction): In the comp pipeline, move the industry filter filter(!between(sich, 6000, 6999) | is.na(sich)) |> from before the lag calculations to after ungroup() |>. Add lag_fyear = lag(fyear), at the start of the mutate() block that creates big_n. After ungroup() |>, insert filter(lag_fyear == fyear - 1L, !is.na(au)) |> before the final select(). Retain the initial fiscal-year window 1995–2015, which supplies the prior year for 1996.

  • p. 465 (correction): In the first line inside fit_models(), replace lm(cy ~ x1, data = df) with lm(cy ~ x1 + x2 + x3, data = df), so all seven methods use the same three-covariate specification.

  • p. 474 (correction): In the simulation’s matchit() call, add std.caliper = FALSE so that the caliper of 0.03 is a difference in predicted probabilities, following Lawrence et al. The default uses standard-deviation units; this correction changes the matched sample and reported simulation regressions.

  • pp. 477–478 (correction): In comp, move the sample-restriction block beginning filter(!is.na(sich), ...) |>, together with filter(between(fyear, 1988, 2006)) |>, to immediately after ungroup() |>, before collect(). Add !is.na(au) to that sample filter. This preserves raw prior-year observations until after the lag calculations. Before defining sic2, add mutate(sich = as.integer(sich)) |>. Retain filter(lag_fyear == fyear - 1) after calculating lags.

  • p. 478 (correction): In industries, insert filter(if_all(c(ta, inv_avg_at, d_sale_at, ppe_at), is.finite)) |> immediately after comp |>, before counting observations. Add the same finite-value filter when creating reg_data inside get_klw_data(), and insert if (nrow(reg_data) < 10) return(NULL) after that assignment. Before the self-join, replace filter(!is.na(da)) with filter(is.finite(roa), is.finite(da)). After group_by(gvkey, fyear) |>, replace filter(roa_diff == min(roa_diff, na.rm = TRUE)) with arrange(roa_diff, gvkey_match, .by_group = TRUE) |> slice_head(n = 1). This keeps one nearest-ROA match per firm-year.

  • p. 489 (correction): In get_aaers(), delete the min_aaer_date <- assignment and the mutate(aaer_date = coalesce(aaer_date, min_aaer_date)) |> line. Replace mutate(misstate = aaer_date <= test_date) with mutate(misstate = !is.na(aaer_date) & aaer_date <= test_date). Replace the subsequent select(...) |> distinct() with group_by(gvkey, fyear) |> summarize(misstate = any(misstate), .groups = "drop"). Retain misstate_latent = TRUE when requested. A zero as-of label does not establish that no fraud or earlier release existed.

  • p. 506 (correction): In fit_rus_model(), replace the two opening if statements with control_args <- list(); if (!is.null(maxdepth)) control_args$maxdepth <- maxdepth; if (!is.null(minbucket)) control_args$minbucket <- minbucket; control <- do.call(rpart.control, control_args). This initializes control when both arguments are absent and retains both settings when supplied.

Table and numerical updates

These entries describe differences in tables and associated numerical commentary between the published hard-copy edition and the current online edition. Differences can arise from code corrections, revised sample definitions, or changes in underlying data. Page numbers identify the corresponding material in the hard-copy edition.

A comparison of all 90 numbered tables found numerical changes in 45 tables; 38 retain the same displayed numbers, and 7 contain no numerical entries. Digit grouping, signed zero and row order are ignored when the corresponding numbers agree. The complete comparison shows each printed table alongside its current online counterpart, including tables whose numbers agree.

  • p. 338, Table 19.2 (sample-window update): After correcting the sample start date on p. 337, replace the estimates for (Intercept), postTRUE, treatTRUE, and postTRUE × treatTRUE with 2.457, −1.757, 0.465, and −0.317, respectively. Replace their parenthesized standard errors with (0.052), (0.046), (0.077), and (0.069), respectively; retain the three significance stars on each estimate. Replace Num.Obs. of 220,822 with 186,696.

  • p. 339 (numerical commentary update): In the first paragraph, replace the effect −0.343 with −0.317 and the t-statistic −4.96 with −4.62, following the corrected sample start date on p. 337.

  • p. 353, Table 19.4 (specification and presentation update): The current online table reports the two treatment interactions, with estimates, standard errors, and p-values for each inference method, following the replication-code and fixed-effects corrections. As in the hard-copy edition, the RI p-values use t-statistics based on empirical standard errors. The current online values are:

    Term Method Estimate Standard error p-value
    pilotTRUE:duringTRUE CL-i -0.0103 0.0051 0.0449
    pilotTRUE:duringTRUE CL-2 -0.0103 0.0050 0.0398
    pilotTRUE:duringTRUE RI -0.0103 0.0053 0.0507
    pilotTRUE:postTRUE CL-i 0.0059 0.0057 0.2996
    pilotTRUE:postTRUE CL-2 0.0059 0.0055 0.2830
    pilotTRUE:postTRUE RI 0.0059 0.0058 0.3024

Causes and effects on conclusions

A numerical difference does not by itself identify an error or its cause. The audit below distinguishes unchanged calculations on refreshed inputs, calculation corrections, and software or reproducibility effects. When both inputs and code have changed, the total difference is not labelled as a data update.

The printed PDF establishes the hard-copy values and page numbers. Source history establishes changes to the calculation. Controlled comparisons run the printed and corrected calculation on the same current inputs, so their difference isolates that code change in the current environment. They do not recreate the original print-data snapshot. This audit did not recover the original input snapshots and complete software environment used to typeset the hardback, so some residual differences cannot be assigned uniquely to data or software.

The most consequential differences concern the prediction ranking, the significance of the matching estimate without winsorization, and several earnings-management test-size comparisons. The accrual and placebo results change in magnitude but retain their principal qualitative conclusions. These numerical qualifications belong here as differences between editions; they do not imply that every changed table cell is a typographical error in the hardback.

Tables Cause and evidence Effect on interpretation
5.1 Code correction; isolated. On identical saved simulation draws, restoring sd(x)/sqrt(n-1) reproduces all three printed rates (0.0508, 0.0967, 0.1161); sd(x)/sqrt(n) gives the online rates (0.0511, 0.0971, 0.1166). No external data are involved. Source correction. Unchanged: the direct test is close to 5%; the alternative and choice rules over-reject.
6.1 Updated data. The printed and current count queries use the same grouping variables and no date restriction. The underlying Compustat counts have changed. Unchanged: INDL/C/D/STD remains the dominant combination.
7.3, 7.6, 7.7, 7.8, 7.9, 7.10 Updated data. The relevant linking and counting rules agree with the printed code. CRSP/Compustat inputs have changed; formatting changes and an explicit by= argument do not change these rules. Unchanged: most links agree, but neither link dates nor CUSIP links are interchangeable in every case. Table 7.9 now includes two cases with the same PERMNO and different PERMCOs; the prose does not assert that this is impossible.
13.1 Updated data. The Apple regressions retain the same specifications and an open-ended CRSP sample; observations rise from 4,781 to 5,033. The positive event-volume association is smaller (0.060 to 0.036), but remains significant at 1%. The signs and significance of the other displayed slopes are unchanged.
14.2 Updated data. The fiscal-year/date query and both regression formulas are unchanged; the Compustat input has been refreshed. Unchanged: fiscal year is closely related to calendar year and fiscal-end month. This is an illustrative date convention, not a causal estimate.
15.2, 15.3, 15.4, 15.5, 15.6, 15.7, 15.8, 15.9, 15.10, 15.11 Code correction demonstrated; residual input effects unresolved. Running the printed return-window code and corrected code on the same current inputs changes the persistence-regression N from 12,831 to 41,643. The printed table has 12,877. Corrected calendar arithmetic restores month-end observations, and the benchmark window is twelve months. Ordering before ntile() also makes ties reproducible. The residual print-versus-old-code difference cannot be assigned solely to data without the original input snapshot. Source correction. The accrual-persistence and negative accrual-return conclusions remain. Some magnitudes change substantially. In Table 15.10 the cash-flow coefficient gains only 10% significance; the text makes no contrary claim. The accrual hedge return remains positive and significant, with a smaller magnitude.
16.1, 16.2, 16.3 Code corrections plus input/sample changes. Eligibility and event-year selection were corrected to retain enough estimation observations, and the Industry Model now uses industry-year rather than pooled industry medians. The selected firms/years consequently change. A full numerical split from database revisions is unavailable. Source correction. Some test-size inferences change: for Healy neg_p05 the binomial p-value is 0.0817 rather than 0.0071; Healy pos_p05 is 0.9422 rather than 0.0088. Conversely, DeAngelo neg_p01 and pos_p01 now reject correct size at 5% (p-values 0.0020 and 0.0165, both 0.1860 in print). Jones and Modified Jones still over-reject. The chapter now makes clear that missizing differs by model and tail.
19.2 Code correction; sample window. The placebo illustration now starts in Q1 2001, matching the stated period, instead of Q1 2000. This is a deliberate sample restriction, not an extra year of refreshed data. Unchanged: the placebo estimate remains negative and significant; the effect is -0.317 instead of -0.343 and the t-statistic is -4.62 instead of -4.96. The numerical commentary already agrees with the corrected table.
19.3, 19.4 Code/specification corrections plus input changes. The accrual construction and FHK replication specifications were corrected, including firm and calendar-year fixed effects. Table 19.4 now displays the two treatment interactions and uses the printed t-based RI procedure. These changes cannot be reduced to a data refresh. Inference is sensitive to specification and method: during-treatment p-values in Table 19.4 are 0.0449 (firm clustering), 0.0398 (two-way clustering), and 0.0507 (RI). Post-treatment p-values exceed 0.28. A blanket claim of significance across all three methods would be incorrect; the text makes no such claim.
20.1 Simulation/reporting difference; precise cause unresolved. Only the displayed IV R-squared changes (0.035 to 0.034); all printed coefficients, standard errors and significance annotations agree. This is simulated data, so an external database refresh cannot explain it. The original fitted object and software environment have not been reconstructed. Unchanged: the coefficient comparison illustrating OLS and IV is identical. No claim in the text rests on the last displayed R-squared digit.
21.4 Software effect isolated; residual input difference unresolved. On the current input, disabling fixed-effect singleton removal gives 28,707 observations, while the current default gives 28,230 with the same post coefficient. The printed N is 28,745. Singleton removal therefore accounts for 477 observations in this controlled comparison; the remaining 38-observation difference is unresolved. Unchanged at displayed precision: coefficients, standard errors and stars agree with print. N and R-squared differ; the reported association and its limitations are unchanged.
21.5 Input/software effects; exact split unresolved. The displayed event-time coefficients change slightly, while the regression specifications and reference period are retained. Input data, package data and estimation software cannot be separated using the preserved print evidence. The displayed significance annotations are unchanged. The discussion and plot description retain the same qualitative pattern; small coefficient updates do not overturn it.
22.2 Input/software effects; exact split unresolved. The risk-asymmetry regressions retain their formulas. Their inputs include refreshed CRSP/Compustat and corrected package data; fixed-effect sample handling may also differ. The chapter-level Iliev data correction alone does not establish the cause of every changed cell. Unchanged: the firm-effects coefficient remains negative, significant at 1%, and close to Bloomfield’s -0.302. The separate local RDD discussion still finds no significant effect; Table 22.2 is not that local RDD.
23.4, 23.5 Updated data. The filing inventory runs through the available SEC quarters rather than a fixed ending quarter. Additional filings change the counts, form ranking and percentages. Unchanged: form-type counts are descriptive. The 8-K percentage changes slightly and no inference in the text relies on its exact printed value.
23.6 Code corrections plus updated data. A left join retains 10-Ks with no matching 8-K, assigns zero counts, and selects one CIK match deterministically. The SEC/financial-statement inputs have also changed. No original input snapshot is available for a full split. Source correction. Unchanged: filing complexity is positively associated with subsequent 8-K counts in OLS, firm-effects and Poisson specifications, with 1% significance. Magnitudes and sample sizes change.
24.1 Code/sample corrections plus input and numerical effects. Lags are calculated before exclusions, consecutive years and known auditors are required, and the robust fit has an explicit seed. Input revisions and robust-estimator software may also contribute. Source correction. The Big N coefficient remains negative and significant at 1% in the robust specification (-0.008 to -0.010). The lesson about sensitivity to treatment of extreme values remains.
24.8 Code/reproducibility changes; full numerical split unresolved. The unadjusted OLS simulation now includes x2 and x3 as specified in the model, and simulation/robust-fit reproducibility was tightened. The robust row also depends on random draws and numerical fitting. External data are not used in this simulation. Source correction. Unchanged: all approaches over-reject in this setting, and robust regression performs best on test size but remains badly missized (40% at the nominal 5% level, compared with 52% in print).
25.2 Updated data. The auditor market-share sample remains fiscal 2019 with the same sample criteria. A historical Compustat refresh changes one Big Four count in bin (7,8]. Unchanged: Big Four auditors dominate among large firms.
25.4 Updated empirical inputs and simulation ordering. The simulation samples the empirical market-capitalization distribution, which has changed. Deterministic row ordering also affects which observations are drawn under the same seed. This is not a pure external-data-free simulation. Unchanged: the positive Big Four coefficient is spurious because the simulated causal effect is zero and the linear market-capitalization control is misspecified.
25.5, 25.6 Caliper correction isolated; remaining input/order effects. On one fixed current simulated sample, the printed standardized 0.03 caliper yields N=2,298 and Big Four coefficients 0.233 and 0.218; the corrected probability-unit caliper yields N=2,626 and coefficients 0.523 and 0.501. Printed N=2,348, so the total difference also includes unresolved input/order effects. Source correction. Unchanged: matching still leaves a positive, statistically significant Big Four coefficient even though the simulated causal effect is zero. The matched examples and coefficient magnitudes change.
25.7 Code/sample corrections plus input changes. Prior-year observations are retained through lag calculations; industry models require ten finite observations; and ties in ROA matching select one counterpart deterministically. Revised historical data and software can also contribute. Source correction. Material qualification: the untrimmed PSM Big Four estimate changes from -0.007*** to -0.005 without stars; the winsorized PSM estimate remains -0.006***. The chapter now explicitly says the significance conclusion depends on the specification.
26.1, 26.2, 26.3, 26.4 Code/package corrections plus input changes. The farr prediction method applied tree weights to the wrong observations through R vector recycling. Correcting the weighting invalidated saved boosting results and changed tuning choices. As-of fraud labels, test-label joins and cache dependencies were also corrected; refreshed features can contribute. This is not simply updated data. Source correction. Material change: mean test AUC now favours AdaBoost (0.696 versus 0.676), reversing the printed AUC ranking (0.623 versus 0.698). AdaBoost also has higher mean NDCG at 3%; RUSBoost has higher mean NDCG at 1% and 2%. The text already reflects this measure-dependent ranking.
26.5 Label/join corrections plus input changes. The logit exercise shares corrected as-of training labels and a test-label join that gives one binary outcome per firm-year. Its features have also been refreshed. The boosting weight correction does not apply to logit. Source correction. Mean test AUC increases slightly (0.646 to 0.651) and remains below both boosted models. The exercise asks the reader to compare performance rather than asserting a contradictory ranking.

Other numerical updates

The examples below identify changes in the other tables. They are examples rather than a list of every changed cell; each table link opens the complete comparison. The cause assessment and interpretation checks are given above; the complete comparison repeats them beside each changed table.

Printed page Table Quantity Hard-copy edition Current online edition
92 5.1 Rejection rate: prop_sig_diff 0.0508 0.0511
109 6.1 INDL/C/D/STD observations 573,430 599,379
123 7.3 NR links 43,255 46,853
124 7.6 P links 29,689 32,292
126 7.7 GVKEYs with one PERMNO 32,198 34,628
128 7.8 Same PERMNO and PERMCO at both dates 124,673 135,207
132 7.9 Same PERMNO and PERMCO under both links 242,840 255,521
132 7.10 Covered by both link methods 243,131 255,792
214 13.1 Observations in each regression 4,781 5,033
223 14.2 Intercept, column (2) −1.124 −1.059
258 15.2 Mean accruals, decile 1 −0.1751 −0.1688
258 15.3 Observations in each regression 12,877 41,643
259 15.4 Mean industry-level earn coefficient 0.664 0.749
259 15.5 Mean industry-level earn_decile coefficient 0.670 0.755
260 15.6 Observations in each regression 12,877 41,643
260 15.7 Mean industry-level acc coefficient 0.6708 0.7133
261 15.8 Mean industry-level acc_decile coefficient 0.4854 0.5300
261 15.9 Observations in each regression 12,867 41,623
263 15.10 Observations in each regression 13,798 44,488
267 15.11 acc_decile1 coefficient 0.120*** 0.077***
278 16.1 Mean DeAngelo estimate 0.0124 0.0061
279 16.2 Jones neg_p05 rejection rate 0.0860 0.0670
280 16.3 Healy neg_p05 p-value 0.0071 0.0817
347 19.3 Observations, column (4) 19,616 21,804
365 20.1 IV R-squared 0.035 0.034
386 21.4 Observations, column (1) 28,745 28,230
388 21.5 t − 5 coefficient, column (1) −0.005 −0.004
403 22.2 Treatment × post coefficient, column (2) −0.331*** −0.328***
434 23.4 Form 4 filings 8,962,439 9,688,528
435 23.5 Percentage of 8-K variants classified as 8-K 95.852 95.975
444 23.6 ln_grossfilesize coefficient, OLS 1.786*** 1.968***
453 24.1 big_nTRUE coefficient, robust regression −0.008*** −0.010***
467 24.8 Robust-regression p_5 rejection rate 0.52 0.40
470 25.2 Big 4 firms in market-cap bin (7,8] 337 338
473 25.4 big4TRUE coefficient 2.328*** 2.398***
474 25.5 ID of first illustrated matched observation 1896 798
476 25.6 Observations in each matched regression 2,348 2,626
481 25.7 big4TRUE coefficient, PSM −0.007*** −0.005
507 26.1 Best displayed AdaBoost validation AUC 0.646 0.649
509 26.2 Best displayed RUSBoost validation AUC 0.694 0.700
513 26.3 Mean AdaBoost test AUC 0.623 0.696
513 26.4 Mean RUSBoost test AUC 0.698 0.676
514 26.5 Mean logit test AUC 0.646 0.651

Code compatibility and online updates

These entries record optional additions, performance and reproducibility improvements, and adaptations to software or data changes. They are not errors that readers must mark up in the hardback. Page references locate the corresponding printed material.

  • p. 63 (cosmetic): In the second and third income regressions, list industry before intelligence to match the order of \(x_{i2}\) and \(x_{i3}\) in the structural model. This changes the order of displayed coefficients but not the fitted models or estimates.

  • p. 94 (deprecated): Changed code creating bs_coefs to avoid superseded map_df(). Result of code is unchanged and previous code still works.

  • p. 102 (style): Replaced “warrant” with “justify”; the printed wording is valid.

  • p. 127 (typo): Add by = before join_by() in code creating rdq_permnos. Change has no effect, but maintains consistency with other nearby queries.

  • p. 133 (additional exercise): Added a final exercise revisiting the General Motors identifier question already printed in the introductory quiz on p. 118.

  • p. 138 (typo): Remove (unhelpful) hint from Q6.

  • p. 148: Replace http in URLs with https. Use mode = "wb" with download.file().

  • p. 152: Use mode = "wb" with download.file().

  • p. 154: In the footnote URL for Ritter’s IPO data and the url <- assignment constructing the download URL, replace money-left-on-the-table.pdf with money-left-on-the-table-in-IPOs.pdf. The full download URL is now https://site.warrington.ufl.edu/ritter/files/money-left-on-the-table-in-IPOs.pdf.

  • p. 161 (compatibility): Replace download.file(url, ma_sdc_file) with download.file(url, ma_sdc_file, mode = "wb").

  • p. 188 (performance): Code producing rets_all was too slow on WRDS PostgreSQL server. See online book for replacement code. Result of code is unchanged.

  • p. 190: Changes in data on Ken French’s website broke the code here in two places. Code in the online version has been updated. In the first code block on this page, the word Average needed to be added to the the search strings. In the second block of code, the "^Dec " regular expression needed to become "-Dec" in the two places it was used.

  • p. 191: Changes in data on Ken French’s website broke the code in the last code block in two places. First, skip = 1 needs to be skip = 2. Second, for the argument n_max, the - 3 needs to be replaced by - 4. The corrected code can now be found in the online version.

  • p. 216 (additional discussion): Added a footnote distinguishing Zhang (2007)’s sample screens and benchmark from the teaching illustration. This is additional context, not a required correction to the printed calculations.

  • p. 239 (performance): Switched from list_rbind() to bind_rows() in calculation of results. Result of code is unchanged, but it seems that bind_rows() runs more reliably with plan(multisession).

  • p. 240 (compatibility): In the code creating results_deciles, insert filter(lengths(fe1_deciles_lag) > 1, lengths(fe2_deciles_lag) > 1) |> after inner_join(decile_cuts, by = "qtr") |>, before rowwise(). R 4.6.1 changed cut() to reject empty breakpoints (PR 19057), which occur for the first quarter because it has no previous-quarter cutoffs. Earlier R versions returned missing classifications for that quarter, which the existing later filter removed. This change preserves the reported results.

  • p. 254 (reproducibility): Added arrange(gvkey, datadate) after collect() and before the four ntile() calculations in the acc_data pipeline. This gives tied values a consistent row order across database backends while retaining local R missing-value treatment.

  • p. 255 (performance): Added collect() |> copy_inline(db, df = _) at end of pipeline creating crsp_link to address abysmal performance with previous code.

  • p. 268 (typesetting): Added page reference for Green et al. (2011) quotation in Q2. Also added citations in the quote to references list for the book.

  • p. 268 (cosmetic): Split code calculating hedge_ret over two lines so that code does not go outside the box.

  • p. 279 (cosmetic): Replaced h_test() function with clearer code, though code in printed book works fine.

  • p. 286 (typo): Output from the final system_time() call, creating power_plot_data, was omitted. The earlier timing output for manip_df is present.

  • p. 286 (cosmetic): Replaced h_test_5() function with clearer code, though code in printed book works fine.

  • p. 286 (performance): The power calculation now processes one scenario per worker and retains only rejection-rate summaries, rather than retaining all scenarios’ accounting data and fitted models at once. This memory change preserves rejection frequencies for a fixed sample and model specification; the other Chapter 16 corrections also change the sample and Industry Model.

  • p. 330 (performance): Switched from list_rbind() to bind_rows() in calculation of results. Result of code is unchanged, but it seems that bind_rows() runs more reliably with plan(multisession).

  • p. 342 (cosmetic): The use of .groups = "drop" with mutate() has no effect and can be eliminated.

  • p. 342 (deprecated): Replaced case_when() with if/else because drop_extreme is a single logical value selecting between entire vectors. This usage of case_when() in such cases is deprecated in dplyr 1.2.0. The calculated results should not change.

  • p. 343 (enhancement): Order tied performance matches by GVKEY before retaining the first row, making the existing tie rule reproducible across backends.

  • p. 343 (cosmetic): Remove unused das argument from get_pm().

  • pp. 343–344 (deprecated): Replaced the outer case_when() in get_pm() with if/else. The calculated results should not change (see discussion above for p. 342).

  • p. 343 (deprecated): Replaced group_by() |> do() with nest_by() |> summarize().

  • p. 346 (cosmetic): Wrapped feols() in the reg_year_fe() function inside suppressWarnings() to suppress warnings emitted by cov().

  • p. 349 (cosmetic): Replace winsorize, prob = 0.01 with \(x) winsorize(x, prob = 0.01).

  • p. 349 (enhancement): Add a regression exercise comparing the explicit ssc(t.df = "conventional") setting with the default, including its effect on coefficients, standard errors and p-values.

  • p. 352 (typesetting): Added explanatory sentence: “An alternative approach uses future_map() from furrr to run a variant of this code in parallel.”

  • p. 352 (performance): Switched from list_rbind() to bind_rows() in calculation of rand_results. Result of code is unchanged, but it seems that bind_rows() runs more reliably with plan(multisession).

  • p. 354, Figure 19.4 (online accessibility): Correct the HTML alternative text to describe performance, sales growth, and PP&E as other causes of accruals, with no connection to Reg SHO in the displayed graph. The printed diagram is unchanged.

  • p. 366 (reproducibility): Give the 1,000-run IV simulation its own seed, so its random draws do not depend on which preceding chunks execute or load from cache. This changes the realized simulation draws without changing the model or estimand.

  • p. 375 (reproducibility): Add set.seed(2022) before the 1,000-run simulation creating sim_results, so its realized draws do not depend on earlier execution choices. This changes the realized draws without changing the model or estimand.

  • p. 376 (reproducibility): Add set.seed(2023) before the 1,000-run simulation creating sim_results_wide, so its realized draws do not depend on earlier execution choices. This changes the realized draws without changing the model or estimand.

  • p. 377 (reproducibility): Add set.seed(2024) before the 1,000-run simulation creating sim_results_rand, so its realized draws do not depend on earlier execution choices. This changes the realized draws without changing the model or estimand.

  • p. 387 (enhancement): Changed factor_t() and year_diff() functions to add a ref argument. These changes have no effect on any analysis in the book, but facilitate answering questions in exercises. In the factor_t() footnote example, explicitly supply ref = -1 to retain the original reference under the updated function’s default.

  • pp. 388–389 (compatibility): Filter infinite event-time coefficient labels before converting the remaining labels to integers in plot_coefs().

  • p. 398 (cosmetic): The use of .groups = "drop" with mutate() has no effect and can be eliminated.

  • p. 398 (deprecated): As top_n() is deprecated, replace with slice_max().

  • p. 403 (reproducibility): Order the post-policy sample by PERMCO and fiscal-year-end date before the RD calculations, so automatic plotting bins for tied public floats do not depend on database row order.

  • p. 420 (deprecated): Replaced case_when() with if/else if/else. The calculated results should not change (see discussion above for p. 342).

  • p. 421 (deprecated): Replaced case_when() with if/else if/else. The calculated results should not change (see discussion above for p. 342).

  • p. 430: Changes to numbers: (63, 74) becomes (63, 77); (75, 86) becomes (78, 89); (87, 98) becomes (90, 101); (99, 150) becomes (102, NA).

  • p. 432: Changes to numbers: (63, 74) becomes (63, 77); (75, 86) becomes (78, 89); (87, 98) becomes (90, 101); (99, 150) becomes (102, NA).

  • p. 441 (reproducibility): Order equal complexity values by filing/security identifiers before splitting them into quintiles. This retains the rank-bucket definition while making tie assignments independent of database row order.

  • p. 442 (reproducibility): Order equal spread and illiquidity values by filing/security identifiers before splitting them into deciles. This retains the rank-bucket definitions while making tie assignments independent of database row order.

  • p. 450 (cosmetic): In first code chunk, big_n appears twice in select(). Delete second appearance.

  • p. 465 (deprecated): Replaced case_when() with if/else if/else. The calculated results should not change (see discussion above for p. 342).

  • p. 545 (enhancement): Use SCRAM authentication with a rule restricted to the intended database, user and client addresses, and reset existing MD5 password verifiers before requiring SCRAM. For remote access, use a VPN or configure TLS and address restrictions.

  • pp. 552–560 (deprecated): Updated to incorporate new db2pq R package. The larger-file example downloads crsp.dsf, and the library-building instructions consistently use the R-based approach and script.

  • p. 555 (enhancement): Altered code to handle missing values in a way that matches code in the panel-data chapter.

  • p. 559 (typesetting): Replace the two-line comment beginning with # The segment data with # compseg. The WRDS database changed since that comment was written and the comment is obsolete.

  • multiple pages (typesetting): Made spelling of “cutoff” consistent (no longer a mix of “cutoffs” and “cut-offs”).

  • Chapter 26 (package correction): Correct the tree weights in the farr RUSBoost prediction method (type = "prob"). R vector recycling applied weights to the wrong observations rather than to the corresponding trees. The online AdaBoost and RUSBoost tuning, AUC and NDCG results have been recomputed using the corrected function.