Load libraries.
library(stringr)
library(dplyr)
library(azmpdata)
library(multivaR)
#source('anomaly.R')
library(ggplot2)
library(gridExtra, warn.conflicts = FALSE)
Get test data files from Benoit. Once azmpdata is finished this section will be replaced by a query to azmpdata.
# test files
fp <- 'C:/Users/chisholme/desktop/April2020- March2021/Data Access/draft_csv/'
list_fn <- list.files(fp)
# list_fn <- 'Discrete_Occupations_Sections.csv'
# load in csv
for (i in 1:length(list_fn)){
# isolate df name
dfname <- gsub('(\\w+)\\.csv', '\\1', list_fn[i]) # thanks CL for the reg expression!
#dfname <- 'Derived_Occupations_Sections'
eval(parse(text = paste(dfname, '<- read.csv(file.path(fp, list_fn[i]))')))
}
head(Derived_Occupations_Sections)
NA
Calculate monthly and annual anomalies.Modified versions of Chantelle’s functions.
# test anomaly calcs
dd <- monthlyAnomaly(d = Derived_Occupations_Sections, climatologyYears = c(1999, 2010), var = 'integrated_chlorophyll_0_100')
dd <- monthlyAnomaly(d = dd, climatologyYears = c(1999, 2010), var = 'integrated_nitrate_0_50')
# test annual results
ddann <- annualAnomaly(d = dd, anomaly = 'integrated_chlorophyll_0_100_anomaly')
head(ddann)
Improvements to anomaly functions:
- account for possibility of data collection stretching between two months, and wanting one anomaly value (from one cruise)
- once cruise_id is incorporated into metadata an option will be written into the function to group data by cruise rather than month
- Ability to split data by section or station within data frame
- Benoit’s scripts split data by section or station before calculating anomalies
- Difference in calculations between Benoit and Chantelle versions
- Due to difference in calculating monthly vs annual climatology
# Benoit's method
df_data_filtered_l <- Derived_Occupations_Sections
df_data_filtered_l <- df_data_filtered_l %>%
select(., section, station, latitude, longitude, year, month, day, event_id, integrated_chlorophyll_0_100)
##--------------------------------------------------------------------------------------------
## annual climatology
df_climatology_annual_l <- df_data_filtered_l %>%
dplyr::filter(., year>=1999, year<=2010) %>%
dplyr::group_by(., year) %>% # removed group by section
dplyr::summarise(., mean=mean(integrated_chlorophyll_0_100, na.rm=TRUE), sd=sd(integrated_chlorophyll_0_100, na.rm=TRUE)) %>%
dplyr::ungroup(.)
`summarise()` ungrouping output (override with `.groups` argument)
##--------------------------------------------------------------------------------------------
## annual anomalies
df_anomaly_annual_l <- dplyr::left_join(df_data_filtered_l,
df_climatology_annual_l ,
by=c( "year")) %>% # removed section
dplyr::group_by(., year) %>%
dplyr::mutate(., value=(integrated_chlorophyll_0_100-mean)/sd) %>%
summarise(., annual_anomaly = mean(value, na.rm = TRUE)) %>%
dplyr::select(., year, annual_anomaly) %>%
dplyr::ungroup(.)
`summarise()` ungrouping output (override with `.groups` argument)
# compare Benoit and Chantelle methods
anncom <- cbind(df_anomaly_annual_l, ddann)
par(mar = c(5, 4, 4, 4) + 0.3) # Leave space for z axis
plot(anncom$year, anncom$integrated_chlorophyll_0_100_anomaly, type = 'l', col = 'red', ylab = '', xlab = 'Year') # first plot
par(new = TRUE)
axis(side = 2, col = 'red')
par(new = TRUE)
plot(anncom$year, anncom$annual_anomaly, type = "l", col = 'blue', axes = FALSE, bty = "n", xlab = "", ylab = "")
axis(side=4, at = pretty(range(anncom$annual_anomaly, na.rm = TRUE)), col = 'blue')
mtext("annual anomaly - Benoit", side=4, line=3, col = 'blue')
mtext("annual anomaly - Chantelle", side=2, line=3, col = 'red')

