This analysis utilizes data from the Parvo ICU End of Shift Report submitted at the end of each shift. It has not been cross-validated against independent (and official) data sources like PetPoint of MyVolunteerPage, and therefore might contain some erroneous data.

Methodology

Using data submitted at the end of shifts via the Parvo ICU End of Shift Report, this analysis explores from the trends and patterns in the Parvo ICU over multiple years. Data spans from 2013-06-10 to 2016-03-27 and represents 1,927 total observations (e.g. End of Shift submissions).

Analysis has been broken down into three sections, (1) Volunteer/Staff, (2) Dogs in the ICU, and (3) Supplies Requests. The data for each section has been pre-processed from the Google Sheet where report submissions are recorded, and scripts/instructions for processing new data can be found on the Github page for this project.

Volunteers

Vols <- Numerical %>%
  select(Timestamp, Shift.Time) %>% # Grab the time and duration of shift
  bind_cols(Names$Vols) %>%         # Bind the table of volunteer attendence
  
  # Gather the table in long format by volunteer name
  gather(Volunteer, Value, -Timestamp, -Shift.Time) %>%
  filter(Value) %>%                 # Filter dates where vol wasn't there
  
  # Only vols with 10+ shifts
  group_by(Volunteer) %>% filter(9<n())

First, we’ll take a look at the volunteers and staff who were listed as a response to the Shift Staff/Volunteers question on the report. Responses have been modified to fix misspellings and standardize the format.

Responses lists names as a comma separated list, like the one below. The method of parsing names is fairly indiscreet, and identified a total of 102 unique names across all submissions. In an effort to reduce the noise, only names appearing 10 or more times have been counted. By applying this filter, the number of names counted was reduced to 57.

Additional complications arose from volunteers sharing the same first name. Sometimes submissions will specify which volunteer was present by including their last initial, but often this information is omitted. There is, therefore, a great deal of cross over among a few volunteers with common names, but unfortunately this is unavoidable.

Finally, in cases where a volunteer/staff was listed as training a new volunteer (e.g. Katie training Hunter), both the trainer and trainee have been counted.

Volunteer, Volunteer, …
Volunteer, Trainer training Trainee

Dogs in ICU

To add methods…

Supplies Requests

To add methods…


Volunteers

To begin, below is a table of the top 40 volunteers, sorted by the number of shifts for which they’ve been present. Displayed are columns indicating a few self-explanatory metrics (e.g. Cumulative Hours, Number of Shifts) as well as the first date the volunteer’s name appeared in the reports (First Shift).

Additionally, I’ve calculated the “Span of Days” that they’ve been involved by subtracting First Shift - Most Recent Shift (see Figure 3). Finally, the Days Since a Shift illustrates how many days have passed from the volunteer’s most recent shift and the most recent report submission.

Vols %>% group_by(Volunteer) %>%
  filter(Volunteer!="Katie", Volunteer!="Emily") %>%
  summarise(
    Shifts = n(),
    Hours.sum = sum(Shift.Time),
    Hours.med = median(Shift.Time),
    Start     = floor_date(min(Timestamp), "day"),
    Recent    = floor_date(max(Timestamp), "day")
  ) %>%
  mutate(Span = as.numeric(Recent-Start)) %>% ungroup() %>%
  mutate(Days.Since = as.numeric(max(Recent)-Recent)/86400) %>%
  select(`Cumulative Hours`=Hours.sum, Volunteer, `Number of Shifts`=Shifts, 
         `First Shift`=Start, `Span of Days`=Span, `Days Since a Shift`=Days.Since) %>%
  arrange(desc(`Number of Shifts`)) %>% 
  slice(1:40) %>% 
  formattable::formattable(list(
      `Cumulative Hours`   = formattable::color_tile("white", "orange", 0.1),
      `Span of Days`       = formattable::color_tile("#C26B51", "#529985", alpha=0.01),
      `Number of Shifts`   = formattable::normalize_bar("green", 0.1),
      `Days Since a Shift` = formattable::normalize_bar("red", 0.1)))
