reviser 0.3.0
Breaking changes
- The two fitted-model classes now inherit from a common parent class,
revision_model, and the two vintages classes from a common parent class,tbl_vintage. A fitted model therefore carries the class attributec("kk_model", "revision_model", "list")and a vintages objectc("tbl_pubdate", "tbl_vintage", "tbl_df", "tbl", "data.frame"). Ordinary use is unaffected: objects built by the package’s own functions gain the parent class automatically, and the generics dispatch as before. Two situations do change.- Code that replaced the class attribute wholesale, as in
class(x) <- c("tbl_release", "tbl_df", "tbl", "data.frame"), must now include the parent class as well.validate_vintages()reports objects that do not. Code that prepended to the existing attribute, as inclass(x) <- c("tbl_release", class(x)), keeps the parent class and is unaffected. - Objects serialized with an earlier version no longer dispatch to the print, summary, plot or extractor methods, because their stored class attribute predates the parent class. Re-create them, or add the parent class (
tbl_vintage, andrevision_modelfor fitted models) to the stored object.
- Code that replaced the class attribute wholesale, as in
- The pillar header printed for a long-format
tbl_pubdatechanged: it now reports the number of distinct dates rather than the number of rows (see below), and gained theFormatrow thattbl_releasealready showed. - The bundled
gdpdata set is now itself a vintages object, with class attributec("tbl_pubdate", "tbl_vintage", "tbl_df", "tbl", "data.frame").print(),summary(),plot()andvalidate_vintages()therefore work on it as loaded, rather than only after a release-extraction step. The data are unchanged; what changes is that printinggdpnow shows the vintages header instead of the plain tibble header. -
vintages_long()no longer warns when it is handed long data that carry no vintages class. Attaching the class is real work there, and it is the documented way to recover the class after an operation that dropped it, so the warning made the recommended idiom noisy. Long input that is already a vintages object still warns, because the call is then a no-op.
Bug fixes
- The pillar header shown when printing a long-format
tbl_pubdatereported the number of rows as the number of time periods, which overstates it once a series has more than one vintage. It now counts distinct dates, matchingtbl_releaseand thesummary()method. -
summary()on a vintages object whose columns no longer match either documented layout – for example afterdplyr::select()droppedvalueor the vintage key, which leaves the class attribute in place – failed insideas.Date()with “character string is not in a standard unambiguous format”. It now reports what the object is missing and points to?validate_vintages.print()on such an object falls back to the plain tibble header instead of failing, so it can still be inspected. - Standard errors requested with
se_method = "qml"inkk_nowcast()inverted the Hessian with a generalsolve()and, on failure, silently applied a ridge. This path now uses the same Cholesky-basedinvert_hessian()helper as the other standard-error methods, so a Hessian that is not positive definite is reported rather than masked. Estimates are unchanged; standard errors change only where the previous ridge was silently applied. - Several validation messages contained hard-wrapped newlines and source indentation, which appeared verbatim in the console. They are now single lines.
-
plot()on a model fitted withreturn_states = FALSEfailed with the base error “argument is of length zero”, because it read the droppedstatescomponent without checking for it. It now reports the cause in the same words asstates(),fitted(),residuals()andpredict(), all of which now share a single definition of that message. -
validate_vintages()misdiagnosed a vintages object that had lost a long-layout column: because the layout was inferred from the column names alone, an object missingvaluewas reported as a wide object whose column names were “not labeled correctly”. It now reports what the object is actually missing, matching the messagesummary()gives for the same object. Objects whose class attribute contradicts their columns are still reported as the class mismatch they are. -
predict()on a model fitted withh = 0returned a zero-row tibble with no explanation. It now says which argument decides that. - The Kalman filter’s stationary initial-state covariance in
jvn_nowcast()fell back to a ridge-regularized solve near a non-stationary boundary without reporting it, unlike the parameter-covariance fallback added earlier in this version. The converged estimate’s fitted object now carries ap0_regularizedflag, whichsummary()reports whenTRUE. Trial parameter vectors evaluated during optimization are unaffected and still regularize silently, since a momentarily non-stationary trial point is expected there and reporting it would be noise, not diagnosis.
New features
- The standard extractor methods on fitted models –
coef(),vcov(),logLik(),nobs(),fitted(),residuals()andpredict()– together withstates(),print(),summary()andplot(), are now defined once forrevision_modeland inherited bykk_modelandjvn_model, instead of being registered separately for each. The same applies toprint(),summary(),plot()andpillar::tbl_sum()ontbl_vintage. See?revision_modeland?tbl_vintagefor the class contracts and the extension points a new model family or vintages representation must supply.
Documentation
- Help page titles now use a consistent title-case style throughout the package.
- The Kishor-Koenig and Jacobs-Van Norden vignettes now reach fitted models through the extractor generics –
coef(),logLik(),AIC(),BIC(),nobs()andstates()– rather than indexing intofit$paramsandfit$states. -
?reviser-vintages-classesand?tbl_vintageno longer restate the same material: the former documents the data contract andvalidate_vintages(), the latter the class hierarchy and the methods the parent provides. -
inst/CITATIONreports the current version and title. - The
?kk_nowcastexample reached into the fitted object withresult$params. It now usescoef()andlogLik(), matching the vignettes and the rest of the documentation. -
?validate_vintagesgains an “Operations that drop the class” section, which namestidyr::drop_na()as the case most likely to be met in a vintages workflow and gives the idiom for recovering the class.
Internal
- The shared behavior of the two model families, and of the two vintages representations, is now expressed through S3 inheritance rather than through per-class methods forwarding to common helper functions. The model families differ only in
model_family(),spec_lines(),signal_state(),target_column()anddefault_plot_state(); the vintages representations only invintage_labels(),vintage_value_cols()andvintage_detail(). These are also the methods a new family or representation has to supply. Estimates, plots and printed output forkk_model,jvn_modelandtbl_releaseobjects are unchanged. - Test coverage of the multi-series (
id-aware) code paths inrevisions.R, and of therevision_summaryprint and diagnose branches, has been substantially extended. Every method that depends on the state estimates is now tested to reportreturn_states = FALSEas the cause. - Comments in
jvn.Rno longer contain non-ASCII typographic quotes. - The stationary initial-state covariance in
jvn_nowcast()is now obtained by diagonalizing the transition matrix and solving the resulting Lyapunov equation elementwise in the eigenbasis, rather than by forming and solving the densem^2 x m^2linear systemvec(P) = (I - T %x% T)^{-1} vec(S). This is cheaper (O(m^3)versusO(m^6)) and exploits the same transition-matrix structure – an AR companion block plus diagonal news/noise blocks – that motivated the earlier Cholesky andtcrossprod()changes in this version. The dense solve remains as a fallback for the rare case of a non-diagonalizable transition matrix. Estimates are unchanged.
reviser 0.2.0
CRAN release: 2026-08-22
Bug fixes
-
summary()on a long-formattbl_pubdateno longer fails with “character string is not in a standard unambiguous format”. The method assumed a wide layout and treated thepub_dateandvaluecolumn names as publication dates, so it failed on everyget_revisions()result. The reported number of time periods and vintages was also wrong for long input. -
print()andsummary()on akk_modelnow report which specification was estimated.model = "Howrey"andmodel = "Classical"previously produced identical headers, because the fitted object never recorded themodelargument.jvn_modelobjects likewise report whether news, noise or both were estimated.
New features
-
kk_modelandjvn_modelobjects gain the standard extractor methods:coef(),vcov(),logLik(),nobs(),fitted(),residuals()andpredict().AIC()andBIC()therefore work, and reproduce the values shown bysummary(). - New
states()generic to access the estimated state paths of a fitted revision model, replacing direct use offit$states. - New
validate_vintages()checks atbl_pubdateortbl_releaseobject against the documented class contract. See?"reviser-vintages-classes"for the contract itself.
Internal
- Covariance matrices are obtained through a Cholesky factorization, which exploits the symmetry of the Hessian and reports when it is not positive definite instead of silently applying a ridge. Delta-method transformations exploit the diagonal structure of the Jacobian, and the Kalman recursions use
tcrossprod(). Estimates are unchanged.
reviser 0.1.1
CRAN release: 2026-03-31
- Updated repository, issue tracker, and documentation links to the rOpenSci organization and docs site.
- Updated package documentation and README badges to use rOpenSci URLs.
- Added rOpenSci R-universe installation instructions to the README.
- Removed the package-specific code of conduct file in favor of the rOpenSci project-wide code of conduct.
- Disabled automatic pkgdown deployment to GitHub Pages and replaced the legacy website with a redirect page.
reviser 0.1.0
CRAN release: 2026-03-29
- Initial CRAN release.
- Added Jacobs-Van Norden nowcasting support via
jvn_nowcast(). - Improved estimation methods and solver behavior in
kk_nowcast(). - Expanded examples, tests, and documentation.
