diff --git a/.Rbuildignore b/.Rbuildignore index 5a5b8b3..0434259 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -6,4 +6,4 @@ ^figs$ ^\.github$ ^docs$ -^JOSS$ +^paper$ diff --git a/paper/apa.csl b/paper/apa.csl new file mode 100644 index 0000000..32be69e --- /dev/null +++ b/paper/apa.csl @@ -0,0 +1,443 @@ + + diff --git a/paper/columns.tex b/paper/columns.tex new file mode 100644 index 0000000..f47d1b1 --- /dev/null +++ b/paper/columns.tex @@ -0,0 +1,17 @@ +\newenvironment{cols}[1][]{}{} + +\newenvironment{col}[1]{\begin{minipage}{#1}\ignorespaces}{% +\end{minipage} +\ifhmode\unskip\fi +\aftergroup\useignorespacesandallpars} + +\def\useignorespacesandallpars#1\ignorespaces\fi{% +#1\fi\ignorespacesandallpars} + +\makeatletter +\def\ignorespacesandallpars{% + \@ifnextchar\par + {\expandafter\ignorespacesandallpars\@gobble}% + {}% +} +\makeatother \ No newline at end of file diff --git a/paper/paper.Rmd b/paper/paper.Rmd new file mode 100644 index 0000000..8ef7eaa --- /dev/null +++ b/paper/paper.Rmd @@ -0,0 +1,111 @@ +--- +title: 'gglm: An R package implementing the grammar of graphics for linear model diagnostic plots' +tags: + - R + - linear models + - diagnostic plots + - grammar of graphics + - ggplot2 +authors: + - name: Grayson W. White + orcid: 0000-0003-4993-2792 + affiliation: 1 +affiliations: + - name: Michigan State University, Department of Forestry + index: 1 +date: 15 January 2024 +bibliography: paper.bib +citation_author: White +year: 2024 +output: + rticles::joss_article: + keep_tex: true + includes: + in_header: columns.tex +csl: apa.csl +journal: JOSS +--- + +# Summary + +`gglm` implements an interface to produce publication-ready model diagnostic +plots that complies with the grammar of graphics [@wickham2010]. Further, `gglm` +utilizes the `broom` and `broom.mixed` R packages to provide support for +diagnostic plots produced from a variety of model object classes across a wide +variety of R packages [@broom; @broom.mixed]. A quartet of diagnostic plots can +be quickly created using `gglm`'s homonymous function, or through instructive +and intuitive layer functions added to a `ggplot2` object [@ggplot2]. + +# Statement of need + +When scientists, statistical practitioners, students, and others implement +statistical models, it is of the utmost importance that the modeling assumptions +are verified through visual diagnostics in order to ensure valid statistical +inference. The R statistical software language provides a method for producing +diagnostic plots for linear model objects created with `stats::lm`, however +these plots are visually unappealing, inconsistent with diagnostic plots +produced for other R packages and model types, and out of place in modern +statistics and data science courses focused on learning R with the `tidyverse` +[@tidyverse]. + +`gglm` addresses the described issues with current diagnostic plots in R by +providing a consistent interface for producing beautiful and publication-ready +diagnostic plots for a large variety of R packages and model types (linear +models, linear mixed models, generalized linear mixed models, etc.). `gglm` +provides functionality to quickly produce four common diagnostic plots, similar +to `stats::plot.lm`, but produced by `ggplot2`. Further, `gglm` provides a suite +of layer functions adhering to the grammar of graphics which allow the user to +create and fine-tune their diagnostic plots through `ggplot2`'s intuitive +interface. The layer functions are particularly applicable in modern courses +teaching linear regression where students have already learned `ggplot2`, and in +particular they are used in Harvard University's introductory statistics course +[@mcconville2023]. Outside of educational benefits, `gglm` has potential to +allow researchers to more easily publish elegant diagnostic plots. `gglm` has +been downloaded from CRAN over 23,000 times as of January 2024. + +# Usage and Philosophy + +`gglm` has a simple philosophy for usage of the package: "be easy, intuitive, +and customizable". This philosophy comes about from the understanding that an +individual producing a diagnostic plot will be in one of two camps: 1) the +individual who wants an *easy* to use tool that allows them to quickly check +their model diagnostics, or 2) the individual who wants an *intuitive and +customizable* tool that allows them to look closely at their diagnostics for the +purposes of education, fine-tuning for publication, or other reasons. `gglm` +satisfies the individuals in both camps. + +The `gglm::gglm` function is made for folks in the first camp who are looking +a more aesthetically pleasing alternative to `stats::plot.lm`. In practice, the +process of using `gglm::gglm` is as simple as and more general than using +`stats::plot.lm`, with steps as follows: + ++ fit a model of any class listed in `gglm::list_model_classes`, ++ call `gglm::gglm` on the saved model object. + +The `gglm::stat_*` functions are thus for the individual in the second camp. +`gglm` provides seven functions of this sort, including those that produce the +following plots: Cook's distance by leverage, Cook's distance by observation +number, fitted values by residual values, normal QQ, residual histogram, +residual values by leverage, and scale by location. The steps to produce a +diagnostic plot with these functions are more fluid than with `gglm::gglm`, +but are easy to understand provided the user has an understanding of how to use +`ggplot2`. One may use the workflow: + ++ fit a model of any class listed in `gglm::list_model_classes`, ++ provide the saved model object as data to `ggplot2::ggplot`, ++ add their intended diagnostic plot layer, ++ add any more `ggplot2` layers such as themes, labels, annotations, and more to +create their custom diagnostic plot. + +# Comparison to Other Packages + +Functionality similar to that of `gglm`'s is provided by a variety of R +packages. As mentioned throughout, `stats` provides a `plot` method for +producing diagnostic plots for `lm` objects with base R graphics [@R]. Further, +`lindia` produces diagnostic plots for `lm` objects with `ggplot2` graphics, but +does not include functions that adhere with the grammar of graphics. Finally, +many packages provide methods for plotting diagnostics based on their own model +classes (see, e.g. `lme4::plot.merMod`), however these methods are do not have +consistent usage across packages [@lme4]. + +# References diff --git a/paper/paper.bib b/paper/paper.bib new file mode 100644 index 0000000..4bd96a9 --- /dev/null +++ b/paper/paper.bib @@ -0,0 +1,85 @@ + @article{wickham2010, + author = {Hadley Wickham}, + title = {A Layered Grammar of Graphics}, + journal = {Journal of Computational and Graphical Statistics}, + volume = {19}, + number = {1}, + pages = {3-28}, + year = {2010}, + publisher = {Taylor & Francis}, + doi = {10.1198/jcgs.2009.07098}, + URL = {https://doi.org/10.1198/jcgs.2009.07098}, + eprint = {https://doi.org/10.1198/jcgs.2009.07098} + } + + @Book{ggplot2, + author = {Hadley Wickham}, + title = {ggplot2: Elegant Graphics for Data Analysis}, + publisher = {Springer-Verlag New York}, + year = {2016}, + isbn = {978-3-319-24277-4}, + url = {https://ggplot2.tidyverse.org}, + } + @Manual{broom, + title = {broom: Convert Statistical Objects into Tidy Tibbles}, + author = {David Robinson and Alex Hayes and Simon Couch}, + year = {2023}, + note = {R package version 1.0.5}, + url = {https://CRAN.R-project.org/package=broom}, + } + + @Manual{broom.mixed, + title = {broom.mixed: Tidying Methods for Mixed Models}, + author = {Ben Bolker and David Robinson}, + year = {2022}, + note = {R package version 0.2.9.4}, + url = {https://CRAN.R-project.org/package=broom.mixed}, + } + + @Article{tidyverse, + title = {Welcome to the {tidyverse}}, + author = {Hadley Wickham and Mara Averick and Jennifer Bryan and Winston Chang and Lucy D'Agostino McGowan and Romain François and Garrett Grolemund and Alex Hayes and Lionel Henry and Jim Hester and Max Kuhn and Thomas Lin Pedersen and Evan Miller and Stephan Milton Bache and Kirill Müller and Jeroen Ooms and David Robinson and Dana Paige Seidel and Vitalie Spinu and Kohske Takahashi and Davis Vaughan and Claus Wilke and Kara Woo and Hiroaki Yutani}, + year = {2019}, + journal = {Journal of Open Source Software}, + volume = {4}, + number = {43}, + pages = {1686}, + doi = {10.21105/joss.01686}, + } + + @misc{mcconville2023, + author = {Kelly McConville}, + title = {STAT 100: Introduction to Statistics and Data Science}, + year = {2023}, + publisher={Harvard University Department of Statistics}, + url={https://mcconvil.github.io/stat100f23/}, + note={Week 13, Wednesday} +} + + @Manual{R, + title = {R: A Language and Environment for Statistical Computing}, + author = {{R Core Team}}, + organization = {R Foundation for Statistical Computing}, + address = {Vienna, Austria}, + year = {2023}, + url = {https://www.R-project.org/}, + } + + @Manual{lindia, + title = {lindia: Automated Linear Regression Diagnostic}, + author = {Yeuk Yu Lee and Samuel Ventura}, + year = {2023}, + note = {R package version 0.10}, + url = {https://CRAN.R-project.org/package=lindia}, + } + + @Article{lme4, + title = {Fitting Linear Mixed-Effects Models Using {lme4}}, + author = {Douglas Bates and Martin M{\"a}chler and Ben Bolker and Steve Walker}, + journal = {Journal of Statistical Software}, + year = {2015}, + volume = {67}, + number = {1}, + pages = {1--48}, + doi = {10.18637/jss.v067.i01}, + } diff --git a/paper/paper.html b/paper/paper.html new file mode 100644 index 0000000..2974a4d --- /dev/null +++ b/paper/paper.html @@ -0,0 +1,570 @@ + + + + + + + + + + + + + + +gglm: An R package implementing the grammar of graphics for linear model diagnostic plots + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+

Summary

+

gglm implements an interface to produce +publication-ready model diagnostic plots that complies with the grammar +of graphics (Wickham 2010). Further, +gglm utilizes the broom and +broom.mixed R packages to provide support for diagnostic +plots produced from a variety of model object classes across a wide +variety of R packages (Robinson, Hayes, and Couch +2023; Bolker and Robinson 2022). A quartet of diagnostic plots +can be quickly created using gglm’s homonymous function, or +through instructive and intuitive layer functions added to a +ggplot2 object (Wickham +2016).

+
+
+

Statement of need

+

When scientists, statistical practitioners, students, and others +implement statistical models, it is of the utmost importance that the +modeling assumptions are verified through visual diagnostics in order to +ensure valid statistical inference. The R statistical software language +provides a method for producing diagnostic plots for linear model +objects created with stats::lm, however these plots are +visually unappealing, inconsistent with diagnostic plots produced for +other R packages and model types, and out of place in modern statistics +and data science courses focused on learning R with the +tidyverse (Wickham et al. +2019).

+

gglm addresses the described issues with current +diagnostic plots in R by providing a consistent interface for producing +beautiful and publication-ready diagnostic plots for a large variety of +R packages and model types (linear models, linear mixed models, +generalized linear mixed models, etc.). gglm provides +functionality to quickly produce four common diagnostic plots, similar +to stats::plot.lm, but produced by ggplot2. +Further, gglm provides a suite of layer functions adhering +to the grammar of graphics which allow the user to create and fine-tune +their diagnostic plots through ggplot2’s intuitive +interface. The layer functions are particularly applicable in modern +courses teaching linear regression where students have already learned +ggplot2, and in particular they are used in Harvard +University’s introductory statistics course (McConville 2023). Outside of educational +benefits, gglm has potential to allow researchers to more +easily publish elegant diagnostic plots. gglm has been +downloaded from CRAN over 23,000 times as of January 2024.

+
+
+

Usage and Philosophy

+

gglm has a simple philosophy for usage of the package: +“be easy, intuitive, and customizable”. This philosophy comes about from +the understanding that an individual producing a diagnostic plot will be +in one of two camps: 1) the individual who wants an easy to use +tool that allows them to quickly check their model diagnostics, or 2) +the individual who wants an intuitive and customizable tool +that allows them to look closely at their diagnostics for the purposes +of education, fine-tuning for publication, or other reasons. +gglm satisfies the individuals in both camps.