Cumulative Hours Volunteer Number of Shifts First Shift Span of Days Days Since a Shift
428.5 Stasha 214 2014-05-06 535 156
265.5 Emily M 172 2013-06-14 996 21
327 Amy 145 2013-06-13 993 25
220 Sara 141 2013-06-11 930 90
272.5 Nipuni 135 2013-06-10 533 488
281 Nicole 131 2013-06-21 922 88
259.5 Hunter 128 2014-08-14 590 1
276 Kumiko 107 2013-06-10 1014 7
224 Shelby 99 2013-06-22 1009 0
146 Sara C 96 2013-07-09 902 90
175 Amanda 94 2014-06-05 340 321
155.5 Michael 93 2014-06-04 662 0
187.5 Peggy 91 2013-06-11 1013 7
165 Shanti 89 2014-09-09 543 22
147.5 Keri 86 2014-09-10 455 109
134 Michaela 85 2014-06-04 445 217
138.5 Martha 84 2013-11-18 786 74
155.5 Breanne 83 2014-03-31 431 296
119.5 Will 76 2015-03-03 264 126
134.5 Grace 68 2014-11-12 276 225
121 Melissa 68 2013-06-12 791 228
190.5 Erica 66 2015-08-25 213 2
128.5 Genevieve 61 2015-02-11 407 3
110 Rebecca 55 2013-06-15 729 287
121 Carol 54 2015-05-12 280 40
121 Ayari 53 2013-06-15 1009 7
118.5 Carolina 53 2015-05-12 280 40
82.5 Kevin 52 2013-06-16 527 488
104 Joanna 49 2013-06-12 168 851
63.5 Kelsey 49 2013-11-07 152 719
82 Anne 44 2015-05-19 295 18
111.5 Marina 43 2015-10-30 148 1
105 Bobbie 42 2015-09-18 165 26
80.5 Natalie 42 2015-07-28 241 2
91.5 Christopher 41 2015-04-21 164 177
105.5 Daniel 41 2014-03-21 730 7
92.5 Alicia 40 2013-06-11 435 585
112.5 Lauren 40 2013-06-14 1015 2
89 Maria 35 2013-06-14 378 639
55 Collin 34 2014-01-05 137 675

Ranking By Total Hours

df <- Vols %>% group_by(Volunteer) %>% 
  summarise(N=n(), Hours = sum(Shift.Time)) %>% arrange(desc(Hours)) %>%
  filter(Volunteer!="Katie") %>%
  mutate(CD=cume_dist(Hours), R=percent_rank(Hours)) 
df %>%
  ggplot(aes(x=CD, y=N, size=Hours, label=Volunteer, alpha=R)) + 
  geom_point() + geom_label_repel(data=filter(df, R>.25), show.legend=F) +
  guides(alpha=F) + theme_fivethirtyeight() + theme(axis.title = element_text()) +
  scale_x_continuous(labels=percent) + 
  labs(x="Percentile", y="Number of Shifts", title="Volunteer/Staff Ranking",
       subtitle="Percentile by Total Hours")
Figure 1

Figure 1

rm(df)  

Volunteers Correlations

Below is a correlation matrix represented as a heatmap. The values (colors of the blocks) the correlation co-efficient of the number of shifts worked per week by using the pearson method. Higher values represent an increased likelihood that those two volunteers volunteered during the same week.

df <- Vols %>%
  group_by(Volunteer, Week=floor_date(Timestamp, "week")) %>%
  summarise(Shifts = n()) %>%
  spread(Volunteer, Shifts, fill = 0) 

row.names(df) <- df$Week
df$Week <- NULL
cor(df) %>% d3heatmap::d3heatmap()
rm(df)

The numerical value (the number between -1 and 1 displayed when you hover over a cell) is probably of little practical significance, but the general clustering (represented by “chunks” of similar colors, or by the dendograms on either side of the plot) do help to highlight different clusters of volunteers.

### By Weekday + AM/PM 
# Next, we'll look at another heatmap. This time, however, the numerical values 
# are indicative of the number of shifts that each volunteer has been present for
# at each time of the day/week. 

df <- Vols %>%
  filter(Volunteer!="Katie") %>%
  group_by(Volunteer, wkday=paste(wday(Timestamp, label = T), 
                                  ifelse(am(Timestamp), "AM", "PM"))) %>%
  summarise(Shifts = n()) %>%
  filter(10<sum(Shifts)) %>%
  spread(Volunteer, Shifts, fill = 0) 

