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 totest_scoresshould be tocamp_scores. - p. 54 (typo): In the first full paragraph, the two references to
sizeshould be tocfoto match the code below. - p. 55 (typo): Replace
sizewithcfoin “there is no visually discernible relation betweensize…”. - 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,
industrycorresponds 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 beget_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
pgshould be todb. - p. 105 (typo): Replace “onto” with “on”.
- p. 120 (typo): In Q5,
floor_date("month", date)should befloor_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
gkveyshould be togvkey. - p. 146 (typo): In footnote 9, replace
Siccodes12.zipwithSiccodes48.zipin the URL for the 48-industry definitions. - p. 160 (typesetting): In Q2
amount/amount_left_on_tableshould beamount / amount_left_on_tableto 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 tome_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. Theexchcdvariable incrsp.stocknamesis historical; the code below usesnamedtandnameenddtto 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
yearandmonthwithyear()andmonth()respectively to be consistent with the rest of the book. - p. 227 (typo): In the sentence beginning “Presumably the idea …”, the second
comp.fundashould becomp.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 withfilter()later on.” - p. 255 (typesetting): In the
ccm_linkpipeline, indent each function call two spaces from the left margin, matching the other pipelines. - p. 255 (typo): Replaced “
permnos” with “permnovalues”. - 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
typeinresultsshould be to the variablemeasure. - 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(), replacedim(coefs)[1]==2withdim(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_sortedwithpmdasin the paragraph describing the final data merge. - p. 346 (typo): In FHK: Data steps Q7, replace
controls_fyearwithcontrols_filled. - p. 349 (correction): In FHK: Regression analysis Q6, replace “What is the range of values for
yearinsho_accruals?” with “What is the range of calendar years insho_accruals, as derived fromdatadate?” - p. 349 (typesetting): The
filterin Q8 should befilter()to be consistent with other code in the book. - p. 352 (correction): In both calls to
reg_year_fe()in the definition offms, addcontrols = TRUE, firm_fe = TRUE, retaining the existingcl_2argument. 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 fromsho_accrualsto createreg_data_alt”. - p. 354, Section 19.7.1, Q2 (correction): In the hint, delete “; modifying the calculation of
p_valueshould suffice” and end “again” with a full stop. The printed code does not definep_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
disclosurewas 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
alignargument 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
auopinshould be toauopic. - 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” afterread_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 thematchit()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
aucin Q4 toauc()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 earlierarrange()call does not modifyapple. The following joined query has noORDER BYclause 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; changingpg_hba.confnormally 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
.Renvironexample, usePGPORT = 9737, without the R integer suffixL. The separateSys.setenv(PGPORT = 9737L)example on p. 5 is valid R.p. 86: In
get_means(), calculate the standard error assd(x) / sqrt(length(x)), notsd(x) / sqrt(length(x) - 1). The sample-variance divisor is already included insd().p. 132: In the Dell PERMNO exercise, replaced
filter(str_detect(comnam, '^DELL '))withfilter(ticker == "DELL")to match the question. The query now returns the two intended PERMNOs,11081and18267.p. 172: In the code creating
split_returns, replaceby = "permno"withby = c("permno", "exdt")insemi_join()so that eligibility is matched by split event.p. 174: In the code creating
nyse_splits_join, insertsemi_join(split_sample, by = c("permno", "exdt")) |>betweennyse_splits |>andmutate(...)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, insertfilter(!is.na(ret)) |>beforegroup_by(). The existingfilter(n_obs == max(n_obs))afterungroup()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(), insertbreaks[1] <- -Infbefore the existingbreaks[length(breaks)] <- Inf. In both calls tocut()inresults_deciles, addinclude.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], notdf$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_linkandcum_size_rets, calculatestart_monthasfloor_date(datadate, "month") + months(4)andend_monthasfloor_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 thecum_size_retsjoin, useend_month > monthin place ofend_month >= monthso 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, replacefilter(n() >= 11)withfilter(n() >= 13). Insample_1_firm_years, insertarrange(fyear) |> filter(row_number() > 2) |>immediately aftergroup_by(gvkey) |>, and replacefilter(rand == min(rand), fyear > min(fyear))withfilter(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(), replacestr_sub(as.character(sic), 1, 2)withstr_pad(as.character(sic %/% 100), width = 2, pad = "0"), and replacegroup_by(sic2)immediately before calculatingacc_indwithgroup_by(sic2, fyear).pp. 282–283 (correction): In
earn_deciles, insertcalc_accruals() |> mutate(earn = ib / lag_at) |>immediately afteracc_data_raw |>, and delete the latergroup_by(gvkey) |> arrange(fyear) |> mutate(earn = ib / lag(at)) |> ungroup() |>. Replace the completesample_2_firm_yearsassignment 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(), replacelag(part) ~ sale - manip_amtwithlag(part) ~ sale - lag(manip_amt). In the margin branch, replacesale - manip_amt_grosswithsale - lag(manip_amt_gross)for thelag(part)case. In all four margin-branch conditions, replaceni_ratio > 0withis.finite(ni_ratio) & ni_ratio > 0.p. 337 (correction): In the code creating
spreads, replacebetween(quarter, "2000-01-01", "2008-01-01")withbetween(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)withget_ff_ind(49)in both the mainff_dataassignment 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(), movefilter(lag(at) > 0) |>from immediately before themutate(lag_fyear = ...)block to immediately after that block, beforeungroup() |>. This prevents the filter from changing the rows used to calculate lags.pp. 345 and 349 (replication correction): In both
sho_accrualsandsho_accruals_alt, deletegroup_by(fyear) |>immediately before the winsorizationmutate()and the followingungroup(). 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 thefeols()call, addssc = ssc(t.df = "conventional"). Retainyearin 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, insertfilter(!is.na(sale), !is.na(salecs), sale > 0) |>beforegroup_by(gvkey, datadate) |>, and replace the finalmutate()withsummarize(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_2010data, replacemfwithmr.p. 407 (correction): In the intent-to-treat footnote, replace the nonexistent names
fuzzy2004andfuzzy2002withfloat2004andfloat2002.p. 437 (correction): In
vdis_df, replaceinner_join(filing_8k, ...)withleft_join(filing_8k, ...), retaining the join condition. After the firstsummarize()and beforegroup_by(acc_num, gvkey, iid), insertmutate(across(starts_with("vdis_"), \(x) coalesce(x, 0L))) |>. Replacefilter(vdis_p1y == max(vdis_p1y, na.rm = TRUE))withwindow_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()withget_mfx(), the name of the supplied marginal-effect helper.pp. 449–450 (correction): In the
comppipeline, move the industry filterfilter(!between(sich, 6000, 6999) | is.na(sich)) |>from before the lag calculations to afterungroup() |>. Addlag_fyear = lag(fyear),at the start of themutate()block that createsbig_n. Afterungroup() |>, insertfilter(lag_fyear == fyear - 1L, !is.na(au)) |>before the finalselect(). 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(), replacelm(cy ~ x1, data = df)withlm(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, addstd.caliper = FALSEso 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 beginningfilter(!is.na(sich), ...) |>, together withfilter(between(fyear, 1988, 2006)) |>, to immediately afterungroup() |>, beforecollect(). Add!is.na(au)to that sample filter. This preserves raw prior-year observations until after the lag calculations. Before definingsic2, addmutate(sich = as.integer(sich)) |>. Retainfilter(lag_fyear == fyear - 1)after calculating lags.p. 478 (correction): In
industries, insertfilter(if_all(c(ta, inv_avg_at, d_sale_at, ppe_at), is.finite)) |>immediately aftercomp |>, before counting observations. Add the same finite-value filter when creatingreg_datainsideget_klw_data(), and insertif (nrow(reg_data) < 10) return(NULL)after that assignment. Before the self-join, replacefilter(!is.na(da))withfilter(is.finite(roa), is.finite(da)). Aftergroup_by(gvkey, fyear) |>, replacefilter(roa_diff == min(roa_diff, na.rm = TRUE))witharrange(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 themin_aaer_date <-assignment and themutate(aaer_date = coalesce(aaer_date, min_aaer_date)) |>line. Replacemutate(misstate = aaer_date <= test_date)withmutate(misstate = !is.na(aaer_date) & aaer_date <= test_date). Replace the subsequentselect(...) |> distinct()withgroup_by(gvkey, fyear) |> summarize(misstate = any(misstate), .groups = "drop"). Retainmisstate_latent = TRUEwhen 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 openingifstatements withcontrol_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 initializescontrolwhen 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, andpostTRUE × treatTRUEwith2.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. ReplaceNum.Obs.of220,822with186,696.p. 339 (numerical commentary update): In the first paragraph, replace the effect
−0.343with−0.317and the t-statistic−4.96with−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:duringTRUECL-i -0.0103 0.0051 0.0449 pilotTRUE:duringTRUECL-2 -0.0103 0.0050 0.0398 pilotTRUE:duringTRUERI -0.0103 0.0053 0.0507 pilotTRUE:postTRUECL-i 0.0059 0.0057 0.2996 pilotTRUE:postTRUECL-2 0.0059 0.0055 0.2830 pilotTRUE:postTRUERI 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
industrybeforeintelligenceto 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_coefsto avoid supersededmap_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 =beforejoin_by()in code creatingrdq_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
httpin URLs withhttps. Usemode = "wb"withdownload.file().p. 152: Use
mode = "wb"withdownload.file().p. 154: In the footnote URL for Ritter’s IPO data and the
url <-assignment constructing the download URL, replacemoney-left-on-the-table.pdfwithmoney-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)withdownload.file(url, ma_sdc_file, mode = "wb").p. 188 (performance): Code producing
rets_allwas 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
Averageneeded 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 = 1needs to beskip = 2. Second, for the argumentn_max, the- 3needs 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()tobind_rows()in calculation ofresults. Result of code is unchanged, but it seems thatbind_rows()runs more reliably withplan(multisession).p. 240 (compatibility): In the code creating
results_deciles, insertfilter(lengths(fe1_deciles_lag) > 1, lengths(fe2_deciles_lag) > 1) |>afterinner_join(decile_cuts, by = "qtr") |>, beforerowwise(). R 4.6.1 changedcut()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)aftercollect()and before the fourntile()calculations in theacc_datapipeline. 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 creatingcrsp_linkto 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_retover 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, creatingpower_plot_data, was omitted. The earlier timing output formanip_dfis 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()tobind_rows()in calculation ofresults. Result of code is unchanged, but it seems thatbind_rows()runs more reliably withplan(multisession).p. 342 (cosmetic): The use of
.groups = "drop"withmutate()has no effect and can be eliminated.p. 342 (deprecated): Replaced
case_when()withif/elsebecausedrop_extremeis a single logical value selecting between entire vectors. This usage ofcase_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
dasargument fromget_pm().pp. 343–344 (deprecated): Replaced the outer
case_when()inget_pm()withif/else. The calculated results should not change (see discussion above for p. 342).p. 343 (deprecated): Replaced
group_by() |> do()withnest_by() |> summarize().p. 346 (cosmetic): Wrapped
feols()in thereg_year_fe()function insidesuppressWarnings()to suppress warnings emitted bycov().p. 349 (cosmetic): Replace
winsorize, prob = 0.01with\(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()fromfurrrto run a variant of this code in parallel.”p. 352 (performance): Switched from
list_rbind()tobind_rows()in calculation ofrand_results. Result of code is unchanged, but it seems thatbind_rows()runs more reliably withplan(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 creatingsim_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 creatingsim_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 creatingsim_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()andyear_diff()functions to add arefargument. These changes have no effect on any analysis in the book, but facilitate answering questions in exercises. In thefactor_t()footnote example, explicitly supplyref = -1to 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"withmutate()has no effect and can be eliminated.p. 398 (deprecated): As
top_n()is deprecated, replace withslice_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()withif/else if/else. The calculated results should not change (see discussion above for p. 342).p. 421 (deprecated): Replaced
case_when()withif/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_nappears twice inselect(). Delete second appearance.p. 465 (deprecated): Replaced
case_when()withif/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
db2pqR package. The larger-file example downloadscrsp.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 datawith# 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
farrRUSBoost 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.