load_packages <- function(pkg_list) {
  for (pkg in pkg_list) {
    if (!require(pkg, character.only = TRUE)) {
      install.packages(pkg, dependencies = TRUE)
      library(pkg, character.only = TRUE)
    }
  }
}

packages <- c("tidyverse", "readxl", "pander")
load_packages(packages)

knitr::opts_chunk$set(echo = TRUE,      
                      warning = FALSE,   
                      message = FALSE,  
                      results = TRUE,
                      comment = NA,
                      fig.align = "center"
                      )   
url <- "https://raw.githubusercontent.com/ncbrechbill/STA321/refs/heads/main/STA321/BrooklynBridge.csv"
data <- read.csv(url)

data$AvgTemp <- (data$HighTemp + data$LowTemp) / 2

data <- data %>%
  mutate(data, PrecipFactor = ifelse(Precipitation > 0, "Yes", "No"))


model.quasi.freq <- glm(BrooklynBridge ~ AvgTemp + PrecipFactor + Day,
                        family = quasipoisson,
                        data = data)


qcoefs <- model.quasi.freq$coefficients

qnomon <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[4])
qnotue <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[8])
qnowed <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[9])
qnothu <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[7])
qnofri <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp))
qnosat <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[5])
qnosun <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[6])

qyesmon <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[3] + qcoefs[4])
qyestue <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[3] + qcoefs[8])
qyeswed <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[3] + qcoefs[9])
qyesthu <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[3] + qcoefs[7])
qyesfri <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[3])
qyessat <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[3] + qcoefs[5])
qyessun <- exp(qcoefs[1] + (qcoefs[2]*data$AvgTemp) + qcoefs[3] + qcoefs[6])

plot_quasi_no <- data.frame(
  AvgTemp = data$AvgTemp,
  Monday = qnomon,
  Tuesday = qnotue,
  Wednesday = qnowed,
  Thursday = qnothu,
  Friday = qnofri,
  Saturday = qnosat,
  Sunday = qnosun
)

plot_quasi_long.no <- pivot_longer(
  plot_quasi_no,
  cols = -AvgTemp,
  names_to = "Day",
  values_to = "ModeledCount"
)


plot_quasi_yes <- data.frame(
  AvgTemp = data$AvgTemp,
  Monday = qyesmon,
  Tuesday = qyestue,
  Wednesday = qyeswed,
  Thursday = qyesthu,
  Friday = qyesfri,
  Saturday = qyessat,
  Sunday = qyessun
)

plot_quasi_long.yes <- pivot_longer(
  plot_quasi_yes,
  cols = -AvgTemp,
  names_to = "Day",
  values_to = "ModeledCount"
)

# Combine all modeled values
quasi_all_counts <- c(qnomon, qnotue, qnowed, qnothu, qnofri, qnosat, qnosun,
                qyesmon, qyestue, qyeswed, qyesthu, qyesfri, qyessat, qyessun)

# Get min and max for consistent y-axis
ymin <- min(quasi_all_counts)
ymax <- max(quasi_all_counts)

library(highcharter)

hchart(plot_quasi_long.no, "line", hcaes(x = AvgTemp, y = ModeledCount, group = Day)) %>%
  hc_title(text = "Brooklyn Bridge Bikers (No Precipitation)") %>%
  hc_yAxis(title = list(text = "Modeled Biker Count"), min = ymin, max = ymax) %>%
  hc_xAxis(title = list(text = "Average Temperature (°F)"))
hchart(plot_quasi_long.yes, "line", hcaes(x = AvgTemp, y = ModeledCount, group = Day)) %>%
  hc_title(text = "Brooklyn Bridge Bikers (With Precipitation)") %>%
  hc_yAxis(title = list(text = "Modeled Biker Count"), min = ymin, max = ymax) %>%
  hc_xAxis(title = list(text = "Average Temperature (°F)"))