row.names(df) <- df$wkday
df$wkday <- NULL
t(df) %>% d3heatmap::d3heatmap(scale="row")
rm(df)

# This figure is colored relative to each volunteer (i.e. by row), so it 
# highlights what days/time each volunteer prefers. The most useful conclusion we
# may derive here is the noticable lack of crossover between AM and PM volunteers.

Engagement Over Time

Note: Figures 3-5 only include data from volunteers with more than 10 shifts total

This figure demonstrates the patterns of shifts by each volunteer over the duration of their time as a Parvo volunteer/staff. Each point represents one shift, and points are colored by how long the shift lasted.

Vols %>% 
  group_by(Volunteer) %>%
  mutate(First = min(Timestamp)) %>%
  ggplot(aes(x=reorder(factor(Volunteer), First), y=Timestamp)) + 
  geom_violin() +
  geom_point(aes(color=Shift.Time), alpha=0.5) + 
  
  scale_color_continuous_tableau(name="Shift Duration") +
  theme_fivethirtyeight() + theme(axis.title = element_text()) +
  scale_y_datetime(date_labels = "%b %y", date_breaks="3 months") +
  labs(x="Volunteer/Staff", y="", title="Volunteer/Staff Activity Over Time",
       subtitle="For Volunteers/Staff with 10+ Shifts") +
  coord_flip()
Figure 3

Figure 3

Compared to other volunteer oppurtunites at Austin Pets Alive!, Parvo actually has a very high reternion rate, especially among those who have been here for over a year.

Monthly Engagement

Another way to conceptualize our retention/engagement rate might be to look at how the number of shifts a volunteer has (y-axis) changes with how long they have been active (x-axis). In the figure below, rough visual “calculations” can be made to indicate the retention rate (the distributuion of points in the x direction) and engagement rate (the slope of the points).

df <- Vols %>% 
  filter(Volunteer!="Katie", Volunteer!="Emily") %>%
  group_by(Volunteer, Month=floor_date(Timestamp, "month")) %>%
  summarise(Shifts=n(), Shift.Time=sum(Shift.Time)) %>%
  filter(Shifts>0) %>%
  group_by(Volunteer) 

df %>%
  summarise(Shift.Time=sum(Shift.Time), Months=n(), Shifts=sum(Shifts)) %>%
  ggplot(aes(x=Months, y=Shifts)) + 
  geom_smooth(alpha=0.2, color="#819e15") +
  geom_point(aes(size=Shift.Time), alpha=0.3) + geom_point(color="#dd5928") +
  geom_text_repel(aes(label=Volunteer, size=Shift.Time), show.legend=F) +
  theme_fivethirtyeight() + theme(axis.title = element_text()) +
  scale_size_continuous(name="Total Hours") +
  labs(x="Months Active", y="Number of Shifts", 
       title="Number of Shifts by Months Active")
Figure 4

Figure 4

To better illustrate the “engagemnet rate”, below are boxplots illustrating how often (per month) volunteers come in to the ICU. Although Figure 5 might appear to be visually similar to Figure 3, they are NOT measuring the same data.

df %>%
  mutate(Shift.Time=sum(Shift.Time), Months=n()) %>%
  ggplot(aes(x=reorder(Volunteer, Shift.Time), y=Shifts)) + 
  geom_boxplot(aes(fill=Shift.Time), alpha=0.7) +
  
  scale_fill_continuous_tableau(name="Total Hours") +
  theme_fivethirtyeight() + theme(axis.title = element_text()) +
  labs(x="Volunteer/Staff", y="Shifts Per Month", title="Shifts Per Month by Volunteer",
       subtitle="For Volunteers/Staff with 10+ Shifts") +
  coord_flip()
Figure 5

Figure 5

rm(df)  

Work in Progress

I need to do some work on this one, but ideally this will show how volunteer’s engagement changes over their “lifecourse” as a volunteer.

