code
At the moment, I primarily develop R packages to support research projects – you can read a little bit about my goals for these packages in what i want from academic code. In brief: I am committed to maintaining and explaining my research code to the extent that it assists others in their own academic research, but I’m not writing research code with the goal of it ending up in production.
Independently from my research, I have been involved in a number of open source projects in the tidyverse and tidymodels orbits. I previously maintained the broom package, and am responsible for the 0.5.0 release and a portion of the 0.7.0 release. For these contributions I was generously given authorship on Wickham et al. (2019).
I review for the R Journal and the Journal of Open Source Software.
You can find all my code on my GitHub. Please report bugs and let me know if things break!
recent news
2026-04-16:
vsp 0.1.4is on CRAN. This update adds several heuristic localization metrics useful for investigating the quality of estimated embeddings.2026-04-15:
spectralard 0.0.0.9000is on GitHub. This in-development package implements estimators for random dot product graphs from Aggregated Relational Data.
design of statistical software
I was previously quite interested in the design of statistical software and contributed to rOpenSci’s statistical software reviewing guidelines, as well as early versions of the tidymodels implementation principles. I have some long form explorations of modeling software design on my blog:
research software (in development)
spectralardestimates random dot product graphs from Aggregated Relational Data. Functional but lacking documentation.latentnetmediateestimates natural direct and indirect effects in social network data, using the methods developed in Hayes et al. (2025). Methods have been implemented but are not yet documented.
Both of these packages need a small push to land on CRAN. Getting either of these out the door would be a very reasonable undergraduate project.
research software (released)
fastRGsamples large, sparse random dot product graphs very efficiently and is especially useful when running simulation studies for spectral network estimators. I am committed to maintenance of this package and will respond quickly to feature requests or questions about how you might use it in your own research. ThefastRGsampling algorithm is described in Rohe et al. (2018).vspperforms semi-parametric estimation of latent factors in random dot product graphs by computing varimax rotations of the spectral embeddings of graphs. The resulting factors are sparse and interpretable. The theory work on this was done by Rohe and Zeng (2023), and then I ended up using varimax rotation a lot in my own data analysis and wrapped some of the infrastructure I developed into this package. I am committed to maintenance of this package and will respond quickly to feature requests or questions about how you might use it in your own research.fastadiis a proof-of-concept implementation ofAdaptiveImpute, a self-tuning matrix completion method with adaptive thresholding that is closely related tosoftImpute(Cho et al. 2019, 2018). I extendedAdaptiveImputeto the computationally challenging case where the entire upper triangle is observed as part of my work with Karl Rohe on citation networks. This is research code rather than code intended for broad consumption. I make no commitments to maintaining or improving this code unless something about it is blocking an ongoing research project.gdimestimates graph dimension using cross-validated eigenvalues, which determines the number of communities in stochastic blockmodels and variants. The method is described in Chen et al. (2021).aPPRapproximates Personalized PageRanks in large graphs, including those that can only be queried via an API.aPPRadditionally performs degree correction and regularization, allowing users to recover blocks from stochastic blockmodels (see Chen et al. 2020). Note that the Twitter workflow is defunct:aPPRwas originally designed to be used together with theneocachebackend to sample large portions of the Twitter following graph with high Personalized PageRanks around seed nodes (joint work with Nathan Kolbow), but I am no longer maintainingneocacheand cannot commit any development time to keeping up with the Twitter API shenanigans. slides
open source work
broomconverts statistical objects into tidy tibbles, putting hundreds of types of statistical estimates into a consistent format to make programming easier.broomis part of the tidyverse; as mentioned above, I no longer maintain the package.distributions3provides an S3 interface to distribution functions, with an emphasis on good documentation and beginner friendly design. The vignettes in particular are designed to walk students in intro stat courses through a litany of classic hypothesis tests. Achim Zeileis now maintains the package.