vignettes/web_only/ggstatsplot_paper.Rmd
ggstatsplot_paper.Rmd
(This publication is still a work in progress)
“What is to be sought in designs for the display of information is the clear portrayal of complexity. Not the complication of the simple; rather … the revelation of the complex.”
 Edward R. Tufte
The ggstatsplot
package is an opinionated collection of plots made with ggplot2
and is designed for exploratory data analysis or for producing publicationready statistical graphics. All plots share an underlying principle of displaying informationrich plots with all necessary statistical details included in the plots themselves. Although the plots produced by ggstatsplot
are still ggplot
objects and can thus be further modified using ggplot2
commands, there is a limit to how many such modifications can be made. That is, it is less flexible than ggplot2
, but that’s a feature and not a bug. The original intent behind this package is to offload struggles associated with constructing the plot and focus more on the interpretation of that data displayed in the plot.
Graphical perception involves visual decoding of the encoded information in graphs. ggstatsplot
incorporates the paradigm proposed in Cleveland (1985, Chapter 4) to facilitate making visual judgments about quantitative information effortless and almost instantaneous. Based on experiments, Cleveland proposes that there are ten elementary graphicalperception tasks that we perform to visually decode quantitative information in graphs (organized from most to least accurate; Cleveland, 1985, p.254)
So the key principle of Cleveland’s paradigm for data display is
“We should encode data on a graph so that the visual decoding involves [graphicalperception] tasks as high in the ordering as possible.”
For example, decoding the data point values in ggbetweenstats
requires position judgments along a common scale (Figure1):
# for reproducibility
set.seed(123)
# plot
ggstatsplot::ggbetweenstats(
data = dplyr::filter(
.data = ggstatsplot::movies_long,
genre %in% c("Action", "Action Comedy", "Action Drama", "Comedy")
),
x = genre,
y = rating,
title = "Figure1: IMDB rating by film genre",
xlab = "Genre",
ylab = "IMDB rating (average)",
bf.message = TRUE,
pairwise.comparisons = TRUE,
p.adjust.method = "bonferroni",
ggtheme = hrbrthemes::theme_ipsum_tw(),
ggstatsplot.layer = FALSE,
outlier.tagging = TRUE,
outlier.label = title,
messages = FALSE
)
There are few instances where ggstatsplot
diverges from recommendations made in Cleveland’s paradigm:
ggstatsplot
uses pie charts (see Figure2) which rely on angle judgments, which are less accurate (as compared to bar graphs, e.g., which require position judgments). This shortcoming is assuaged to some degree by using plenty of labels that describe percentages for all slices. This makes angle judgment unnecessary and prevacates any concerns about inaccurate judgments about percentages. Additionally, it also provides alternative function to ggpiestats
for working with categorical variables: ggbarstats
.# for reproducibility
set.seed(123)
# plot
ggstatsplot::ggpiestats(
data = ggstatsplot::movies_long,
main = genre,
condition = mpaa,
title = "Figure2: Distribution of MPAA ratings by film genre",
legend.title = "layout",
caption = substitute(paste(
italic("MPAA"), ": Motion Picture Association of America"
)),
bf.message = TRUE,
palette = "Paired",
messages = FALSE
)
grouped_
variants of the function (see Figure3). Note that the range for Yaxes are no longer the same across juxtaposed subplots and so visually comparing the data becomes difficult. On the other hand, in the superposed plot, all data have the same range and coloring different parts makes the visual discrimination of different components of the data, and their comparison, easier. But the goal of grouped_
variants of functions is to not only show different aspects of the data but also to run statistical tests and showing detailed results for all aspects of the data in a superposed plot is difficult. Therefore, this is a compromise ggstatsplot
is comfortable with, at least to produce plots for quick exploration of different aspects of the data.# for reproducibility
set.seed(123)
# plot
ggstatsplot::combine_plots(
# plot 1: superposition
ggplot2::ggplot(
data = dplyr::filter(ggstatsplot::movies_long, genre == "Comedy" 
genre == "Drama"),
mapping = ggplot2::aes(
x = length,
y = rating,
color = genre
)
) +
ggplot2::geom_jitter(size = 3, alpha = 0.5) +
ggplot2::geom_smooth(method = "lm") +
ggplot2::labs(title = "superposition (recommended in Cleveland's paradigm)") +
ggstatsplot::theme_ggstatsplot(),
# plot 2: juxtaposition
ggstatsplot::grouped_ggscatterstats(
data = dplyr::filter(ggstatsplot::movies_long, genre == "Comedy" 
genre == "Drama"),
x = length,
y = rating,
grouping.var = genre,
bf.message = TRUE,
marginal = FALSE,
messages = FALSE,
title.prefix = "Genre",
title.text = "juxtaposition (`ggstatsplot` implementation in `grouped_` functions)",
title.size = 12
),
# combine for comparison
title.text = "Two ways to compare different aspects of data",
nrow = 2,
labels = c("(a)", "(b)")
)
The grouped_
plots follow the Shrink Principle (Tufte, 2001, p.1667) for highinformation graphics, which dictates that the data density and the size of the data matrix can be maximized to exploit maximum resolution of the available datadisplay technology. Given the large maximum resolution afforded by most computer monitors today, saving grouped_
plots with appropriate resolution ensures no loss in legibility with reduced graphics area.
Graphical excellence consists of communicating complex ideas with clarity and in a way that the viewer understands the greatest number of ideas in a short amount of time all the while not quoting the data out of context. The package follows the principles for graphical integrity (as outlined in Tufte, 2001):
The physical representation of numbers is proportional to the numerical quantities they represent (e.g., Figure1 and Figure2 show how means (in ggbetweenstats
) or percentages (ggpiestats
) are proportional to the vertical distance or the area, respectively).
All important events in the data have clear, detailed, and thorough labeling (e.g., Figure1 plot shows how ggbetweenstats
labels means, sample size information, outliers, and pairwise comparisons; same can be appreciated for ggpiestats
in Figure2 and gghistostats
in Figure5). Note that data labels in the data region are designed in a way that they don’t interfere with our ability to assess the overall pattern of the data (Cleveland, 1985; p.4445). This is achieved by using ggrepel
package to place labels in a way that reduces their visual prominence.
None of the plots have design variation (e.g., abrupt change in scales) over the surface of a same graphic because this can lead to a false impression about variation in data.
The number of informationcarrying dimensions never exceed the number of dimensions in the data (e.g., using area to show onedimensional data).
All plots are designed to have no chartjunk (like moiré vibrations, fake perspective, dark grid lines, etc.) (Tufte, 2001, Chapter 5).
There are some instances where ggstatsplot
graphs don’t follow principles of clean graphics, as formulated in the Tufte theory of data graphics (Tufte, 2001, Chapter 4). The theory has four key principles:
In particular, default plots in ggstatsplot
can sometimes violate one of the principles from 24. According to these principles, every bit of ink should have reason for its inclusion in the graphic and should convey some new information to the viewer. If not, such ink should be removed. One instance of this is bilateral symmetry of data measures. For example, in Figure1, we can see that both the box and violin plots are mirrored, which consumes twice the space in the graphic without adding any new information. But this redundancy is tolerated for the sake of beauty that such symmetrical shapes can bring to the graphic. Even Tufte admits that efficiency is but one consideration in the design of statistical graphics (Tufte, 2001, p. 137). Additionally, these principles were formulated in an era in which computer graphics had yet to revolutionize the ease with which graphics could be produced and thus some of the concerns about minimizing dataink for easier production of graphics are not as relevant as they were.
As an extension of ggplot2
, ggstatsplot
has the same expectations about the structure of the data. More specifically,
The data
should be an object of class data.frame
(a tibble
dataframe will also work).
The data should be organized following the principles of tidy data, which specify how statistical structure of a data frame (variables and observations) should be mapped to physical structure (columns and rows). More specifically, tidy data means all variables have their own columns and each row corresponds to a unique observation (Wickham, 2014).
All ggstatsplot
functions remove NA
s from variables of interest (similar to ggplot2
; Wickham, 2016, p.207) in the data and display total sample size (n) in the subtitle to inform the user/reader about the number of observations included for both the statistical analysis and the visualization. But, when sample sizes differ across tests in the same function, ggstatsplot
makes an effort to inform the user of this aspect. For example, ggcorrmat
features several correlation test pairs and, depending on variables in a given pair, the sample sizes may vary (Figure4).
# creating a new dataset without any NAs in variables of interest
msleep_no_na <
dplyr::filter(
.data = ggplot2::msleep,
!is.na(sleep_rem),
!is.na(awake),
!is.na(brainwt),
!is.na(bodywt)
)
# variable names vector
var_names < c(
"REM sleep",
"time awake",
"brain weight",
"body weight"
)
# combining two plots
ggstatsplot::combine_plots(
# plot *without* any NAs
ggstatsplot::ggcorrmat(
data = msleep_no_na,
corr.method = "kendall",
sig.level = 0.001,
p.adjust.method = "holm",
cor.vars = c(sleep_rem, awake:bodywt),
cor.vars.names = var_names,
matrix.type = "upper",
colors = c("#B2182B", "white", "#4D4D4D"),
title = "Correlalogram for mammals sleep dataset",
subtitle = "sleep units: hours; weight units: kilograms",
messages = FALSE
),
# plot *with* NAs
ggstatsplot::ggcorrmat(
data = ggplot2::msleep,
corr.method = "kendall",
sig.level = 0.001,
p.adjust.method = "holm",
cor.vars = c(sleep_rem, awake:bodywt),
cor.vars.names = var_names,
matrix.type = "upper",
colors = c("#B2182B", "white", "#4D4D4D"),
title = "Correlalogram for mammals sleep dataset",
subtitle = "sleep units: hours; weight units: kilograms",
messages = FALSE
),
labels = c("(a)", "(b)"),
nrow = 1
)
Functions  Description  Parametric  Nonparametric  Robust  Bayes Factor 