Vols %>% 
  group_by(Volunteer) %>%
  mutate(
    Hours = order_by(Timestamp, cumsum(Shift.Time)),
    # Start = floor_date(min(Timestamp), "day"),
    ddif = as.numeric(as.duration(interval(floor_date(min(Timestamp), "day"), floor_date(Timestamp, "day")))/86400),
    Len  = max(ddif)) %>%
  filter(Volunteer!="Katie") %>%
  ggplot(aes(x=ddif, y=Hours, group=Volunteer)) + geom_line(aes(color=Len)) + 
  labs(x="Days since start")
Figure 6

Figure 6

Vols %>% 
  group_by(Volunteer, Week=floor_date(Timestamp, "week")) %>%
  summarise(Shifts=n(), Shift.Time=sum(Shift.Time)) %>%
  filter(Shifts>0) %>% 
  group_by(Month=floor_date(Week, "month")) %>% mutate(nVols.m = n_distinct(Volunteer)) %>%
  group_by(Week, Month, nVols.m) %>% summarise(
    nVols.wk = n_distinct(Volunteer),
    Shift.Time = mean(Shift.Time)) %>% ungroup() %>%
  filter(as.Date(Week)<ymd("2016-03-27")) %>%
  # View()
  ggplot() + 
  geom_point(aes(x=Week, y=nVols.wk, size=Shift.Time, color=nVols.wk), alpha=0.5) +
  
  geom_smooth(aes(x=Week, y=nVols.wk), color="#819e15") +
  scale_size_continuous(name="Avg Shift Time (by week)") +
  scale_color_continuous_tableau(palette = 'Blue') + guides(color=F) + 
  theme_fivethirtyeight() + theme(axis.title = element_text()) +
  scale_x_datetime(date_labels = "%b %y", date_breaks="3 months") +
  labs(x="", y="Unique Volunteers", title="Unique Volunteers Per Week")
Figure 7

Figure 7

Dogs in ICU

By Dog’s Level

First, we’ll run an unadjusted linear model based on the number of dogs at each level that are in the ICU

Dogs <- tbl_df(Numerical) %>%
  mutate(
    Date = floor_date(Timestamp-hours(3), "day"),
    AM   = am(Timestamp-hours(ceiling(Shift.Time)))) %>%
  select(Date, AM, Duration=Shift.Time, Vols=Count_Vols, Total=Dogs.in.ICU,
         Critical=Count_Crt, Intermediate=Count_Int, Well=Count_Wel, Timestamp) %>%
  mutate(AM = ifelse(AM, "AM", "PM")) %>%
  gather(Level, Dogs, Critical:Well) 

Linear Model

Mean Number of Dogs

It’s difficult to extrapolate the seasonal trends based on two springs, but if we assume that this sinusoidal pattern were to continue, we should expect a huge peak this summer, since March is only the beginning of the upswing for Parvo season.

Yearly Patterns

df <- Dogs %>% 
  group_by(Level, Week=floor_date(Date, "week")) %>% 
  summarise(Avg=mean(as.numeric(Dogs))) %>%
  mutate(Year = year(Week), Day = yday(Week))

Dogs %>%     
  mutate(Year = year(Date), Day = yday(Date)) %>%
  ggplot(aes(x=Day, y=Dogs, color=factor(Year))) + facet_wrap("Level", ncol=1) +
  geom_jitter(alpha=0.15) + geom_smooth(linetype=2) + 
  # geom_line(aes(color=Level, x=Day, y=Avg), alpha=0.9, data=df) +
  # facet_wrap("Year") +
  scale_color_brewer(palette = "BrBG", name="Year") + 
  theme_fivethirtyeight() + theme(
    axis.title         = element_text(),
    panel.grid.minor   = element_line(color="#e6e6e6"), 
    panel.grid.minor.y = element_blank()) +
  labs(x="", title="Number of Dogs Over Time (By Year)", 
       subtitle="Faceted by the levels") 

Variance

But obviously, there’s a whole lot of variance from the mean

Dogs %>% 
  group_by(Level, m=floor_date(Date, "month")) %>% 
  group_by(Level) %>% mutate(
    Year = year(m),
    Month = month(m, label=T)) %>%
  ggplot((aes(x=Month, y=Dogs, fill=Level))) + geom_boxplot() +
  theme_fivethirtyeight() + theme(
    axis.title         = element_text(),
    panel.grid.minor   = element_line(color="#e6e6e6"), 
    panel.grid.minor.y = element_blank(),
    strip.background  = element_rect(fill="#e3e3e3")) +
  facet_grid(Year~Level)

