## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4 ) ## ----------------------------------------------------------------------------- library(PiChange) library(ggplot2) data("google_mobility_workplaces") run_region <- function(region, event_dates) { region_data <- google_mobility_workplaces[ google_mobility_workplaces$region == region, ] y <- region_data$workplaces_percent_change_from_baseline penalty <- construct_penalty( time = region_data$date, centers = as.Date(event_dates), width = 30, method = "mbic", family = "normal" ) fit <- pi_change(y, penalty, min_seg_len = 30) list( data = region_data, fit = fit, centers = penalty$prior$center_indices, change_indices = changepoints(fit) ) } us_events <- c("2020-03-15", "2020-05-01", "2020-12-11", "2021-03-11", "2022-08-16") uk_events <- c("2020-03-23", "2020-06-08", "2020-10-31", "2020-12-02", "2020-12-08", "2020-12-26", "2021-03-29", "2022-02-24") fits <- list( "United States" = run_region("United States", us_events), "New York City" = run_region("New York City", us_events), "United Kingdom" = run_region("United Kingdom", uk_events), "London" = run_region("London", uk_events) ) data.frame( region = rep(names(fits), lengths(lapply(fits, `[[`, "change_indices"))), date = do.call(c, lapply(fits, function(x) x$data$date[x$change_indices])) ) ## ----fig.height=6------------------------------------------------------------- plot( fits[["United States"]]$fit, ylab = "Workplace mobility percent change", title = "United States workplace mobility" ) ## ----------------------------------------------------------------------------- plot_data <- do.call(rbind, lapply(names(fits), function(region) { x <- fits[[region]] data.frame( date = x$data$date, region = region, workplaces_percent_change_from_baseline = x$data$workplaces_percent_change_from_baseline, segment_mean = fitted(x$fit), pi_change = seq_len(nrow(x$data)) %in% x$change_indices, prior_center = seq_len(nrow(x$data)) %in% x$centers ) })) ggplot(plot_data, aes(x = date, y = workplaces_percent_change_from_baseline)) + geom_line( aes(color = "Observed series", linetype = "Observed series"), linewidth = 0.4 ) + geom_line( aes(y = segment_mean, color = "Segment mean", linetype = "Segment mean"), linewidth = 0.4 ) + geom_vline( data = plot_data[plot_data$pi_change, ], aes( xintercept = date, color = "Detected change", linetype = "Detected change" ), linewidth = 0.8 ) + geom_vline( data = plot_data[plot_data$prior_center, ], aes( xintercept = date, color = "Prior center", linetype = "Prior center" ), linewidth = 0.8 ) + facet_wrap(~ region, ncol = 2) + scale_color_manual( values = c( "Observed series" = "#76BDE8", "Segment mean" = "#F06292", "Prior center" = "#D62728", "Detected change" = "#00C853" ) ) + scale_linetype_manual( values = c( "Observed series" = "solid", "Segment mean" = "solid", "Prior center" = "dashed", "Detected change" = "solid" ) ) + scale_x_date(date_breaks = "6 months", date_labels = "%b %Y") + labs( x = "Date", y = "Workplace mobility percent change", title = "Workplace mobility with PI-Change estimates", color = NULL, linetype = NULL ) + theme_minimal(base_size = 11) + theme( panel.grid.minor = element_blank(), panel.grid.major.x = element_blank(), legend.position = "top", legend.justification = "left", axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1) )