+

The gglm::gglm function is made for folks in the first +camp who are looking a more aesthetically pleasing alternative to +stats::plot.lm. In practice, the process of using +gglm::gglm is as simple as and more general than using +stats::plot.lm, with steps as follows:

+ +

The gglm::stat_* functions are thus for the individual +in the second camp. gglm provides seven functions of this +sort, including those that produce the following plots: Cook’s distance +by leverage, Cook’s distance by observation number, fitted values by +residual values, normal QQ, residual histogram, residual values by +leverage, and scale by location. The steps to produce a diagnostic plot +with these functions are more fluid than with gglm::gglm, +but are easy to understand provided the user has an understanding of how +to use ggplot2. One may use the workflow:

+ +
+
+

Comparison to Other Packages

+

Functionality similar to that of gglm’s is provided by a +variety of R packages. As mentioned throughout, stats +provides a plot method for producing diagnostic plots for +lm objects with base R graphics (R +Core Team 2023). Further, lindia produces diagnostic +plots for lm objects with ggplot2 graphics, +but does not include functions that adhere with the grammar of graphics. +Finally, many packages provide methods for plotting diagnostics based on +their own model classes (see, e.g. lme4::plot.merMod), +however these methods are do not have consistent usage across packages +(Bates et al. 2015).

+
+
+

References