Dogs %>% 
  group_by(Level, Month=floor_date(Date, "month")) %>% 
  summarise(Avg=mean(as.numeric(Dogs))) %>%
  group_by(Month) %>% mutate(Avg.Total = sum(Avg)) %>%
  group_by(Level) %>% mutate(
    Year = year(Month),
    Month = month(Month, label=T),
    Avg = round(Avg, 2),
    Avg.Total = round(Avg.Total, 2)) %>%
  ggplot(aes(x=factor(Year), y=Month, label=Avg, fill=Avg.Total, alpha=Avg)) + 
  geom_bin2d() + geom_text(aes(size=Avg), color="black", alpha=1) +
  coord_flip() + facet_wrap("Level", ncol=1) +
  scale_fill_distiller(palette = "BrBG", name="Total In ICU") +
  guides(size=F, alpha=F) + theme_fivethirtyeight() +
  theme(panel.grid=element_blank(), strip.background  = element_rect(fill="#e3e3e3"))+
  labs(y="", x="", title="Average Number of Dogs by Level (Monthly)",
       subtitle="The size of the numbers & transperancy of the bin is proportional to the level's number")

Inventory/Supplies

Create a data.frame of all the Inventory requests

Supplies <- Inventory %>%
  select(Timestamp) %>% 
  bind_cols(Inventory$Invn.Supplies) %>% select(-`NA`, -None) %>%
  bind_cols(Inventory$Invn.Medications) %>% select(-`NA`, -None) %>%
  bind_cols(Inventory$Invn.MedSupplies) %>% select(-`NA`, -None) %>%
  gather(Supply, Value, -Timestamp) %>%
  filter(!is.na(Value)) %>%
  filter(Value) 

Tracking the request over time

df <- Supplies %>%
      group_by(Supply, Week=floor_date(Timestamp, "week")) %>%
      summarise(Requests.Week = n()) %>% spread(Supply, Requests.Week, fill = 0) 

row.names(df) <- df$Week
df$Week <- NULL
# as.matrix(df) %>% t() %>% fpc::pamk() %>% plot()
# 
# # By columns, bootstraps to find good p-value
# require(pvclust)
# pv <- df %>% scale(center=T, scale=F) %>% pvclust(method.hclust="ward.D", method.dist="euclidean") 
# pv %>% plot() # dendogram with p values
# pv %>% pvrect(alpha=0.95) # add rectangles around groups highly supported by the data


Numerical %>% 
  # Group by the time sent minus 3 hours b/c timestamp may be @ 1:00 AM
  group_by(Date = floor_date(Timestamp-hours(3), "day")) %>%
  summarise(Dogs = mean(Dogs.in.ICU)) %>%
  group_by(Week=floor_date(Date, "week")) %>%
  summarise(Dog.Days = sum(Dogs)) %>%
  left_join(
    Supplies %>%
      group_by(Supply, Week=floor_date(Timestamp, "week")) %>%
      summarise(Requests.Week = n())
  ) %>%
  # ggplot(aes(x=Requests.Week, y=Dog.Days)) + geom_jitter() + facet_wrap("Supply")
  ggplot(aes(x=Week, y=Supply)) + 
  geom_rug(sides = "b", aes(alpha=Dog.Days, color=Dog.Days/7), size=2) +
  geom_tile(aes(fill=Requests.Week)) + 
  scale_x_datetime(date_labels = "%b %y", date_breaks="2 months") +
  scale_fill_continuous_tableau(name="Requests Per Week") + 
  scale_color_gradient2(name="Dogs In ICU") + 
  guides(alpha=F) + theme_fivethirtyeight() +
  labs(title="Weekly Inventory Requests Over Time",
       subtitle="P.S. We need more Turkey & Chicken Sticks")