LS0tDQp0aXRsZTogIkJyb29rbHluIEJyaWRnZSBCaWN5Y2xpbmcgVmlzdWFsaXphdGlvbiBXZWJsZXQiDQphdXRob3I6ICJOb2FoIEJyZWNoYmlsbCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX3dpZHRoOiA2DQogICAgZmlnX2hlaWdodDogNg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KZWRpdG9yX29wdGlvbnM6IA0KICBtYXJrZG93bjogDQogICAgd3JhcDogNzINCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQovKiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIChDU1MpIGlzIGEgc3R5bGVzaGVldCBsYW5ndWFnZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcmVzZW50YXRpb24gb2YgYSBkb2N1bWVudCB3cml0dGVuIGluIEhUTUwgb3IgWE1MLiBpdCBpcyBhIHNpbXBsZSBtZWNoYW5pc20gZm9yIGFkZGluZyBzdHlsZSAoZS5nLiwgZm9udHMsIGNvbG9ycywgc3BhY2luZykgdG8gV2ViIGRvY3VtZW50cy4gKi8NCg0KaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8NCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBhdXRob3JzICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIycHg7DQogICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQpgYGANCg0KYGBge3IgcGFja2FnZXMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsb2FkX3BhY2thZ2VzIDwtIGZ1bmN0aW9uKHBrZ19saXN0KSB7DQogIGZvciAocGtnIGluIHBrZ19saXN0KSB7DQogICAgaWYgKCFyZXF1aXJlKHBrZywgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkgew0KICAgICAgaW5zdGFsbC5wYWNrYWdlcyhwa2csIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICAgICBsaWJyYXJ5KHBrZywgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KICAgIH0NCiAgfQ0KfQ0KDQpwYWNrYWdlcyA8LSBjKCJ0aWR5dmVyc2UiLCAicmVhZHhsIiwgInBhbmRlciIpDQpsb2FkX3BhY2thZ2VzKHBhY2thZ2VzKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAiY2VudGVyIg0KICAgICAgICAgICAgICAgICAgICAgICkgICANCnVybCA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL25jYnJlY2hiaWxsL1NUQTMyMS9yZWZzL2hlYWRzL21haW4vU1RBMzIxL0Jyb29rbHluQnJpZGdlLmNzdiINCmRhdGEgPC0gcmVhZC5jc3YodXJsKQ0KDQpkYXRhJEF2Z1RlbXAgPC0gKGRhdGEkSGlnaFRlbXAgKyBkYXRhJExvd1RlbXApIC8gMg0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShkYXRhLCBQcmVjaXBGYWN0b3IgPSBpZmVsc2UoUHJlY2lwaXRhdGlvbiA+IDAsICJZZXMiLCAiTm8iKSkNCg0KDQptb2RlbC5xdWFzaS5mcmVxIDwtIGdsbShCcm9va2x5bkJyaWRnZSB+IEF2Z1RlbXAgKyBQcmVjaXBGYWN0b3IgKyBEYXksDQogICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBxdWFzaXBvaXNzb24sDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCg0KDQpxY29lZnMgPC0gbW9kZWwucXVhc2kuZnJlcSRjb2VmZmljaWVudHMNCg0KcW5vbW9uIDwtIGV4cChxY29lZnNbMV0gKyAocWNvZWZzWzJdKmRhdGEkQXZnVGVtcCkgKyBxY29lZnNbNF0pDQpxbm90dWUgPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSArIHFjb2Vmc1s4XSkNCnFub3dlZCA8LSBleHAocWNvZWZzWzFdICsgKHFjb2Vmc1syXSpkYXRhJEF2Z1RlbXApICsgcWNvZWZzWzldKQ0KcW5vdGh1IDwtIGV4cChxY29lZnNbMV0gKyAocWNvZWZzWzJdKmRhdGEkQXZnVGVtcCkgKyBxY29lZnNbN10pDQpxbm9mcmkgPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSkNCnFub3NhdCA8LSBleHAocWNvZWZzWzFdICsgKHFjb2Vmc1syXSpkYXRhJEF2Z1RlbXApICsgcWNvZWZzWzVdKQ0KcW5vc3VuIDwtIGV4cChxY29lZnNbMV0gKyAocWNvZWZzWzJdKmRhdGEkQXZnVGVtcCkgKyBxY29lZnNbNl0pDQoNCnF5ZXNtb24gPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSArIHFjb2Vmc1szXSArIHFjb2Vmc1s0XSkNCnF5ZXN0dWUgPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSArIHFjb2Vmc1szXSArIHFjb2Vmc1s4XSkNCnF5ZXN3ZWQgPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSArIHFjb2Vmc1szXSArIHFjb2Vmc1s5XSkNCnF5ZXN0aHUgPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSArIHFjb2Vmc1szXSArIHFjb2Vmc1s3XSkNCnF5ZXNmcmkgPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSArIHFjb2Vmc1szXSkNCnF5ZXNzYXQgPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSArIHFjb2Vmc1szXSArIHFjb2Vmc1s1XSkNCnF5ZXNzdW4gPC0gZXhwKHFjb2Vmc1sxXSArIChxY29lZnNbMl0qZGF0YSRBdmdUZW1wKSArIHFjb2Vmc1szXSArIHFjb2Vmc1s2XSkNCg0KcGxvdF9xdWFzaV9ubyA8LSBkYXRhLmZyYW1lKA0KICBBdmdUZW1wID0gZGF0YSRBdmdUZW1wLA0KICBNb25kYXkgPSBxbm9tb24sDQogIFR1ZXNkYXkgPSBxbm90dWUsDQogIFdlZG5lc2RheSA9IHFub3dlZCwNCiAgVGh1cnNkYXkgPSBxbm90aHUsDQogIEZyaWRheSA9IHFub2ZyaSwNCiAgU2F0dXJkYXkgPSBxbm9zYXQsDQogIFN1bmRheSA9IHFub3N1bg0KKQ0KDQpwbG90X3F1YXNpX2xvbmcubm8gPC0gcGl2b3RfbG9uZ2VyKA0KICBwbG90X3F1YXNpX25vLA0KICBjb2xzID0gLUF2Z1RlbXAsDQogIG5hbWVzX3RvID0gIkRheSIsDQogIHZhbHVlc190byA9ICJNb2RlbGVkQ291bnQiDQopDQoNCg0KcGxvdF9xdWFzaV95ZXMgPC0gZGF0YS5mcmFtZSgNCiAgQXZnVGVtcCA9IGRhdGEkQXZnVGVtcCwNCiAgTW9uZGF5ID0gcXllc21vbiwNCiAgVHVlc2RheSA9IHF5ZXN0dWUsDQogIFdlZG5lc2RheSA9IHF5ZXN3ZWQsDQogIFRodXJzZGF5ID0gcXllc3RodSwNCiAgRnJpZGF5ID0gcXllc2ZyaSwNCiAgU2F0dXJkYXkgPSBxeWVzc2F0LA0KICBTdW5kYXkgPSBxeWVzc3VuDQopDQoNCnBsb3RfcXVhc2lfbG9uZy55ZXMgPC0gcGl2b3RfbG9uZ2VyKA0KICBwbG90X3F1YXNpX3llcywNCiAgY29scyA9IC1BdmdUZW1wLA0KICBuYW1lc190byA9ICJEYXkiLA0KICB2YWx1ZXNfdG8gPSAiTW9kZWxlZENvdW50Ig0KKQ0KDQojIENvbWJpbmUgYWxsIG1vZGVsZWQgdmFsdWVzDQpxdWFzaV9hbGxfY291bnRzIDwtIGMocW5vbW9uLCBxbm90dWUsIHFub3dlZCwgcW5vdGh1LCBxbm9mcmksIHFub3NhdCwgcW5vc3VuLA0KICAgICAgICAgICAgICAgIHF5ZXNtb24sIHF5ZXN0dWUsIHF5ZXN3ZWQsIHF5ZXN0aHUsIHF5ZXNmcmksIHF5ZXNzYXQsIHF5ZXNzdW4pDQoNCiMgR2V0IG1pbiBhbmQgbWF4IGZvciBjb25zaXN0ZW50IHktYXhpcw0KeW1pbiA8LSBtaW4ocXVhc2lfYWxsX2NvdW50cykNCnltYXggPC0gbWF4KHF1YXNpX2FsbF9jb3VudHMpDQoNCmxpYnJhcnkoaGlnaGNoYXJ0ZXIpDQoNCmhjaGFydChwbG90X3F1YXNpX2xvbmcubm8sICJsaW5lIiwgaGNhZXMoeCA9IEF2Z1RlbXAsIHkgPSBNb2RlbGVkQ291bnQsIGdyb3VwID0gRGF5KSkgJT4lDQogIGhjX3RpdGxlKHRleHQgPSAiQnJvb2tseW4gQnJpZGdlIEJpa2VycyAoTm8gUHJlY2lwaXRhdGlvbikiKSAlPiUNCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiTW9kZWxlZCBCaWtlciBDb3VudCIpLCBtaW4gPSB5bWluLCBtYXggPSB5bWF4KSAlPiUNCiAgaGNfeEF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiQXZlcmFnZSBUZW1wZXJhdHVyZSAowrBGKSIpKQ0KDQpoY2hhcnQocGxvdF9xdWFzaV9sb25nLnllcywgImxpbmUiLCBoY2Flcyh4ID0gQXZnVGVtcCwgeSA9IE1vZGVsZWRDb3VudCwgZ3JvdXAgPSBEYXkpKSAlPiUNCiAgaGNfdGl0bGUodGV4dCA9ICJCcm9va2x5biBCcmlkZ2UgQmlrZXJzIChXaXRoIFByZWNpcGl0YXRpb24pIikgJT4lDQogIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIk1vZGVsZWQgQmlrZXIgQ291bnQiKSwgbWluID0geW1pbiwgbWF4ID0geW1heCkgJT4lDQogIGhjX3hBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIkF2ZXJhZ2UgVGVtcGVyYXR1cmUgKMKwRikiKSkNCg0KDQpgYGANCg0KDQoNCg==