+
+
+Bates, Douglas, Martin Mächler, Ben Bolker, and Steve Walker. 2015. +“Fitting Linear Mixed-Effects Models Using lme4.” Journal of Statistical +Software 67 (1): 1–48. https://doi.org/10.18637/jss.v067.i01. +
+
+Bolker, Ben, and David Robinson. 2022. Broom.mixed: Tidying Methods +for Mixed Models. https://CRAN.R-project.org/package=broom.mixed. +
+
+McConville, Kelly. 2023. “Statistics 100.” Harvard +University Department of Statistics. https://mcconvil.github.io/stat100f23/. +
+
+R Core Team. 2023. R: A Language and Environment for Statistical +Computing. Vienna, Austria: R Foundation for Statistical Computing. +https://www.R-project.org/. +
+
+Robinson, David, Alex Hayes, and Simon Couch. 2023. Broom: Convert +Statistical Objects into Tidy Tibbles. https://CRAN.R-project.org/package=broom. +
+
+Wickham, Hadley. 2010. “A Layered Grammar of Graphics.” +Journal of Computational and Graphical Statistics 19 (1): 3–28. +https://doi.org/10.1198/jcgs.2009.07098. +
+
+———. 2016. Ggplot2: Elegant Graphics for Data Analysis. +Springer-Verlag New York. https://ggplot2.tidyverse.org. +
+
+Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy +D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. +“Welcome to the tidyverse.” +Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686. +
+
+
+ + + + +
+ + + + + + + + + + + + + + + diff --git a/paper/paper.log b/paper/paper.log new file mode 100644 index 0000000..1219709 --- /dev/null +++ b/paper/paper.log @@ -0,0 +1,980 @@ +This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023) (preloaded format=xelatex 2024.1.15) 15 JAN 2024 17:30 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**paper.tex +(./paper.tex +LaTeX2e <2023-11-01> +L3 programming layer <2024-01-04> +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/base/article.cls +Document Class: article 2023/05/17 v1.4n Standard LaTeX document class +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2023/05/17 v1.4n Standard LaTeX file (size option) +) +\c@part=\count183 +\c@section=\count184 +\c@subsection=\count185 +\c@subsubsection=\count186 +\c@paragraph=\count187 +\c@subparagraph=\count188 +\c@figure=\count189 +\c@table=\count190 +\abovecaptionskip=\skip48 +\belowcaptionskip=\skip49 +\bibindent=\dimen140 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/marginnote/marginnote.sty +Package: marginnote 2018/08/09 1.4b non floating margin notes for LaTeX +\c@mn@abspage=\count191 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2022/05/29 v1.15 key=value parser (DPC) +\KV@toks@=\toks17 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2022/03/10 v1.4e Standard LaTeX Graphics (DPC,SPQR) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2021/08/11 v1.11 sin cos tan (DPC) +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: xetex.def on input line 107. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/graphics-def/xetex.def +File: xetex.def 2022/09/22 v5.0n Graphics/color driver for xetex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2023/11/15 v3.01 LaTeX color extensions (UK) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: xetex.def on input line 274. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/graphics/mathcolor.ltx) +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1350. +Package xcolor Info: Model `RGB' extended on input line 1366. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1368. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1370. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1371. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1372. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1373. +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/preprint/authblk.sty +Package: authblk 2001/02/27 1.3 (PWD) +\affilsep=\skip50 +\@affilsep=\skip51 +\c@Maxaffil=\count192 +\c@authors=\count193 +\c@affil=\count194 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count195 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/titlesec/titlesec.sty +Package: titlesec 2023/10/27 v2.16 Sectioning titles +\ttl@box=\box51 +\beforetitleunit=\skip52 +\aftertitleunit=\skip53 +\ttl@plus=\dimen143 +\ttl@minus=\dimen144 +\ttl@toksa=\toks18 +\titlewidth=\dimen145 +\titlewidthlast=\dimen146 +\titlewidthfirst=\dimen147 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/tools/calc.sty +Package: calc 2023/07/08 v4.3 Infix arithmetic (KKT,FJ) +\calc@Acount=\count196 +\calc@Bcount=\count197 +\calc@Adimen=\dimen148 +\calc@Bdimen=\dimen149 +\calc@Askip=\skip54 +\calc@Bskip=\skip55 +LaTeX Info: Redefining \setlength on input line 80. +LaTeX Info: Redefining \addtolength on input line 81. +\calc@Ccount=\count198 +\calc@Cskip=\skip56 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks19 +\pgfutil@tempdima=\dimen150 +\pgfutil@tempdimb=\dimen151 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box52 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2023-01-15 v3.1.10 (3.1.10) +)) +Package: pgf 2023-01-15 v3.1.10 (3.1.10) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2023-01-15 v3.1.10 (3.1.10) +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks20 +\pgfkeys@temptoks=\toks21 +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.tex +\pgfkeys@tmptoks=\toks22 +)) +\pgf@x=\dimen152 +\pgf@y=\dimen153 +\pgf@xa=\dimen154 +\pgf@ya=\dimen155 +\pgf@xb=\dimen156 +\pgf@yb=\dimen157 +\pgf@xc=\dimen158 +\pgf@yc=\dimen159 +\pgf@xd=\dimen160 +\pgf@yd=\dimen161 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count199 +\c@pgf@countb=\count266 +\c@pgf@countc=\count267 +\c@pgf@countd=\count268 +\t@pgf@toka=\toks23 +\t@pgf@tokb=\toks24 +\t@pgf@tokc=\toks25 +\pgf@sys@id@count=\count269 +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2023-01-15 v3.1.10 (3.1.10) +) +Driver file for pgf: pgfsys-xetex.def +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-xetex.def +File: pgfsys-xetex.def 2023-01-15 v3.1.10 (3.1.10) +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-dvipdfmx.def +File: pgfsys-dvipdfmx.def 2023-01-15 v3.1.10 (3.1.10) +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2023-01-15 v3.1.10 (3.1.10) +) +\pgfsys@objnum=\count270 +))) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfsyssoftpath@smallbuffer@items=\count271 +\pgfsyssoftpath@bigbuffer@items=\count272 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2023-01-15 v3.1.10 (3.1.10) +)) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2023-01-15 v3.1.10 (3.1.10) +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen162 +\pgfmath@count=\count273 +\pgfmath@box=\box53 +\pgfmath@toks=\toks26 +\pgfmath@stack@operand=\toks27 +\pgfmath@stack@operation=\toks28 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count274 +)) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@picminx=\dimen163 +\pgf@picmaxx=\dimen164 +\pgf@picminy=\dimen165 +\pgf@picmaxy=\dimen166 +\pgf@pathminx=\dimen167 +\pgf@pathmaxx=\dimen168 +\pgf@pathminy=\dimen169 +\pgf@pathmaxy=\dimen170 +\pgf@xx=\dimen171 +\pgf@xy=\dimen172 +\pgf@yx=\dimen173 +\pgf@yy=\dimen174 +\pgf@zx=\dimen175 +\pgf@zy=\dimen176 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@path@lastx=\dimen177 +\pgf@path@lasty=\dimen178 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@shorten@end@additional=\dimen179 +\pgf@shorten@start@additional=\dimen180 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfpic=\box54 +\pgf@hbox=\box55 +\pgf@layerbox@main=\box56 +\pgf@picture@serial@count=\count275 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgflinewidth=\dimen181 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex +File: pgfcoretransformations.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@pt@x=\dimen182 +\pgf@pt@y=\dimen183 +\pgf@pt@temp=\dimen184 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2023-01-15 v3.1.10 (3.1.10) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2023-01-15 v3.1.10 (3.1.10) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex +File: pgfcorepathprocessing.code.tex 2023-01-15 v3.1.10 (3.1.10) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfarrowsep=\dimen185 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@max=\dimen186 +\pgf@sys@shading@range@num=\count276 +\pgf@shadingcount=\count277 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2023-01-15 v3.1.10 (3.1.10) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfexternal@startupbox=\box57 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2023-01-15 v3.1.10 (3.1.10) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2023-01-15 v3.1.10 (3.1.10) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2023-01-15 v3.1.10 (3.1.10) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2023-01-15 v3.1.10 (3.1.10) +))) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfnodeparttextbox=\box58 +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2023-01-15 v3.1.10 (3.1.10) +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2023-01-15 v3.1.10 (3.1.10) +\pgf@nodesepstart=\dimen187 +\pgf@nodesepend=\dimen188 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2023-01-15 v3.1.10 (3.1.10) +)) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/utilities/pgffor.sty (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/pgf/math/pgfmath.sty (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2023-01-15 v3.1.10 (3.1.10) +\pgffor@iter=\dimen189 +\pgffor@skip=\dimen190 +\pgffor@stack=\toks29 +\pgffor@toks=\toks30 +)) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2023-01-15 v3.1.10 (3.1.10) +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex +File: pgflibraryplothandlers.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@plot@mark@count=\count278 +\pgfplotmarksize=\dimen191 +) +\tikz@lastx=\dimen192 +\tikz@lasty=\dimen193 +\tikz@lastxsaved=\dimen194 +\tikz@lastysaved=\dimen195 +\tikz@lastmovetox=\dimen196 +\tikz@lastmovetoy=\dimen197 +\tikzleveldistance=\dimen198 +\tikzsiblingdistance=\dimen199 +\tikz@figbox=\box59 +\tikz@figbox@bg=\box60 +\tikz@tempbox=\box61 +\tikz@tempbox@bg=\box62 +\tikztreelevel=\count279 +\tikznumberofchildren=\count280 +\tikznumberofcurrentchild=\count281 +\tikz@fig@count=\count282 +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfmatrixcurrentrow=\count283 +\pgfmatrixcurrentcolumn=\count284 +\pgf@matrix@numberofcolumns=\count285 +) +\tikz@expandcount=\count286 +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2023-01-15 v3.1.10 (3.1.10) +))) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2023-11-26 v7.01g Hypertext links for LaTeX +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2022/02/03 v1.0f TeX engine tests +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2023-12-04 v1.26 LaTeX kernel commands for general use (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode not found. +)) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2023-11-26 v2.56 Cross-referencing by name of section +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) +)) +\c@section@level=\count287 +) +\@linkdim=\dimen256 +\Hy@linkcounter=\count288 +\Hy@pagecounter=\count289 +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2023-11-26 v7.01g Hyperref: PDFDocEncoding definition (HO) +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +\Hy@SavedSpaceFactor=\count290 +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/hyperref/puenc.def +File: puenc.def 2023-11-26 v7.01g Hyperref: PDF Unicode definition (HO) +) +Package hyperref Info: Hyper figures OFF on input line 4181. +Package hyperref Info: Link nesting OFF on input line 4186. +Package hyperref Info: Hyper index ON on input line 4189. +Package hyperref Info: Plain pages OFF on input line 4196. +Package hyperref Info: Backreferencing OFF on input line 4201. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4448. +\c@Hy@tempcnt=\count291 +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 4786. +\XeTeXLinkMargin=\dimen257 +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO) +)) +\Fld@menulength=\count292 +\Field@Width=\dimen258 +\Fld@charsize=\dimen259 +Package hyperref Info: Hyper figures OFF on input line 6065. +Package hyperref Info: Link nesting OFF on input line 6070. +Package hyperref Info: Hyper index ON on input line 6073. +Package hyperref Info: backreferencing OFF on input line 6080. +Package hyperref Info: Link coloring OFF on input line 6085. +Package hyperref Info: Link coloring with OCG OFF on input line 6090. +Package hyperref Info: PDF/A mode OFF on input line 6095. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi +package with kernel methods +) +\Hy@abspage=\count293 +\c@Item=\count294 +\c@Hfootnote=\count295 +) +Package hyperref Info: Driver (autodetected): hxetex. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/hyperref/hxetex.def +File: hxetex.def 2023-11-26 v7.01g Hyperref driver for XeTeX +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/stringenc/stringenc.sty +Package: stringenc 2019/11/29 v1.12 Convert strings between diff. encodings (HO) +) +\pdfm@box=\box63 +\c@Hy@AnnotLevel=\count296 +\HyField@AnnotCount=\count297 +\Fld@listcount=\count298 +\c@bookmark@seq@number=\count299 +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend package +with kernel methods +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 285. +) +\Hy@SectionHShift=\skip57 +) +Package hyperref Info: Option `colorlinks' set `true' on input line 12. +Package hyperref Info: Option `breaklinks' set `true' on input line 12. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2023/08/05 v3.6o Customizing captions (AR) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2023/07/31 v2.4d caption3 kernel (AR) +\caption@tempdima=\dimen260 +\captionmargin=\dimen261 +\caption@leftmargin=\dimen262 +\caption@rightmargin=\dimen263 +\caption@width=\dimen264 +\caption@indent=\dimen265 +\caption@parindent=\dimen266 +\caption@hangindent=\dimen267 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count300 +\c@continuedfloat=\count301 +Package caption Info: hyperref package is loaded. +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2024/01/10 version 6.2.0 text color boxes +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2023-11-06 v1.5v LaTeX2e package for verbatim enhancements +\every@verbatim=\toks31 +\verbatim@line=\toks32 +\verbatim@in@stream=\read3 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks33 +) +\tcb@titlebox=\box64 +\tcb@upperbox=\box65 +\tcb@lowerbox=\box66 +\tcb@phantombox=\box67 +\c@tcbbreakpart=\count302 +\c@tcblayer=\count303 +\c@tcolorbox@number=\count304 +\l__tcobox_tmpa_box=\box68 +\l__tcobox_tmpa_dim=\dimen268 +\tcb@temp=\box69 +\tcb@temp=\box70 +\tcb@temp=\box71 +\tcb@temp=\box72 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks34 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2023/05/13 v2.17o AMS math features +\@mathmargin=\skip58 +For additional information on amsmath, use the `?' option. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks35 +\ex@=\dimen269 +)) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen270 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2022/04/08 v2.04 operator names +) +\inf@bad=\count305 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count306 +\leftroot@=\count307 +LaTeX Info: Redefining \overline on input line 399. +LaTeX Info: Redefining \colon on input line 410. +\classnum@=\count308 +\DOTSCASE@=\count309 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box73 +\strutbox@=\box74 +LaTeX Info: Redefining \big on input line 722. +LaTeX Info: Redefining \Big on input line 723. +LaTeX Info: Redefining \bigg on input line 724. +LaTeX Info: Redefining \Bigg on input line 725. +\big@size=\dimen271 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count310 +LaTeX Info: Redefining \bmod on input line 905. +LaTeX Info: Redefining \pmod on input line 910. +LaTeX Info: Redefining \smash on input line 940. +LaTeX Info: Redefining \relbar on input line 970. +LaTeX Info: Redefining \Relbar on input line 971. +\c@MaxMatrixCols=\count311 +\dotsspace@=\muskip17 +\c@parentequation=\count312 +\dspbrk@lvl=\count313 +\tag@help=\toks36 +\row@=\count314 +\column@=\count315 +\maxfields@=\count316 +\andhelp@=\toks37 +\eqnshift@=\dimen272 +\alignsep@=\dimen273 +\tagshift@=\dimen274 +\tagwidth@=\dimen275 +\totwidth@=\dimen276 +\lineht@=\dimen277 +\@envbody=\toks38 +\multlinegap=\skip59 +\multlinetaggap=\skip60 +\mathdisplay@stack=\toks39 +LaTeX Info: Redefining \[ on input line 2953. +LaTeX Info: Redefining \] on input line 2954. +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/iftex/ifxetex.sty +Package: ifxetex 2019/10/25 v0.7 ifxetex legacy package. Use iftex instead. +) (/home/grayson/.TinyTeX/texmf-dist/tex/generic/iftex/ifluatex.sty +Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead. +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/seqsplit/seqsplit.sty +Package: seqsplit 2006/08/07 v0.1 Splitting long sequences (DNA, RNA, proteins, etc.) +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/base/fixltx2e.sty +Package: fixltx2e 2016/12/29 v2.1a fixes to LaTeX (obsolete) +Applying: [2015/01/01] Old fixltx2e package on input line 46. + +Package fixltx2e Warning: fixltx2e is not required with releases after 2015 +(fixltx2e) All fixes are now in the LaTeX kernel. +(fixltx2e) See the latexrelease package for details. + +Already applied: [0000/00/00] Old fixltx2e package on input line 53. +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/biblatex.sty +Package: biblatex 2023/03/05 v3.19 programmable bibliographies (PK/MW) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/logreq/logreq.sty +Package: logreq 2010/08/04 v1.0 xml request logger +\lrq@indent=\count317 +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/logreq/logreq.def +File: logreq.def 2010/08/04 v1.0 logreq spec v1.0 +)) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2022/04/13 v1.1d Standard LaTeX ifthen package (DPC) +) +\c@tabx@nest=\count318 +\c@listtotal=\count319 +\c@listcount=\count320 +\c@liststart=\count321 +\c@liststop=\count322 +\c@citecount=\count323 +\c@citetotal=\count324 +\c@multicitecount=\count325 +\c@multicitetotal=\count326 +\c@instcount=\count327 +\c@maxnames=\count328 +\c@minnames=\count329 +\c@maxitems=\count330 +\c@minitems=\count331 +\c@citecounter=\count332 +\c@maxcitecounter=\count333 +\c@savedcitecounter=\count334 +\c@uniquelist=\count335 +\c@uniquename=\count336 +\c@refsection=\count337 +\c@refsegment=\count338 +\c@maxextratitle=\count339 +\c@maxextratitleyear=\count340 +\c@maxextraname=\count341 +\c@maxextradate=\count342 +\c@maxextraalpha=\count343 +\c@abbrvpenalty=\count344 +\c@highnamepenalty=\count345 +\c@lownamepenalty=\count346 +\c@maxparens=\count347 +\c@parenlevel=\count348 +\blx@tempcnta=\count349 +\blx@tempcntb=\count350 +\blx@tempcntc=\count351 +\c@blx@maxsection=\count352 +\blx@maxsegment@0=\count353 +\blx@notetype=\count354 +\blx@parenlevel@text=\count355 +\blx@parenlevel@foot=\count356 +\blx@sectionciteorder@0=\count357 +\blx@sectionciteorderinternal@0=\count358 +\blx@entrysetcounter=\count359 +\blx@biblioinstance=\count360 +\labelnumberwidth=\skip61 +\labelalphawidth=\skip62 +\biblabelsep=\skip63 +\bibitemsep=\skip64 +\bibnamesep=\skip65 +\bibinitsep=\skip66 +\bibparsep=\skip67 +\bibhang=\skip68 +\blx@bcfin=\read4 +\blx@bcfout=\write4 +\blx@langwohyphens=\language5 +\c@mincomprange=\count361 +\c@maxcomprange=\count362 +\c@mincompwidth=\count363 +Package biblatex Info: Trying to load biblatex default data model... +Package biblatex Info: ... file 'blx-dm.def' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/blx-dm.def +File: blx-dm.def 2023/03/05 v3.19 biblatex localization (PK/MW) +) +Package biblatex Info: Trying to load biblatex custom data model... +Package biblatex Info: ... file 'biblatex-dm.cfg' not found. +\c@afterword=\count364 +\c@savedafterword=\count365 +\c@annotator=\count366 +\c@savedannotator=\count367 +\c@author=\count368 +\c@savedauthor=\count369 +\c@bookauthor=\count370 +\c@savedbookauthor=\count371 +\c@commentator=\count372 +\c@savedcommentator=\count373 +\c@editor=\count374 +\c@savededitor=\count375 +\c@editora=\count376 +\c@savededitora=\count377 +\c@editorb=\count378 +\c@savededitorb=\count379 +\c@editorc=\count380 +\c@savededitorc=\count381 +\c@foreword=\count382 +\c@savedforeword=\count383 +\c@holder=\count384 +\c@savedholder=\count385 +\c@introduction=\count386 +\c@savedintroduction=\count387 +\c@namea=\count388 +\c@savednamea=\count389 +\c@nameb=\count390 +\c@savednameb=\count391 +\c@namec=\count392 +\c@savednamec=\count393 +\c@translator=\count394 +\c@savedtranslator=\count395 +\c@shortauthor=\count396 +\c@savedshortauthor=\count397 +\c@shorteditor=\count398 +\c@savedshorteditor=\count399 +\c@labelname=\count400 +\c@savedlabelname=\count401 +\c@institution=\count402 +\c@savedinstitution=\count403 +\c@lista=\count404 +\c@savedlista=\count405 +\c@listb=\count406 +\c@savedlistb=\count407 +\c@listc=\count408 +\c@savedlistc=\count409 +\c@listd=\count410 +\c@savedlistd=\count411 +\c@liste=\count412 +\c@savedliste=\count413 +\c@listf=\count414 +\c@savedlistf=\count415 +\c@location=\count416 +\c@savedlocation=\count417 +\c@organization=\count418 +\c@savedorganization=\count419 +\c@origlocation=\count420 +\c@savedoriglocation=\count421 +\c@origpublisher=\count422 +\c@savedorigpublisher=\count423 +\c@publisher=\count424 +\c@savedpublisher=\count425 +\c@language=\count426 +\c@savedlanguage=\count427 +\c@origlanguage=\count428 +\c@savedoriglanguage=\count429 +\c@pageref=\count430 +\c@savedpageref=\count431 +\shorthandwidth=\skip69 +\shortjournalwidth=\skip70 +\shortserieswidth=\skip71 +\shorttitlewidth=\skip72 +\shortauthorwidth=\skip73 +\shorteditorwidth=\skip74 +\locallabelnumberwidth=\skip75 +\locallabelalphawidth=\skip76 +\localshorthandwidth=\skip77 +\localshortjournalwidth=\skip78 +\localshortserieswidth=\skip79 +\localshorttitlewidth=\skip80 +\localshortauthorwidth=\skip81 +\localshorteditorwidth=\skip82 +Package biblatex Info: Trying to load enhanced support for Unicode engines... +Package biblatex Info: ... file 'blx-unicode.def' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/blx-unicode.def) +Package biblatex Info: Trying to load compatibility code... +Package biblatex Info: ... file 'blx-compat.def' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/blx-compat.def +File: blx-compat.def 2023/03/05 v3.19 biblatex compatibility (PK/MW) +) +Package biblatex Info: Trying to load generic definitions... +Package biblatex Info: ... file 'biblatex.def' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/biblatex.def +File: biblatex.def 2023/03/05 v3.19 biblatex compatibility (PK/MW) +\c@textcitecount=\count432 +\c@textcitetotal=\count433 +\c@textcitemaxnames=\count434 +\c@biburlbigbreakpenalty=\count435 +\c@biburlbreakpenalty=\count436 +\c@biburlnumpenalty=\count437 +\c@biburlucpenalty=\count438 +\c@biburllcpenalty=\count439 +\biburlbigskip=\muskip18 +\biburlnumskip=\muskip19 +\biburlucskip=\muskip20 +\biburllcskip=\muskip21 +\c@smartand=\count440 +) +Package biblatex Info: Trying to load bibliography style 'numeric'... +Package biblatex Info: ... file 'numeric.bbx' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/bbx/numeric.bbx +File: numeric.bbx 2023/03/05 v3.19 biblatex bibliography style (PK/MW) +Package biblatex Info: Trying to load bibliography style 'standard'... +Package biblatex Info: ... file 'standard.bbx' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/bbx/standard.bbx +File: standard.bbx 2023/03/05 v3.19 biblatex bibliography style (PK/MW) +\c@bbx:relatedcount=\count441 +\c@bbx:relatedtotal=\count442 +)) +Package biblatex Info: Trying to load citation style 'numeric'... +Package biblatex Info: ... file 'numeric.cbx' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx +File: numeric.cbx 2023/03/05 v3.19 biblatex citation style (PK/MW) +Package biblatex Info: Redefining '\cite'. +Package biblatex Info: Redefining '\parencite'. +Package biblatex Info: Redefining '\footcite'. +Package biblatex Info: Redefining '\footcitetext'. +Package biblatex Info: Redefining '\smartcite'. +Package biblatex Info: Redefining '\supercite'. +Package biblatex Info: Redefining '\textcite'. +Package biblatex Info: Redefining '\textcites'. +Package biblatex Info: Redefining '\cites'. +Package biblatex Info: Redefining '\parencites'. +Package biblatex Info: Redefining '\smartcites'. +) +Package biblatex Info: Trying to load configuration file... +Package biblatex Info: ... file 'biblatex.cfg' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/biblatex.cfg +File: biblatex.cfg +) +Package biblatex Info: XeTeX detected. +(biblatex) Assuming input encoding 'utf8'. +Package biblatex Info: Document encoding is UTF8 .... +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/l3kernel/expl3.sty +Package: expl3 2024-01-04 L3 programming layer (loader) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +File: l3backend-xetex.def 2024-01-04 L3 backend support: XeTeX +\g__graphics_track_int=\count443 +\l__pdf_internal_box=\box75 +\g__pdf_backend_object_int=\count444 +\g__pdf_backend_annotation_int=\count445 +\g__pdf_backend_link_int=\count446 +)) +Package biblatex Info: ... and expl3 +(biblatex) 2024-01-04 L3 programming layer (loader) +(biblatex) is new enough (at least 2020/04/06), +(biblatex) setting 'casechanger=expl3'. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/blx-case-expl3.sty (/home/grayson/.TinyTeX/texmf-dist/tex/latex/l3packages/xparse/xparse.sty +Package: xparse 2023-10-10 L3 Experimental document command parser +) +Package: blx-case-expl3 2023/03/05 v3.19 expl3 case changing code for biblatex +)) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count447 +\Gm@cntv=\count448 +\c@Gm@tempcnt=\count449 +\Gm@bindingoffset=\dimen278 +\Gm@wd@mp=\dimen279 +\Gm@odd@mp=\dimen280 +\Gm@even@mp=\dimen281 +\Gm@layoutwidth=\dimen282 +\Gm@layoutheight=\dimen283 +\Gm@layouthoffset=\dimen284 +\Gm@layoutvoffset=\dimen285 +\Gm@dimlist=\toks40 +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +Package: fancyhdr 2022/11/09 v4.1 Extensive control of page headers and footers +\f@nch@headwidth=\skip83 +\f@nch@O@elh=\skip84 +\f@nch@O@erh=\skip85 +\f@nch@O@olh=\skip86 +\f@nch@O@orh=\skip87 +\f@nch@O@elf=\skip88 +\f@nch@O@erf=\skip89 +\f@nch@O@olf=\skip90 +\f@nch@O@orf=\skip91 +) (/home/grayson/.TinyTeX/texmf-dist/tex/xelatex/mathspec/mathspec.sty +Package: mathspec 2016/12/22 v0.2b LaTeX Package (Mathematics font selection for XeLaTeX) +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/fontspec/fontspec.sty +Package: fontspec 2022/01/15 v2.8a Font selection for XeLaTeX and LuaLaTeX +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty +Package: fontspec-xetex 2022/01/15 v2.8a Font selection for XeLaTeX and LuaLaTeX +\l__fontspec_script_int=\count450 +\l__fontspec_language_int=\count451 +\l__fontspec_strnum_int=\count452 +\l__fontspec_tmp_int=\count453 +\l__fontspec_tmpa_int=\count454 +\l__fontspec_tmpb_int=\count455 +\l__fontspec_tmpc_int=\count456 +\l__fontspec_em_int=\count457 +\l__fontspec_emdef_int=\count458 +\l__fontspec_strong_int=\count459 +\l__fontspec_strongdef_int=\count460 +\l__fontspec_tmpa_dim=\dimen286 +\l__fontspec_tmpb_dim=\dimen287 +\l__fontspec_tmpc_dim=\dimen288 +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2021/04/29 v2.0v Standard LaTeX package +) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/fontspec/fontspec.cfg))) (/home/grayson/.TinyTeX/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2022/06/16 v2.9 package option processing (HA) +(/home/grayson/.TinyTeX/texmf-dist/tex/generic/xkeyval/xkeyval.tex (/home/grayson/.TinyTeX/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks41 +\XKV@tempa@toks=\toks42 +) +\XKV@depth=\count461 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +\c@eu@=\count462 +\c@eu@i=\count463 +\c@mkern=\count464 +) +Package hyperref Info: Option `unicode' set `true' on input line 152. +Package hyperref Info: Option `breaklinks' set `true' on input line 152. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/grffile/grffile.sty +Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legacy) +Package grffile Info: This package is an empty stub for compatibility on input line 40. +) +\cslhangindent=\skip92 +\csllabelwidth=\skip93 +\cslentryspacingunit=\skip94 +\@quotelevel=\count465 +\@quotereset=\count466 +(./paper.aux) +\openout1 = `paper.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 244. +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 244. +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 244. +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 244. +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 244. +LaTeX Font Info: Trying to load font information for TS1+cmr on input line 244. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/base/ts1cmr.fd +File: ts1cmr.fd 2023/04/13 v2.5m Standard LaTeX font definitions +) +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for TU/lmr/m/n on input line 244. +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 244. +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 244. +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 244. +LaTeX Font Info: ... okay on input line 244. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 244. +LaTeX Font Info: ... okay on input line 244. +Package hyperref Info: Link coloring ON on input line 244. +(./paper.out) (./paper.out) +\@outlinefile=\write5 +\openout5 = `paper.out'. + +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: End \AtBeginDocument code. +Package biblatex Info: Trying to load language 'english'... +Package biblatex Info: ... file 'english.lbx' found. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/biblatex/lbx/english.lbx +File: english.lbx 2023/03/05 v3.19 biblatex localization (PK/MW) +) +Package biblatex Info: XeTeX detected. +(biblatex) Assuming input encoding 'utf8'. +Package biblatex Info: Automatic encoding selection. +(biblatex) Assuming data encoding 'utf8'. +\openout4 = `paper.bcf'. + +Package biblatex Info: Trying to load bibliographic data... +Package biblatex Info: ... file 'paper.bbl' not found. +No file paper.bbl. +Package biblatex Info: Reference section=0 on input line 244. +Package biblatex Info: Reference segment=0 on input line 244. +*geometry* driver: auto-detecting +*geometry* detected driver: xetex +*geometry* verbose mode - [ preamble ] result: +* driver: xetex +* paper: a4paper +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includemp +* h-part:(L,W,R)=(28.45274pt, 526.376pt, 42.67912pt) +* v-part:(T,H,B)=(99.58464pt, 660.10394pt, 85.35826pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=387.33861pt +* \textheight=660.10394pt +* \oddsidemargin=95.22015pt +* \evensidemargin=95.22015pt +* \topmargin=-60.28131pt +* \headheight=62.59596pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=128.0374pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemargintrue +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +LaTeX Font Info: Trying to load font information for U+msa on input line 245. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 245. +(/home/grayson/.TinyTeX/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) + +Package hyperref Warning: Suppressing link with empty target on input line 271. + + +Package hyperref Warning: Suppressing link with empty target on input line 271. + + +Package hyperref Warning: Suppressing link with empty target on input line 271. + +File: /home/grayson/R/x86_64-pc-linux-gnu-library/4.3/rticles/rmarkdown/templates/joss/resources/JOSS-logo.png Graphic file (type bmp) + + +Package fancyhdr Warning: \headheight is too small (62.59596pt): +(fancyhdr) Make it at least 63.55022pt, for example: +(fancyhdr) \setlength{\headheight}{63.55022pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-0.95425pt}. + +LaTeX Font Info: Font shape `TU/lmss/m/it' in size <8> not available +(Font) Font shape `TU/lmss/m/sl' tried instead on input line 331. +[1 + +] +File: /home/grayson/R/x86_64-pc-linux-gnu-library/4.3/rticles/rmarkdown/templates/joss/resources/JOSS-logo.png Graphic file (type bmp) + + +Package fancyhdr Warning: \headheight is too small (62.59596pt): +(fancyhdr) Make it at least 63.55022pt, for example: +(fancyhdr) \setlength{\headheight}{63.55022pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-0.95425pt}. + +[2] +File: /home/grayson/R/x86_64-pc-linux-gnu-library/4.3/rticles/rmarkdown/templates/joss/resources/JOSS-logo.png Graphic file (type bmp) + + +Package fancyhdr Warning: \headheight is too small (62.59596pt): +(fancyhdr) Make it at least 63.55022pt, for example: +(fancyhdr) \setlength{\headheight}{63.55022pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-0.95425pt}. + +[3] (./paper.aux) + *********** +LaTeX2e <2023-11-01> +L3 programming layer <2024-01-04> + *********** +Package rerunfilecheck Info: File `paper.out' has not changed. +(rerunfilecheck) Checksum: 0B3BF1C9D2BC7F6B8E6DB44814E9B8B7;651. +Package logreq Info: Writing requests to 'paper.run.xml'. +\openout1 = `paper.run.xml'. + + ) +Here is how much of TeX's memory you used: + 34349 strings out of 476822 + 703677 string characters out of 5804165 + 1944174 words of memory out of 5000000 + 55827 multiletter control sequences out of 15000+600000 + 564925 words of font info for 82 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 84i,12n,87p,678b,850s stack positions out of 10000i,1000n,20000p,200000b,200000s + +Output written on paper.pdf (3 pages). diff --git a/paper/paper.md b/paper/paper.md new file mode 100644 index 0000000..8ef7eaa --- /dev/null +++ b/paper/paper.md @@ -0,0 +1,111 @@ +--- +title: 'gglm: An R package implementing the grammar of graphics for linear model diagnostic plots' +tags: + - R + - linear models + - diagnostic plots + - grammar of graphics + - ggplot2 +authors: + - name: Grayson W. White + orcid: 0000-0003-4993-2792 + affiliation: 1 +affiliations: + - name: Michigan State University, Department of Forestry + index: 1 +date: 15 January 2024 +bibliography: paper.bib +citation_author: White +year: 2024 +output: + rticles::joss_article: + keep_tex: true + includes: + in_header: columns.tex +csl: apa.csl +journal: JOSS +--- + +# Summary + +`gglm` implements an interface to produce publication-ready model diagnostic +plots that complies with the grammar of graphics [@wickham2010]. Further, `gglm` +utilizes the `broom` and `broom.mixed` R packages to provide support for +diagnostic plots produced from a variety of model object classes across a wide +variety of R packages [@broom; @broom.mixed]. A quartet of diagnostic plots can +be quickly created using `gglm`'s homonymous function, or through instructive +and intuitive layer functions added to a `ggplot2` object [@ggplot2]. + +# Statement of need + +When scientists, statistical practitioners, students, and others implement +statistical models, it is of the utmost importance that the modeling assumptions +are verified through visual diagnostics in order to ensure valid statistical +inference. The R statistical software language provides a method for producing +diagnostic plots for linear model objects created with `stats::lm`, however +these plots are visually unappealing, inconsistent with diagnostic plots +produced for other R packages and model types, and out of place in modern +statistics and data science courses focused on learning R with the `tidyverse` +[@tidyverse]. + +`gglm` addresses the described issues with current diagnostic plots in R by +providing a consistent interface for producing beautiful and publication-ready +diagnostic plots for a large variety of R packages and model types (linear +models, linear mixed models, generalized linear mixed models, etc.). `gglm` +provides functionality to quickly produce four common diagnostic plots, similar +to `stats::plot.lm`, but produced by `ggplot2`. Further, `gglm` provides a suite +of layer functions adhering to the grammar of graphics which allow the user to +create and fine-tune their diagnostic plots through `ggplot2`'s intuitive +interface. The layer functions are particularly applicable in modern courses +teaching linear regression where students have already learned `ggplot2`, and in +particular they are used in Harvard University's introductory statistics course +[@mcconville2023]. Outside of educational benefits, `gglm` has potential to +allow researchers to more easily publish elegant diagnostic plots. `gglm` has +been downloaded from CRAN over 23,000 times as of January 2024. + +# Usage and Philosophy + +`gglm` has a simple philosophy for usage of the package: "be easy, intuitive, +and customizable". This philosophy comes about from the understanding that an +individual producing a diagnostic plot will be in one of two camps: 1) the +individual who wants an *easy* to use tool that allows them to quickly check +their model diagnostics, or 2) the individual who wants an *intuitive and +customizable* tool that allows them to look closely at their diagnostics for the +purposes of education, fine-tuning for publication, or other reasons. `gglm` +satisfies the individuals in both camps. + +The `gglm::gglm` function is made for folks in the first camp who are looking +a more aesthetically pleasing alternative to `stats::plot.lm`. In practice, the +process of using `gglm::gglm` is as simple as and more general than using +`stats::plot.lm`, with steps as follows: + ++ fit a model of any class listed in `gglm::list_model_classes`, ++ call `gglm::gglm` on the saved model object. + +The `gglm::stat_*` functions are thus for the individual in the second camp. +`gglm` provides seven functions of this sort, including those that produce the +following plots: Cook's distance by leverage, Cook's distance by observation +number, fitted values by residual values, normal QQ, residual histogram, +residual values by leverage, and scale by location. The steps to produce a +diagnostic plot with these functions are more fluid than with `gglm::gglm`, +but are easy to understand provided the user has an understanding of how to use +`ggplot2`. One may use the workflow: + ++ fit a model of any class listed in `gglm::list_model_classes`, ++ provide the saved model object as data to `ggplot2::ggplot`, ++ add their intended diagnostic plot layer, ++ add any more `ggplot2` layers such as themes, labels, annotations, and more to +create their custom diagnostic plot. + +# Comparison to Other Packages + +Functionality similar to that of `gglm`'s is provided by a variety of R +packages. As mentioned throughout, `stats` provides a `plot` method for +producing diagnostic plots for `lm` objects with base R graphics [@R]. Further, +`lindia` produces diagnostic plots for `lm` objects with `ggplot2` graphics, but +does not include functions that adhere with the grammar of graphics. Finally, +many packages provide methods for plotting diagnostics based on their own model +classes (see, e.g. `lme4::plot.merMod`), however these methods are do not have +consistent usage across packages [@lme4]. + +# References diff --git a/paper/paper.pdf b/paper/paper.pdf new file mode 100644 index 0000000..bc8d879 Binary files /dev/null and b/paper/paper.pdf differ diff --git a/paper/paper.tex b/paper/paper.tex new file mode 100644 index 0000000..e879a82 --- /dev/null +++ b/paper/paper.tex @@ -0,0 +1,437 @@ +\documentclass[10pt,a4paper,onecolumn]{article} +\usepackage{marginnote} +\usepackage{graphicx} +\usepackage{xcolor} +\usepackage{authblk,etoolbox} +\usepackage{titlesec} +\usepackage{calc} +\usepackage{tikz} +\usepackage{hyperref} +\hypersetup{colorlinks,breaklinks, + urlcolor=[rgb]{0.0, 0.5, 1.0}, + linkcolor=[rgb]{0.0, 0.5, 1.0}} +\usepackage{caption} +\usepackage{tcolorbox} +\usepackage{amssymb,amsmath} +\usepackage{ifxetex,ifluatex} +\usepackage{seqsplit} +\usepackage{fixltx2e} % provides \textsubscript +\usepackage[ + backend=biber, +% style=alphabetic, +% citestyle=numeric +]{biblatex} +\bibliography{paper.bib} + + + +% --- Page layout ------------------------------------------------------------- +\usepackage[top=3.5cm, bottom=3cm, right=1.5cm, left=1.0cm, + headheight=2.2cm, reversemp, includemp, marginparwidth=4.5cm]{geometry} + +% --- Default font ------------------------------------------------------------ +% \renewcommand\familydefault{\sfdefault} + +% --- Style ------------------------------------------------------------------- +\renewcommand{\bibfont}{\small \sffamily} +\renewcommand{\captionfont}{\small\sffamily} +\renewcommand{\captionlabelfont}{\bfseries} + +% --- Section/SubSection/SubSubSection ---------------------------------------- +\titleformat{\section} + {\normalfont\sffamily\Large\bfseries} + {}{0pt}{} +\titleformat{\subsection} + {\normalfont\sffamily\large\bfseries} + {}{0pt}{} +\titleformat{\subsubsection} + {\normalfont\sffamily\bfseries} + {}{0pt}{} +\titleformat*{\paragraph} + {\sffamily\normalsize} + + +% --- Header / Footer --------------------------------------------------------- +\usepackage{fancyhdr} +\pagestyle{fancy} +\fancyhf{} +%\renewcommand{\headrulewidth}{0.50pt} +\renewcommand{\headrulewidth}{0pt} +\fancyhead[L]{\hspace{-0.75cm}\includegraphics[width=5.5cm]{/home/grayson/R/x86_64-pc-linux-gnu-library/4.3/rticles/rmarkdown/templates/joss/resources/JOSS-logo.png}} +\fancyhead[C]{} +\fancyhead[R]{} +\renewcommand{\footrulewidth}{0.25pt} + +\fancyfoot[L]{\footnotesize{\sffamily White, (2024). gglm: An R package +implementing the grammar of graphics for linear model diagnostic +plots. \textit{Journal of Open Source Software}, (), . \href{https://doi.org/}{https://doi.org/}}} + + +\fancyfoot[R]{\sffamily \thepage} +\makeatletter +\let\ps@plain\ps@fancy +\fancyheadoffset[L]{4.5cm} +\fancyfootoffset[L]{4.5cm} + +% --- Macros --------- + +\definecolor{linky}{rgb}{0.0, 0.5, 1.0} + +\newtcolorbox{repobox} + {colback=red, colframe=red!75!black, + boxrule=0.5pt, arc=2pt, left=6pt, right=6pt, top=3pt, bottom=3pt} + +\newcommand{\ExternalLink}{% + \tikz[x=1.2ex, y=1.2ex, baseline=-0.05ex]{% + \begin{scope}[x=1ex, y=1ex] + \clip (-0.1,-0.1) + --++ (-0, 1.2) + --++ (0.6, 0) + --++ (0, -0.6) + --++ (0.6, 0) + --++ (0, -1); + \path[draw, + line width = 0.5, + rounded corners=0.5] + (0,0) rectangle (1,1); + \end{scope} + \path[draw, line width = 0.5] (0.5, 0.5) + -- (1, 1); + \path[draw, line width = 0.5] (0.6, 1) + -- (1, 1) -- (1, 0.6); + } + } + +% --- Title / Authors --------------------------------------------------------- +% patch \maketitle so that it doesn't center +\patchcmd{\@maketitle}{center}{flushleft}{}{} +\patchcmd{\@maketitle}{center}{flushleft}{}{} +% patch \maketitle so that the font size for the title is normal +\patchcmd{\@maketitle}{\LARGE}{\LARGE\sffamily}{}{} +% patch the patch by authblk so that the author block is flush left +\def\maketitle{{% + \renewenvironment{tabular}[2][] + {\begin{flushleft}} + {\end{flushleft}} + \AB@maketitle}} +\makeatletter +\renewcommand\AB@affilsepx{ \protect\Affilfont} +%\renewcommand\AB@affilnote[1]{{\bfseries #1}\hspace{2pt}} +\renewcommand\AB@affilnote[1]{{\bfseries #1}\hspace{3pt}} +\makeatother +\renewcommand\Authfont{\sffamily\bfseries} +\renewcommand\Affilfont{\sffamily\small\mdseries} +\setlength{\affilsep}{1em} + + +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[T1]{fontenc} + \usepackage[utf8]{inputenc} + +\else % if luatex or xelatex + \ifxetex + \usepackage{mathspec} + \else + \usepackage{fontspec} + \fi + \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase} + +\fi +% use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +% use microtype if available +\IfFileExists{microtype.sty}{% +\usepackage{microtype} +\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} + +\usepackage{hyperref} +\hypersetup{unicode=true, + pdftitle={gglm: An R package implementing the grammar of graphics for linear model diagnostic plots}, + pdfborder={0 0 0}, + breaklinks=true} +\urlstyle{same} % don't use monospace font for urls +\usepackage{graphicx,grffile} +\makeatletter +\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +\makeatother +% Scale images if necessary, so that they will not overflow the page +% margins by default, and it is still possible to overwrite the defaults +% using explicit options in \includegraphics[width, height, ...]{} +\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +\IfFileExists{parskip.sty}{% +\usepackage{parskip} +}{% else +\setlength{\parindent}{0pt} +\setlength{\parskip}{6pt plus 2pt minus 1pt} +} +\setlength{\emergencystretch}{3em} % prevent overfull lines +\setcounter{secnumdepth}{0} +% Redefines (sub)paragraphs to behave more like sections +\ifx\paragraph\undefined\else +\let\oldparagraph\paragraph +\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else +\let\oldsubparagraph\subparagraph +\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}} +\fi + + +% tightlist command for lists without linebreak +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + + +% Pandoc citation processing +\newlength{\cslhangindent} +\setlength{\cslhangindent}{1.5em} +\newlength{\csllabelwidth} +\setlength{\csllabelwidth}{3em} +\newlength{\cslentryspacingunit} % times entry-spacing +\setlength{\cslentryspacingunit}{\parskip} +% for Pandoc 2.8 to 2.10.1 +\newenvironment{cslreferences}% + {}% + {\par} +% For Pandoc 2.11+ +\newenvironment{CSLReferences}[2] % #1 hanging-ident, #2 entry spacing + {% don't indent paragraphs + \setlength{\parindent}{0pt} + % turn on hanging indent if param 1 is 1 + \ifodd #1 + \let\oldpar\par + \def\par{\hangindent=\cslhangindent\oldpar} + \fi + % set entry spacing + \setlength{\parskip}{#2\cslentryspacingunit} + }% + {} +\usepackage{calc} +\newcommand{\CSLBlock}[1]{#1\hfill\break} +\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{#1}} +\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{#1}\break} +\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} + + +\newenvironment{cols}[1][]{}{} + +\newenvironment{col}[1]{\begin{minipage}{#1}\ignorespaces}{% +\end{minipage} +\ifhmode\unskip\fi +\aftergroup\useignorespacesandallpars} + +\def\useignorespacesandallpars#1\ignorespaces\fi{% +#1\fi\ignorespacesandallpars} + +\makeatletter +\def\ignorespacesandallpars{% + \@ifnextchar\par + {\expandafter\ignorespacesandallpars\@gobble}% + {}% +} +\makeatother + +\title{gglm: An R package implementing the grammar of graphics for +linear model diagnostic plots} + + \author[1]{Grayson W. White} + + \affil[1]{Michigan State University, Department of Forestry} + \date{\vspace{-5ex}} + +\begin{document} +\maketitle + +\marginpar{ + %\hrule + \sffamily\small + + {\bfseries DOI:} \href{https://doi.org/}{\color{linky}{}} + + \vspace{2mm} + + {\bfseries Software} + \begin{itemize} + \setlength\itemsep{0em} + \item \href{}{\color{linky}{Review}} \ExternalLink + \item \href{}{\color{linky}{Repository}} \ExternalLink + \item \href{}{\color{linky}{Archive}} \ExternalLink + \end{itemize} + + \vspace{2mm} + + {\bfseries Submitted:} \\ + {\bfseries Published:} + + \vspace{2mm} + {\bfseries License}\\ + Authors of papers retain copyright and release the work under a Creative Commons Attribution 4.0 International License (\href{http://creativecommons.org/licenses/by/4.0/}{\color{linky}{CC-BY}}). +} + +\hypertarget{summary}{% +\section{Summary}\label{summary}} + +\texttt{gglm} implements an interface to produce publication-ready model +diagnostic plots that complies with the grammar of graphics (Wickham, +2010). Further, \texttt{gglm} utilizes the \texttt{broom} and +\texttt{broom.mixed} R packages to provide support for diagnostic plots +produced from a variety of model object classes across a wide variety of +R packages (Bolker \& Robinson, 2022; Robinson, Hayes, \& Couch, 2023). +A quartet of diagnostic plots can be quickly created using +\texttt{gglm}'s homonymous function, or through instructive and +intuitive layer functions added to a \texttt{ggplot2} object (Wickham, +2016). + +\hypertarget{statement-of-need}{% +\section{Statement of need}\label{statement-of-need}} + +When scientists, statistical practitioners, students, and others +implement statistical models, it is of the utmost importance that the +modeling assumptions are verified through visual diagnostics in order to +ensure valid statistical inference. The R statistical software language +provides a method for producing diagnostic plots for linear model +objects created with \texttt{stats::lm}, however these plots are +visually unappealing, inconsistent with diagnostic plots produced for +other R packages and model types, and out of place in modern statistics +and data science courses focused on learning R with the +\texttt{tidyverse} (Wickham et al., 2019). + +\texttt{gglm} addresses the described issues with current diagnostic +plots in R by providing a consistent interface for producing beautiful +and publication-ready diagnostic plots for a large variety of R packages +and model types (linear models, linear mixed models, generalized linear +mixed models, etc.). \texttt{gglm} provides functionality to quickly +produce four common diagnostic plots, similar to +\texttt{stats::plot.lm}, but produced by \texttt{ggplot2}. Further, +\texttt{gglm} provides a suite of layer functions adhering to the +grammar of graphics which allow the user to create and fine-tune their +diagnostic plots through \texttt{ggplot2}'s intuitive interface. The +layer functions are particularly applicable in modern courses teaching +linear regression where students have already learned \texttt{ggplot2}, +and in particular they are used in Harvard University's introductory +statistics course (McConville, 2023). Outside of educational benefits, +\texttt{gglm} has potential to allow researchers to more easily publish +elegant diagnostic plots. \texttt{gglm} has been downloaded from CRAN +over 23,000 times as of January 2024. + +\hypertarget{usage-and-philosophy}{% +\section{Usage and Philosophy}\label{usage-and-philosophy}} + +\texttt{gglm} has a simple philosophy for usage of the package: ``be +easy, intuitive, and customizable''. This philosophy comes about from +the understanding that an individual producing a diagnostic plot will be +in one of two camps: 1) the individual who wants an \emph{easy} to use +tool that allows them to quickly check their model diagnostics, or 2) +the individual who wants an \emph{intuitive and customizable} tool that +allows them to look closely at their diagnostics for the purposes of +education, fine-tuning for publication, or other reasons. \texttt{gglm} +satisfies the individuals in both camps. + +The \texttt{gglm::gglm} function is made for folks in the first camp who +are looking a more aesthetically pleasing alternative to +\texttt{stats::plot.lm}. In practice, the process of using +\texttt{gglm::gglm} is as simple as and more general than using +\texttt{stats::plot.lm}, with steps as follows: + +\begin{itemize} +\tightlist +\item + fit a model of any class listed in + \texttt{gglm::list\_model\_classes}, +\item + call \texttt{gglm::gglm} on the saved model object. +\end{itemize} + +The \texttt{gglm::stat\_*} functions are thus for the individual in the +second camp. \texttt{gglm} provides seven functions of this sort, +including those that produce the following plots: Cook's distance by +leverage, Cook's distance by observation number, fitted values by +residual values, normal QQ, residual histogram, residual values by +leverage, and scale by location. The steps to produce a diagnostic plot +with these functions are more fluid than with \texttt{gglm::gglm}, but +are easy to understand provided the user has an understanding of how to +use \texttt{ggplot2}. One may use the workflow: + +\begin{itemize} +\tightlist +\item + fit a model of any class listed in + \texttt{gglm::list\_model\_classes}, +\item + provide the saved model object as data to \texttt{ggplot2::ggplot}, +\item + add their intended diagnostic plot layer, +\item + add any more \texttt{ggplot2} layers such as themes, labels, + annotations, and more to create their custom diagnostic plot. +\end{itemize} + +\hypertarget{comparison-to-other-packages}{% +\section{Comparison to Other +Packages}\label{comparison-to-other-packages}} + +Functionality similar to that of \texttt{gglm}'s is provided by a +variety of R packages. As mentioned throughout, \texttt{stats} provides +a \texttt{plot} method for producing diagnostic plots for \texttt{lm} +objects with base R graphics (R Core Team, 2023). Further, +\texttt{lindia} produces diagnostic plots for \texttt{lm} objects with +\texttt{ggplot2} graphics, but does not include functions that adhere +with the grammar of graphics. Finally, many packages provide methods for +plotting diagnostics based on their own model classes (see, +e.g.~\texttt{lme4::plot.merMod}), however these methods are do not have +consistent usage across packages (Bates, Mächler, Bolker, \& Walker, +2015). + +\hypertarget{references}{% +\section*{References}\label{references}} +\addcontentsline{toc}{section}{References} + +\hypertarget{refs}{} +\begin{CSLReferences}{1}{0} +\leavevmode\vadjust pre{\hypertarget{ref-lme4}{}}% +Bates, D., Mächler, M., Bolker, B., \& Walker, S. (2015). Fitting linear +mixed-effects models using {lme4}. \emph{Journal of Statistical +Software}, \emph{67}(1), 1--48. +doi:\href{https://doi.org/10.18637/jss.v067.i01}{10.18637/jss.v067.i01} + +\leavevmode\vadjust pre{\hypertarget{ref-broom.mixed}{}}% +Bolker, B., \& Robinson, D. (2022). \emph{Broom.mixed: Tidying methods +for mixed models}. Retrieved from +\url{https://CRAN.R-project.org/package=broom.mixed} + +\leavevmode\vadjust pre{\hypertarget{ref-mcconville2023}{}}% +McConville, K. (2023). STAT 100: Introduction to statistics and data +science. Harvard University Department of Statistics. Retrieved from +\url{https://mcconvil.github.io/stat100f23/} + +\leavevmode\vadjust pre{\hypertarget{ref-R}{}}% +R Core Team. (2023). \emph{R: A language and environment for statistical +computing}. Vienna, Austria: R Foundation for Statistical Computing. +Retrieved from \url{https://www.R-project.org/} + +\leavevmode\vadjust pre{\hypertarget{ref-broom}{}}% +Robinson, D., Hayes, A., \& Couch, S. (2023). \emph{Broom: Convert +statistical objects into tidy tibbles}. Retrieved from +\url{https://CRAN.R-project.org/package=broom} + +\leavevmode\vadjust pre{\hypertarget{ref-wickham2010}{}}% +Wickham, H. (2010). A layered grammar of graphics. \emph{Journal of +Computational and Graphical Statistics}, \emph{19}(1), 3--28. +doi:\href{https://doi.org/10.1198/jcgs.2009.07098}{10.1198/jcgs.2009.07098} + +\leavevmode\vadjust pre{\hypertarget{ref-ggplot2}{}}% +Wickham, H. (2016). \emph{ggplot2: Elegant graphics for data analysis}. +Springer-Verlag New York. Retrieved from +\url{https://ggplot2.tidyverse.org} + +\leavevmode\vadjust pre{\hypertarget{ref-tidyverse}{}}% +Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., +François, R., Grolemund, G., et al. (2019). Welcome to the {tidyverse}. +\emph{Journal of Open Source Software}, \emph{4}(43), 1686. +doi:\href{https://doi.org/10.21105/joss.01686}{10.21105/joss.01686} + +\end{CSLReferences} + +\end{document}