Supplies %>% count(Supply, sort=T)
## Source: local data frame [59 x 2]
## 
##                  Supply     n
##                   <chr> <int>
## 1                Turkey   319
## 2        Chicken Sticks   266
## 3   Variety Canned food   234
## 4             Baby Food   221
## 5                Bleach   158
## 6            Famotidine   156
## 7  Cefazolin/Ampicillin   146
## 8               Anzemet   141
## 9                   LRS   121
## 10         3cc Syringes   117
## ..                  ...   ...

A pretty uneventful correlation matrix visualized as a heatmap

df <- Supplies %>% group_by(Supply, Week=floor_date(Timestamp, "week")) %>%
  summarise(Count = n()) %>%
  spread(Supply, Count, fill = 0) 
row.names(df) <- df$Week
df$Week <- NULL
df <- cor(df) 
df[df<0] <- 0
df %>% d3heatmap::d3heatmap()
rm(df)
Numbers %>%
  ggplot(aes(x=yrday, y=Durt.Shft*Vols.Num)) + 
  geom_jitter(aes(color=Durt.Shft)) +
  geom_smooth() +
  scale_color_continuous_tableau(name="Shift Duration") +
  theme_fivethirtyeight() + theme(axis.title = element_text()) +
  # scale_x_datetime(date_labels = "%b %y", date_breaks="3 months") +
  labs(x="Day of Year", y="Volunteer Hours") + facet_wrap("yr", ncol=1)


Numbers %>% 
  filter(Vols.Num<=5) %>%
  mutate(m = month(Date, label = T, abbr = T)) %>%
  ggplot(aes(x=Durt.Shft, y=Dogs)) + 
  geom_jitter(aes(color=factor(Vols.Num)), alpha=0.6) +
  
  facet_grid(m~yr) + xlim(c(0,6)) +
  scale_color_brewer(palette="Spectral", name="Volunteers") +
  theme_dark() + 
  
  labs(x="Shift Duration (hours)", y="Number of Dogs",
       title="Dogs in Parvo Ward -vs- Duration of Shift",
       subtitle="Colored by number of volunteers & faceted by month")


Numbers %>% 
  filter(Vols.Num<=5) %>%
  mutate(m = month(Date, label = T, abbr = T)) %>%
  ggplot(aes(x=Durt.Shft, fill=factor(yr))) + 
  geom_density(alpha=0.4) +
  
  facet_grid(m~Vols.Num) + xlim(c(0,6)) +
  scale_fill_brewer(palette="Spectral", name="Volunteers") +
  theme_dark() + 
  
  labs(x="Shift Duration (hours)", y="Number of Dogs",
       title="Dogs in Parvo Ward -vs- Duration of Shift",
       subtitle="Colored by number of volunteers & faceted by month")
df <- Numerical %>%
  mutate(
    Date = floor_date(Timestamp-hours(3), "day"),
    AM   = am(Timestamp-hours(ceiling(Shift.Time)))) %>%
  select(Date, AM, Duration=Shift.Time, Vols=Count_Vols, Total=Dogs.in.ICU,
         Critical=Count_Crt, Intermediate=Count_Int, Well=Count_Wel, Timestamp) %>%
  mutate(
    Time = ifelse(AM, "AM", "PM"),
    Reported  = Duration*60,
    Submitted = ifelse(Time=="AM", 
                       60*(hour(Timestamp)-8)+minute(Timestamp),
                       60*(hour(Timestamp)-19)+minute(Timestamp)),
    Duration = ifelse(Submitted-Reported<60*3 & Submitted-Reported>0, Submitted, Reported)) 
  
l <- lm(Duration~Critical+Intermediate+Well+Vols+Time-1, data=df)
broom::tidy(l)

broom::glance(l)[1:6] %>% knitr::kable()
--- LICENSE ---

Copyright (C) 2016 Hunter Ratliff

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

In the spirit of Reproducible Research, below is the information About the R Session at the time it was compiled:

