In this guest blog entry, Randall Pruim offers an alternative way based on a different formula interface. Here's Randall:
For a number of years I and several of my colleagues have been teaching R to beginners using an approach that includes a combination of
- the
lattice
package for graphics, - several functions from the
stats
package for modeling (e.g.,lm(), t.test()
), and - the
mosaic
package for numerical summaries and for smoothing over edge cases and inconsistencies in the other two components.
goal ( y ~ x , data = mydata, ... )
Many data analysis operations can be executed by filling in four pieces of information (goal, y, x, and mydata) with the appropriate information for the desired task. This allows students to become fluent quickly with a powerful, coherent toolkit for data analysis.
Trouble in paradise
As the earlier post noted, the use of
lattice
has some drawbacks. While basic graphs like histograms, boxplots, scatterplots, and quantile-quantile plots are simple to make with lattice
, it is challenging to combine these simple plots into more complex plots or to plot data from multiple data sources. Splitting data into subgroups and either overlaying with multiple colors or separating into sub-plots (facets) is easy, but the labeling of such plots is not as convenient (and takes more space) than the equivalent plots made with ggplot2
. And in our experience, students generally find the look of ggplot2
graphics more appealing.
On the other hand, introducing
ggplot2
into a first course is challenging. The syntax tends to be more verbose, so it takes up more of the limited space on projected images and course handouts. More importantly, the syntax is entirely unrelated to the syntax used for other aspects of the course. For those adopting a “Less Volume, More Creativity” approach, ggplot2
is tough to justify.
ggformula: The third-and-a half way
Danny Kaplan and I recently introduced
ggformula
, an R package that provides a formula interface to ggplot2
graphics. Our hope is that this provides the best aspects of lattice
(the formula interface and lighter syntax) and ggplot2
(modularity, layering, and better visual aesthetics).
For simple plots, the only thing that changes is the name of the plotting function. Each of these functions begins with
gf
. Here are two examples, either of which could replace the side-by-side boxplots made with lattice
in the previous post.
We can even overlay these two types of plots to see how they compare. To do so, we simply place what I call the "then" operator (
%>%
, also commonly called a pipe) between the two layers and adjust the transparency so we can see both where they overlap.
Comparing groups
Groups can be compared either by overlaying multiple groups distinguishable by some attribute (e.g., color)
or by creating multiple plots arranged in a grid rather than overlaying subgroups in the same space. The
ggformula
package provides two ways to create these facets. The first uses |
very much like lattice
does. Notice that the gf_lm()
layer inherits information from the the gf_points()
layer in these plots, saving some typing when the information is the same in multiple layers.
The second way adds facets with
gf_facet_wrap()
or gf_facet_grid()
and can be more convenient for complex plots or when customization of facets is desired.
Fitting into the tidyverse work flow
ggformala
also fits into a tidyverse-style workflow (arguably better than ggplot2
itself does). Data can be piped into the initial call to a ggformula
function and there is no need to switch between %>%
and +
when moving from data transformations to plot operations.
Summary
The “Less Volume, More Creativity” approach is based on a common formula template that has served well for several years, but the arrival of
ggformula
strengthens this approach by bringing a richer graphical system into reach for beginners without introducing new syntactical structures. The full range of ggplot2
features and customizations remains available, and the ggformula
package vignettes and tutorials describe these in more detail.
lm() is largely out of our control, and I don't think it is a good idea to write a replacement for lm().
ReplyDeleteFor numerical summaries, take a look at df_stats(). I think you will find it does what you want and interoperates well with ggformula. In particular, it always returns a tidy data frame (hence the d in df_stats). Here is an example:
require(mosaic)
HELPrct %>% filter(sex == "male") %>% df_stats(age ~ substance, mean, median)
## substance mean_age median_age
## 1 alcohol 37.95035 38.0
## 2 cocaine 34.36036 33.0
## 3 heroin 33.05319 32.5
Great Informative post. You have given a very good information about SAS and R. I really appreciate your work.
ReplyDeleteThanks
Siva Prasad
This comment has been removed by a blog administrator.
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteThis comment has been removed by a blog administrator.
ReplyDeleteThis comment has been removed by a blog administrator.
ReplyDeleteThis comment has been removed by a blog administrator.
ReplyDeleteThis comment has been removed by a blog administrator.
ReplyDeleteThis comment has been removed by a blog administrator.
ReplyDeleteThis comment has been removed by a blog administrator.
ReplyDelete