NA
NA
LS0tDQp0aXRsZTogIkFub21hbHkgRXhhbXBsZSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkxvYWQgbGlicmFyaWVzLg0KDQpgYGB7cn0NCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGF6bXBkYXRhKQ0KbGlicmFyeShtdWx0aXZhUikNCiNzb3VyY2UoJ2Fub21hbHkuUicpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSwgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkNCmBgYA0KDQoNCkdldCB0ZXN0IGRhdGEgZmlsZXMgZnJvbSBCZW5vaXQuIE9uY2UgYXptcGRhdGEgaXMgZmluaXNoZWQgdGhpcyBzZWN0aW9uIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBxdWVyeSB0byBhem1wZGF0YS4NCg0KYGBge3J9DQoNCiMgdGVzdCBmaWxlcw0KIGZwIDwtICdDOi9Vc2Vycy9jaGlzaG9sbWUvZGVza3RvcC9BcHJpbDIwMjAtIE1hcmNoMjAyMS9EYXRhIEFjY2Vzcy9kcmFmdF9jc3YvJw0KIGxpc3RfZm4gPC0gbGlzdC5maWxlcyhmcCkNCg0KICMgbGlzdF9mbiA8LSAnRGlzY3JldGVfT2NjdXBhdGlvbnNfU2VjdGlvbnMuY3N2Jw0KDQoNCiMgbG9hZCBpbiBjc3YNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGxpc3RfZm4pKXsNCiAgIyBpc29sYXRlIGRmIG5hbWUNCg0KICBkZm5hbWUgPC0gZ3N1YignKFxcdyspXFwuY3N2JywgJ1xcMScsIGxpc3RfZm5baV0pICMgdGhhbmtzIENMIGZvciB0aGUgcmVnIGV4cHJlc3Npb24hDQogICAgI2RmbmFtZSA8LSAnRGVyaXZlZF9PY2N1cGF0aW9uc19TZWN0aW9ucycNCiAgZXZhbChwYXJzZSh0ZXh0ID0gcGFzdGUoZGZuYW1lLCAnPC0gcmVhZC5jc3YoZmlsZS5wYXRoKGZwLCBsaXN0X2ZuW2ldKSknKSkpDQoNCn0NCg0KaGVhZChEZXJpdmVkX09jY3VwYXRpb25zX1NlY3Rpb25zKQ0KDQpgYGANCg0KQ2FsY3VsYXRlIG1vbnRobHkgYW5kIGFubnVhbCBhbm9tYWxpZXMuTW9kaWZpZWQgdmVyc2lvbnMgb2YgQ2hhbnRlbGxlJ3MgZnVuY3Rpb25zLg0KDQpgYGB7cn0NCg0KIyB0ZXN0IGFub21hbHkgY2FsY3MNCg0KZGQgPC0gbW9udGhseUFub21hbHkoZCA9IERlcml2ZWRfT2NjdXBhdGlvbnNfU2VjdGlvbnMsIGNsaW1hdG9sb2d5WWVhcnMgPSBjKDE5OTksIDIwMTApLCB2YXIgPSAnaW50ZWdyYXRlZF9jaGxvcm9waHlsbF8wXzEwMCcpDQoNCmRkIDwtIG1vbnRobHlBbm9tYWx5KGQgPSBkZCwgY2xpbWF0b2xvZ3lZZWFycyA9IGMoMTk5OSwgMjAxMCksIHZhciA9ICdpbnRlZ3JhdGVkX25pdHJhdGVfMF81MCcpDQoNCiMgdGVzdCBhbm51YWwgcmVzdWx0cw0KDQpkZGFubiA8LSBhbm51YWxBbm9tYWx5KGQgPSBkZCwgYW5vbWFseSA9ICdpbnRlZ3JhdGVkX2NobG9yb3BoeWxsXzBfMTAwX2Fub21hbHknKQ0KDQpoZWFkKGRkYW5uKQ0KYGBgDQoNCkltcHJvdmVtZW50cyB0byBhbm9tYWx5IGZ1bmN0aW9uczoNCg0KKiBhY2NvdW50IGZvciBwb3NzaWJpbGl0eSBvZiBkYXRhIGNvbGxlY3Rpb24gc3RyZXRjaGluZyBiZXR3ZWVuIHR3byBtb250aHMsIGFuZCB3YW50aW5nIG9uZSBhbm9tYWx5IHZhbHVlIChmcm9tIG9uZSBjcnVpc2UpDQogICogb25jZSBjcnVpc2VfaWQgaXMgaW5jb3Jwb3JhdGVkIGludG8gbWV0YWRhdGEgYW4gb3B0aW9uIHdpbGwgYmUgd3JpdHRlbiBpbnRvIHRoZSBmdW5jdGlvbiB0byBncm91cCBkYXRhIGJ5IGNydWlzZSByYXRoZXIgdGhhbiBtb250aA0KICANCiogQWJpbGl0eSB0byBzcGxpdCBkYXRhIGJ5IHNlY3Rpb24gb3Igc3RhdGlvbiB3aXRoaW4gZGF0YSBmcmFtZQ0KICAqIEJlbm9pdCdzIHNjcmlwdHMgc3BsaXQgZGF0YSBieSBzZWN0aW9uIG9yIHN0YXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIGFub21hbGllcw0KICANCiogRGlmZmVyZW5jZSBpbiBjYWxjdWxhdGlvbnMgYmV0d2VlbiBCZW5vaXQgYW5kIENoYW50ZWxsZSB2ZXJzaW9ucw0KICAqIER1ZSB0byBkaWZmZXJlbmNlIGluIGNhbGN1bGF0aW5nIG1vbnRobHkgdnMgYW5udWFsIGNsaW1hdG9sb2d5DQoNCg0KDQpgYGB7cn0NCg0KIyBCZW5vaXQncyBtZXRob2QNCg0KZGZfZGF0YV9maWx0ZXJlZF9sIDwtIERlcml2ZWRfT2NjdXBhdGlvbnNfU2VjdGlvbnMNCg0KZGZfZGF0YV9maWx0ZXJlZF9sIDwtIGRmX2RhdGFfZmlsdGVyZWRfbCAlPiUNCiAgc2VsZWN0KC4sIHNlY3Rpb24sIHN0YXRpb24sIGxhdGl0dWRlLCBsb25naXR1ZGUsIHllYXIsIG1vbnRoLCBkYXksIGV2ZW50X2lkLCBpbnRlZ3JhdGVkX2NobG9yb3BoeWxsXzBfMTAwKQ0KDQojIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIyBhbm51YWwgY2xpbWF0b2xvZ3kNCmRmX2NsaW1hdG9sb2d5X2FubnVhbF9sIDwtIGRmX2RhdGFfZmlsdGVyZWRfbCAlPiUNCiAgZHBseXI6OmZpbHRlciguLCB5ZWFyPj0xOTk5LCB5ZWFyPD0yMDEwKSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KC4sICB5ZWFyKSAlPiUgIyByZW1vdmVkIGdyb3VwIGJ5IHNlY3Rpb24NCiAgZHBseXI6OnN1bW1hcmlzZSguLCBtZWFuPW1lYW4oaW50ZWdyYXRlZF9jaGxvcm9waHlsbF8wXzEwMCwgbmEucm09VFJVRSksIHNkPXNkKGludGVncmF0ZWRfY2hsb3JvcGh5bGxfMF8xMDAsIG5hLnJtPVRSVUUpKSAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoLikNCg0KDQoNCiAgIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyMgYW5udWFsIGFub21hbGllcw0KZGZfYW5vbWFseV9hbm51YWxfbCA8LSBkcGx5cjo6bGVmdF9qb2luKGRmX2RhdGFfZmlsdGVyZWRfbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGZfY2xpbWF0b2xvZ3lfYW5udWFsX2wgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBieT1jKCAieWVhciIpKSAlPiUgIyByZW1vdmVkIHNlY3Rpb24NCiAgZHBseXI6Omdyb3VwX2J5KC4sIHllYXIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKC4sIHZhbHVlPShpbnRlZ3JhdGVkX2NobG9yb3BoeWxsXzBfMTAwLW1lYW4pL3NkKSAlPiUNCiAgc3VtbWFyaXNlKC4sIGFubnVhbF9hbm9tYWx5ID0gbWVhbih2YWx1ZSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoLiwgeWVhciwgIGFubnVhbF9hbm9tYWx5KSAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoLikNCg0KYGBgDQoNCg0KYGBge3J9DQoNCiMgY29tcGFyZSBCZW5vaXQgYW5kIENoYW50ZWxsZSBtZXRob2RzDQoNCmFubmNvbSA8LSBjYmluZChkZl9hbm9tYWx5X2FubnVhbF9sLCBkZGFubikNCnBhcihtYXIgPSBjKDUsIDQsIDQsIDQpICsgMC4zKSAgIyBMZWF2ZSBzcGFjZSBmb3IgeiBheGlzDQpwbG90KGFubmNvbSR5ZWFyLCBhbm5jb20kaW50ZWdyYXRlZF9jaGxvcm9waHlsbF8wXzEwMF9hbm9tYWx5LCB0eXBlID0gJ2wnLCBjb2wgPSAncmVkJywgeWxhYiA9ICcnLCB4bGFiID0gJ1llYXInKSAjIGZpcnN0IHBsb3QNCnBhcihuZXcgPSBUUlVFKQ0KYXhpcyhzaWRlID0gMiwgY29sID0gJ3JlZCcpDQpwYXIobmV3ID0gVFJVRSkNCnBsb3QoYW5uY29tJHllYXIsIGFubmNvbSRhbm51YWxfYW5vbWFseSwgdHlwZSA9ICJsIiwgY29sID0gJ2JsdWUnLCBheGVzID0gRkFMU0UsIGJ0eSA9ICJuIiwgeGxhYiA9ICIiLCB5bGFiID0gIiIpDQpheGlzKHNpZGU9NCwgYXQgPSBwcmV0dHkocmFuZ2UoYW5uY29tJGFubnVhbF9hbm9tYWx5LCBuYS5ybSA9IFRSVUUpKSwgY29sID0gJ2JsdWUnKQ0KbXRleHQoImFubnVhbCBhbm9tYWx5IC0gQmVub2l0Iiwgc2lkZT00LCBsaW5lPTMsIGNvbCA9ICdibHVlJykNCm10ZXh0KCJhbm51YWwgYW5vbWFseSAtIENoYW50ZWxsZSIsIHNpZGU9MiwgbGluZT0zLCBjb2wgPSAncmVkJykNCg0KDQpgYGANCg0KDQo=