devtools::session_info()
##  setting  value                       
##  version  R version 3.2.4 (2016-03-10)
##  system   x86_64, darwin13.4.0        
##  ui       X11                         
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  tz       America/Chicago             
##  date     2016-05-22                  
## 
##  package      * version     date      
##  assertthat     0.1         2013-12-06
##  base64enc      0.1-3       2015-07-28
##  broom        * 0.4.0       2016-05-03
##  colorspace     1.2-6       2015-03-11
##  d3heatmap      0.6.1.1     2016-05-03
##  DBI            0.4         2016-05-02
##  devtools       1.11.1.9000 2016-05-10
##  digest         0.6.9       2016-01-08
##  dplyr        * 0.4.3.9001  2016-05-03
##  evaluate       0.9         2016-04-29
##  formatR        1.4         2016-05-09
##  formattable    0.1.7.1     2016-05-22
##  ggplot2      * 2.1.0       2016-05-03
##  ggrepel      * 0.5.1       2016-05-10
##  ggthemes     * 3.0.2       2016-05-03
##  gtable         0.2.0       2016-02-26
##  highr          0.6         2016-05-09
##  htmltools      0.3.5       2016-03-21
##  htmlwidgets    0.6         2016-02-25
##  httpuv         1.3.3       2015-08-04
##  jsonlite       0.9.20      2016-05-10
##  knitr          1.13        2016-05-09
##  labeling       0.3         2014-08-23
##  lattice        0.20-33     2015-07-14
##  lazyeval       0.1.10      2015-01-02
##  lubridate    * 1.5.6.9000  2016-05-03
##  magrittr       1.5         2014-11-22
##  markdown       0.7.7       2015-04-22
##  Matrix         1.2-4       2016-03-02
##  memoise        1.0.0       2016-01-29
##  mgcv           1.8-12      2016-03-03
##  mime           0.4         2015-09-03
##  mnormt         1.5-4       2016-03-09
##  munsell        0.4.3       2016-02-13
##  nlme           3.1-125     2016-02-27
##  plyr           1.8.3       2015-06-12
##  png            0.1-7       2013-12-03
##  psych          1.5.8       2015-08-30
##  R6             2.1.2       2016-01-26
##  RColorBrewer   1.1-2       2014-12-07
##  Rcpp           0.12.5      2016-05-14
##  reshape2       1.4.1       2014-12-06
##  rmarkdown      0.9.6       2016-05-01
##  scales       * 0.4.0       2016-02-26
##  shiny          0.13.2.9003 2016-05-03
##  stringi        1.0-1       2015-10-22
##  stringr        1.0.0       2015-04-30
##  tibble         1.0-1       2016-05-03
##  tidyr        * 0.4.1       2016-02-05
##  withr          1.0.1       2016-02-04
##  xtable         1.8-2       2016-02-05
##  yaml           2.1.13      2014-06-12
##  source                                 
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.0)                         
##  Github (dgrtwo/broom@6a659be)          
##  CRAN (R 3.2.0)                         
##  Github (rstudio/d3heatmap@57d9756)     
##  CRAN (R 3.2.5)                         
##  Github (hadley/devtools@46bcd74)       
##  CRAN (R 3.2.3)                         
##  Github (hadley/dplyr@3074cf7)          
##  CRAN (R 3.2.5)                         
##  cran (@1.4)                            
##  Github (renkun-ken/formattable@9e6511d)
##  Github (hadley/ggplot2@59c503b)        
##  Github (slowkow/ggrepel@847b714)       
##  Github (jrnold/ggthemes@331d830)       
##  CRAN (R 3.2.3)                         
##  cran (@0.6)                            
##  CRAN (R 3.2.4)                         
##  CRAN (R 3.2.3)                         
##  CRAN (R 3.2.0)                         
##  cran (@0.9.20)                         
##  cran (@1.13)                           
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.0)                         
##  Github (hadley/lubridate@ea468cd)      
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.4)                         
##  CRAN (R 3.2.3)                         
##  CRAN (R 3.2.4)                         
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.4)                         
##  CRAN (R 3.2.3)                         
##  CRAN (R 3.2.4)                         
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.3)                         
##  CRAN (R 3.2.0)                         
##  cran (@0.12.5)                         
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.5)                         
##  CRAN (R 3.2.3)                         
##  Github (rstudio/shiny@7e303b4)         
##  CRAN (R 3.2.0)                         
##  CRAN (R 3.2.0)                         
##  Github (hadley/tibble@cb38672)         
##  CRAN (R 3.2.3)                         
##  CRAN (R 3.2.3)                         
##  CRAN (R 3.2.3)                         
##  CRAN (R 3.2.0)