ggbetweenstats 
Between group/condition comparisons  \(\checkmark\)  \(\checkmark\)  \(\checkmark\)  \(\checkmark\) 
ggwithinstats 
Within group/condition comparisons  \(\checkmark\)  \(\checkmark\)  \(\checkmark\)  \(\checkmark\) 
gghistostats 
Distribution of a numeric variable  \(\checkmark\)  \(\checkmark\)  \(\checkmark\)  \(\checkmark\) 
ggcorrmat 
Correlation matrix  \(\checkmark\)  \(\checkmark\)  \(\checkmark\)  \(\times\) 
ggscatterstats 
Correlation between two variables  \(\checkmark\)  \(\checkmark\)  \(\checkmark\)  \(\checkmark\) 
ggpiestats 
Association between categorical variables  \(\checkmark\)  \(\times\)  \(\times\)  \(\checkmark\) 
ggcoefstats 
Regression model coefficients  \(\checkmark\)  \(\times\)  \(\checkmark\)  \(\times\) 
Functions  Type  Test  Effect size  95% CI available? 

ggbetweenstats 
Parametric  Student’s and Welch’s ttest  Cohen’s d, Hedge’s g  \(\checkmark\) 
ggbetweenstats 
Parametric  Fisher’s and Welch’s oneway ANOVA  \[\eta^2_p, \omega^2_p\]  \(\checkmark\) 
ggbetweenstats 
Nonparametric  MannWhitney Utest  r  \(\checkmark\) 
ggbetweenstats 
Nonparametric  KruskalWallis Rank Sum Test  \[\eta^2_H\]  \(\checkmark\) 
ggbetweenstats 
Nonparametric  Friedman test  \[W_{Kendall}\]  \(\checkmark\) 
ggbetweenstats 
Robust  Yuen’s test for trimmed means  \[\xi\]  \(\checkmark\) 
ggbetweenstats 
Robust  Heteroscedastic oneway ANOVA for trimmed means  \[\xi\]  \(\checkmark\) 
ggpiestats 
Parametric  \[\text{Pearson's}~ \chi^2 ~\text{test}\]  Cramer’s V  \(\checkmark\) 
ggpiestats 
Parametric  McNemar’s test  Cohen’s g  \(\checkmark\) 
ggscatterstats /ggcorrmat

Parametric  Pearson’s r  r  \(\checkmark\) 
ggscatterstats /ggcorrmat

Nonparametric  \[\text{Spearman's}~ \rho\]  \[\rho\]  \(\checkmark\) 
ggscatterstats /ggcorrmat

Robust  Percentage bend correlation  r  \(\checkmark\) 
gghistostats /ggdotplotstats

Parametric  Onesample ttest  Cohen’s d, Hedge’s g  \(\checkmark\) 
gghistostats 
Nonparametric  Onesample Wilcoxon signed rank test  r  \(\checkmark\) 
gghistostats /ggdotplotstats

Robust  Onesample percentile bootstrap  robust estimator  \(\checkmark\) 
gghistostats /ggdotplotstats

Parametric  Regression models  \[\beta\]  \(\checkmark\) 
For the ggbetweenstats
function, the following posthoc tests are available for (adjusted) pairwise multiple comparisons:
Type  Design  Equal variance assumed?  Pairwise comparison test  pvalue adjustment? 

Parametric  betweensubjects  No  GamesHowell test  \(\checkmark\) 
Parametric  betweensubjects  Yes  Student’s ttest  \(\checkmark\) 
Parametric  withinsubjects  NA 
Student’s ttest  \(\checkmark\) 
Nonparametric  betweensubjects  No  DwassSteelCrichtlowFligner test  \(\checkmark\) 
Nonparametric  withinsubjects  No  DurbinConover test  \(\checkmark\) 
Robust  betweensubjects  No  Yuen’s trimmed means test  \(\checkmark\) 
Robust  withinsubjects  NA 
Yuen’s trimmed means test  \(\checkmark\) 
Bayes Factor  betweensubjects  No  \(\times\)  \(\times\) 
Bayes Factor  betweensubjects  Yes  \(\times\)  \(\times\) 
Bayes Factor  withinsubjects  NA 
\(\times\)  \(\times\) 
Note
NA
: not applicableOne of the important functions of a plot is to show the variation in the data, which comes in two forms:
ggstatsplot
, the actual variation in measurements is shown by plotting a combination of (jittered) raw data points with a boxplot laid on top (Figure1) or a histogram (Figure5). None of the plots, where empirical distribution of the data is concerned, show the sample standard deviation because they are poor at conveying information about limits of the sample and presence of outliers (Cleveland, 1985, p.220).# for reproducibility
set.seed(123)
# plot
ggstatsplot::gghistostats(
data = morley,
x = Speed,
test.value = 792,
test.value.line = TRUE,
bf.message = TRUE,
xlab = "Speed of light (km/sec, with 299000 subtracted)",
title = "Figure5: Distribution of Speed of light",
caption = "Note: Data collected across 5 experiments (20 measurements each)",
messages = FALSE
)
ggstatsplot
plots instead use 95% confidence intervals (e.g., Figure6). This is because the interval formed by error bars correspond to a 68% confidence interval, which is not a particularly interesting interval (Cleveland, 1985, p.222225).# for reproducibility
set.seed(123)
# plot
ggstatsplot::ggcoefstats(
x = lme4::lmer(
total.fruits ~ nutrient + rack + (nutrient 
popu / gen),
data = lme4::Arabidopsis
),
p.kr = FALSE
)
#> boundary (singular) fit: see ?isSingular
#> Computing pvalues via Waldstatistics approximation (treating t as Wald z).
The default setting in ggstatsplot
is to produce plots with statistical details included. Most often than not, the results are displayed as a subtitle
in the plot. Great care has been taken into which details are included in statistical reporting and why.
Default statistical tests:
Dealing with null results:
Avoiding the “pvalue error”:
The pvalue indexes the probability that the researchers have falsely rejected a true null hypothesis (Type I error, i.e.) and can rarely be exactly 0. And yet over 97,000 manuscripts on Google Scholar report the pvalue to be p = 0.000
(Lilienfeld et al., 2015), putatively due to relying on default computer outputs. All pvalues displayed in ggstatsplot
plots avoid this mistake. Anything less than p < 0.001
is displayed as such (e.g, Figure1). The package deems it unimportant how infinitesimally small the pvalues are and, instead, puts emphasis on the effect size magnitudes and their 95% CIs.
Attempt has been made to make the application program interface (API) consistent enough that no struggle is expected while thinking about specifying function calls
data
argument must always be specified.ggstatsplot
functions consistently expect tidy/long form data.x = "var1"
) and unquoted (x = var1
) arguments.There are three main documents one can rely on to learn how to use ggstatsplot
:
Presentation: The quickest (and the most fun) way to get an overview of the philosophy behind this package and the offered functionality is to go through the following slides: https://indrajeetpatil.github.io/ggstatsplot_slides/slides/ggstatsplot_presentation.html#1
Manual:
The CRAN
reference manual provides detailed documentation about arguments for each function and examples: https://cran.rproject.org/web/packages/ggstatsplot/ggstatsplot.pdf
README:
The GitHub README
document provides a quick summary of all available functionality without going too much into details: https://github.com/IndrajeetPatil/ggstatsplot/blob/master/README.md
Vignettes:
Vignettes contain probably the most detailed exposition. Every single function in ggstatsplot
has an associated vignette which describes in depth how to use the function and modify the defaults to customize the plot to your liking. All these vignettes can be accessed from the package website: https://indrajeetpatil.github.io/ggstatsplot/articles/
If you find any bugs or have any suggestions/remarks, please file an issue on GitHub
repository for this package: https://github.com/IndrajeetPatil/ggstatsplot/issues
Summarizing session information for reproducibility.
options(width = 200)
devtools::session_info()
#>  Session info 
#> setting value
#> version R version 3.6.0 alpha (20190329 r76300)
#> os Windows 10 x64
#> system x86_64, mingw32
#> ui RTerm
#> language (EN)
#> collate English_United States.1252
#> ctype English_United States.1252
#> tz America/New_York
#> date 20190525
#>
#>  Packages 
#> package * version date lib source
#> abind 1.45 20160721 [1] CRAN (R 3.5.0)
#> assertthat 0.2.1 20190321 [1] CRAN (R 3.6.0)
#> backports 1.1.4 20190410 [1] CRAN (R 3.6.0)
#> BayesFactor 0.9.124.2 20180519 [1] CRAN (R 3.5.1)
#> boot 1.321 20190301 [2] CRAN (R 3.6.0)
#> broom 0.5.2.9001 20190409 [1] local
#> broom.mixed 0.2.4.9000 20190314 [1] Github (bbolker/broom.mixed@c2de407)
#> broomExtra 0.0.3.9000 20190520 [1] local
#> callr 3.2.0 20190315 [1] CRAN (R 3.6.0)
#> car 3.02 20180823 [1] CRAN (R 3.5.1)
#> carData 3.02 20180930 [1] CRAN (R 3.5.1)
#> cellranger 1.1.0 20160727 [1] CRAN (R 3.5.1)
#> cli 1.1.0 20190319 [1] CRAN (R 3.6.0)
#> cluster 2.0.71 20180413 [2] CRAN (R 3.6.0)
#> coda 0.192 20181008 [1] CRAN (R 3.5.1)
#> codetools 0.216 20181224 [1] CRAN (R 3.5.2)
#> coin 1.30 20190308 [1] CRAN (R 3.5.2)
#> colorspace 1.41 20190318 [1] CRAN (R 3.6.0)
#> commonmark 1.7 20181201 [1] CRAN (R 3.6.0)
#> cowplot 0.9.4 20190108 [1] CRAN (R 3.6.0)
#> crayon 1.3.4 20170916 [1] CRAN (R 3.5.1)
#> curl 3.3 20190110 [1] CRAN (R 3.6.0)
#> data.table 1.12.2 20190407 [1] CRAN (R 3.5.3)
#> DEoptimR 1.08 20161119 [1] CRAN (R 3.5.0)
#> desc 1.2.0 20190403 [1] Github (rlib/desc@c860e7b)
#> DescTools 0.99.28 20190317 [1] CRAN (R 3.6.0)
#> devtools 2.0.2 20190408 [1] CRAN (R 3.6.0)
#> digest 0.6.19 20190520 [1] CRAN (R 3.6.0)
#> dplyr 0.8.1 20190514 [1] CRAN (R 3.6.0)
#> ellipsis 0.1.0 20190219 [1] CRAN (R 3.6.0)
#> emmeans 1.3.4 20190421 [1] CRAN (R 3.6.0)
#> EMT 1.1 20130129 [1] CRAN (R 3.5.2)
#> estimability 1.3 20180211 [1] CRAN (R 3.5.0)
#> evaluate 0.13 20190212 [1] CRAN (R 3.6.0)
#> expm 0.9994 20190321 [1] CRAN (R 3.6.0)
#> extrafont 0.17 20141208 [1] CRAN (R 3.5.0)
#> extrafontdb 1.0 20120611 [1] CRAN (R 3.5.0)
#> ez 4.40 20161102 [1] CRAN (R 3.5.3)
#> fit.models 0.514 20170406 [1] CRAN (R 3.5.1)
#> forcats 0.4.0 20190217 [1] CRAN (R 3.5.2)
#> foreign 0.871 20180720 [2] CRAN (R 3.6.0)
#> fs 1.3.1 20190506 [1] CRAN (R 3.6.0)
#> gdtools 0.1.8 20190402 [1] CRAN (R 3.6.0)
#> generics 0.0.2 20190305 [1] Github (rlib/generics@c15ac43)
#> ggcorrplot 0.1.3 20190519 [1] CRAN (R 3.6.0)
#> ggExtra 0.8 20190223 [1] Github (daattali/ggExtra@dd74c0f)
#> ggplot2 3.1.1.9000 20190525 [1] Github (tidyverse/ggplot2@1f6f0cb)
#> ggrepel 0.8.1 20190507 [1] CRAN (R 3.6.0)
#> ggsignif 0.5.0 20190220 [1] CRAN (R 3.6.0)
#> ggstatsplot 0.0.10.9000 20190525 [1] local
#> glue 1.3.1 20190312 [1] CRAN (R 3.6.0)
#> groupedstats 0.0.6.9000 20190520 [1] local
#> gtable 0.3.0 20190325 [1] CRAN (R 3.6.0)
#> gtools 3.8.1 20180626 [1] CRAN (R 3.5.0)
#> haven 2.1.0 20190219 [1] CRAN (R 3.6.0)
#> highr 0.8 20190320 [1] CRAN (R 3.6.0)
#> hms 0.4.2 20180310 [1] CRAN (R 3.5.1)
#> hrbrthemes 0.6.0 20190121 [1] CRAN (R 3.6.0)
#> htmltools 0.3.6 20170428 [1] CRAN (R 3.5.1)
#> httpuv 1.5.1 20190405 [1] CRAN (R 3.6.0)
#> insight 0.3.0 20190511 [1] CRAN (R 3.6.0)
#> jmv 0.9.6.1 20190422 [1] CRAN (R 3.6.0)
#> jmvcore 0.9.6.4 20190328 [1] CRAN (R 3.5.3)
#> knitr 1.23 20190518 [1] CRAN (R 3.6.0)
#> labeling 0.3 20140823 [1] CRAN (R 3.5.0)
#> LaplacesDemon 16.1.1 20180630 [1] CRAN (R 3.5.1)
#> later 0.8.0 20190211 [1] CRAN (R 3.6.0)
#> lattice 0.2038 20181104 [2] CRAN (R 3.6.0)
#> lazyeval 0.2.2 20190315 [1] CRAN (R 3.6.0)
#> libcoin 1.04 20190228 [1] CRAN (R 3.5.2)
#> lme4 1.121 20190305 [1] CRAN (R 3.6.0)
#> lmtest 0.937 20190430 [1] CRAN (R 3.6.0)
#> logspline 2.1.12 20190205 [1] CRAN (R 3.5.2)
#> magrittr 1.5 20141122 [1] CRAN (R 3.5.1)
#> manipulate 1.0.1 20141224 [1] CRAN (R 3.5.0)
#> MASS 7.351.4 20190331 [1] CRAN (R 3.6.0)
#> Matrix 1.217 20190322 [1] CRAN (R 3.6.0)
#> MatrixModels 0.41 20150822 [1] CRAN (R 3.5.1)
#> matrixStats 0.54.0 20180723 [1] CRAN (R 3.5.1)
#> mc2d 0.118 20170306 [1] CRAN (R 3.5.1)
#> memoise 1.1.0 20170421 [1] CRAN (R 3.6.0)
#> metaBMA 0.3.9 20170804 [1] CRAN (R 3.5.3)
#> metafor 2.10 20190514 [1] CRAN (R 3.6.0)
#> mgcv 1.828 20190321 [1] CRAN (R 3.6.0)
#> mime 0.6 20181005 [1] CRAN (R 3.5.1)
#> miniUI 0.1.1.1 20180518 [1] CRAN (R 3.5.1)
#> minqa 1.2.4 20141009 [1] CRAN (R 3.5.1)
#> mnormt 1.55 20161015 [1] CRAN (R 3.5.0)
#> modelr 0.1.4 20190218 [1] CRAN (R 3.6.0)
#> modeltools 0.222 20180716 [1] CRAN (R 3.5.1)
#> multcomp 1.410 20190305 [1] CRAN (R 3.5.2)
#> multcompView 0.17 20150731 [1] CRAN (R 3.5.1)
#> munsell 0.5.0 20180612 [1] CRAN (R 3.5.1)
#> mvtnorm 1.010 20190305 [1] CRAN (R 3.5.2)
#> nlme 3.1137 20180407 [2] CRAN (R 3.6.0)
#> nloptr 1.2.1 20181003 [1] CRAN (R 3.5.1)
#> nortest 1.04 20150730 [1] CRAN (R 3.5.2)
#> openxlsx 4.1.0 20180526 [1] CRAN (R 3.5.1)
#> paletteer 0.2.1.9000 20190325 [1] Github (EmilHvitfeldt/paletteer@38cdb34)
#> pbapply 1.40 20190205 [1] CRAN (R 3.6.0)
#> pcaPP 1.973 20180114 [1] CRAN (R 3.5.0)
#> pillar 1.4.0 20190511 [1] CRAN (R 3.6.0)
#> pkgbuild 1.0.3 20190320 [1] CRAN (R 3.6.0)
#> pkgconfig 2.0.2 20180816 [1] CRAN (R 3.5.1)
#> pkgdown 1.3.0.9100 20190521 [1] Github (rlib/pkgdown@56fe093)
#> pkgload 1.0.2 20181029 [1] CRAN (R 3.6.0)
#> plyr 1.8.4 20160608 [1] CRAN (R 3.5.1)
#> prettyunits 1.0.2 20150713 [1] CRAN (R 3.5.1)
#> processx 3.3.1 20190508 [1] CRAN (R 3.6.0)
#> promises 1.0.1 20180413 [1] CRAN (R 3.5.1)
#> ps 1.3.0 20181221 [1] CRAN (R 3.6.0)
#> psych 1.8.12 20190112 [1] CRAN (R 3.6.0)
#> purrr 0.3.2 20190315 [1] CRAN (R 3.6.0)
#> purrrlyr 0.0.5 20190315 [1] CRAN (R 3.6.0)
#> R6 2.4.0 20190214 [1] CRAN (R 3.6.0)
#> rcompanion 2.1.7 20190409 [1] CRAN (R 3.6.0)
#> Rcpp 1.0.1 20190317 [1] CRAN (R 3.6.0)
#> readxl 1.3.1 20190313 [1] CRAN (R 3.6.0)
#> remotes 2.0.4 20190410 [1] CRAN (R 3.6.0)
#> reshape 0.8.8 20181023 [1] CRAN (R 3.6.0)
#> reshape2 1.4.3 20171211 [1] CRAN (R 3.5.1)
#> rio 0.5.16 20181126 [1] CRAN (R 3.6.0)
#> rjson 0.2.20 20180608 [1] CRAN (R 3.5.0)
#> rlang 0.3.4 20190407 [1] CRAN (R 3.6.0)
#> rmarkdown 1.13 20190522 [1] CRAN (R 3.6.0)
#> robust 0.418 20170427 [1] CRAN (R 3.5.1)
#> robustbase 0.935 20190512 [1] CRAN (R 3.6.0)
#> roxygen2 6.1.1 20181107 [1] CRAN (R 3.6.0)
#> rprojroot 1.32 20180103 [1] CRAN (R 3.5.1)
#> rrcov 1.47 20181115 [1] CRAN (R 3.6.0)
#> rstudioapi 0.10 20190319 [1] CRAN (R 3.6.0)
#> Rttf2pt1 1.3.7 20180629 [1] CRAN (R 3.5.0)
#> runjags 2.0.42 20160725 [1] CRAN (R 3.5.2)
#> sandwich 2.51 20190406 [1] CRAN (R 3.6.0)
#> scales 1.0.0 20180809 [1] CRAN (R 3.5.1)
#> sessioninfo 1.1.1 20181105 [1] CRAN (R 3.6.0)
#> shiny 1.3.2 20190422 [1] CRAN (R 3.6.0)
#> sjlabelled 1.0.17 20190310 [1] CRAN (R 3.6.0)
#> sjmisc 2.7.9 20190316 [1] CRAN (R 3.6.0)
#> sjstats 0.17.4 20190315 [1] CRAN (R 3.6.0)
#> skimr 1.0.5 20190225 [1] CRAN (R 3.5.3)
#> stringi 1.4.3 20190312 [1] CRAN (R 3.6.0)
#> stringr 1.4.0 20190210 [1] CRAN (R 3.6.0)
#> survival 2.433 20181126 [2] CRAN (R 3.6.0)
#> testthat 2.1.1 20190423 [1] CRAN (R 3.6.0)
#> TH.data 1.010 20190121 [1] CRAN (R 3.5.2)
#> tibble 2.1.1 20190316 [1] CRAN (R 3.6.0)
#> tidyr 0.8.3 20190301 [1] CRAN (R 3.6.0)
#> tidyselect 0.2.5 20181011 [1] CRAN (R 3.5.1)
#> TMB 1.7.15 20181109 [1] CRAN (R 3.6.0)
#> usethis 1.5.0 20190407 [1] CRAN (R 3.6.0)
#> withr 2.1.2 20180315 [1] CRAN (R 3.5.1)
#> WRS2 1.00 20190416 [1] RForge (R 3.6.0)
#> xfun 0.7 20190514 [1] CRAN (R 3.6.0)
#> xml2 1.2.0 20180124 [1] CRAN (R 3.5.1)
#> xtable 1.84 20190421 [1] CRAN (R 3.5.3)
#> yaml 2.2.0 20180725 [1] CRAN (R 3.5.1)
#> zip 2.0.2 20190513 [1] CRAN (R 3.6.0)
#> zoo 1.85 20190321 [1] CRAN (R 3.6.0)
#>
#> [1] C:/Users/inp099/Documents/R/winlibrary/3.6
#> [2] C:/Program Files/R/R3.6.0alpha/library