Skip to content

Commit 0d1c963

Browse files
Merge pull request #320 from USGS-R/develop
as for full 2016 data pull
2 parents dd5110a + d87ca83 commit 0d1c963

File tree

146 files changed

+10041
-286
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

146 files changed

+10041
-286
lines changed

DESCRIPTION

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
Package: streamMetabolizer
22
Type: Package
33
Title: Models for Estimating Aquatic Photosynthesis and Respiration
4-
Version: 0.9.33
5-
Date: 2017-01-17
4+
Version: 0.9.38
5+
Date: 2017-02-03
66
Author: Alison P. Appling, Robert O. Hall, Maite Arroita, and Charles B.
77
Yackulic
88
Authors@R: c(

NEWS.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,23 @@
1+
# 0.9.36
2+
3+
* Models should now be able to accept `tbl_df`s (dplyr/tibble format) for the
4+
`data` and `data_daily` arguments to `metab()`
5+
6+
# 0.9.35
7+
8+
* Bayesian models now distinguish between compilation time and fitting time
9+
10+
* Updates to `plot_distribs` for recent changes to Bayesian models
11+
12+
# 0.9.34
13+
14+
* Bayesian models with `pool_K600 != 'none'` can how have their
15+
`K600_daily_sigma` (or `K600_daily_sdlog`) be a fitted value, a fixed value, or
16+
a value fixed at 0
17+
118
# 0.9.33
219

3-
* new function: `calc_light_merged`, which merges modeled and observed light
20+
* new function: `calc_light_merged`, which merges modeled and observed light
421
into a smooth curve
522

623
# 0.9.29
@@ -10,7 +27,7 @@ model (and therefore also its `info` or `data_daily` slots)
1027

1128
# 0.9.28
1229

13-
* switched from `rlnorm` to `rnorm` for distribution of `K600_daily` around
30+
* switched from `rlnorm` to `rnorm` for distribution of `K600_daily` around
1431
`K600_daily_pred` in linear and binned models
1532

1633
# 0.9.27

R/calc_light_merged.R

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,19 @@
2323
#' @export
2424
#' @examples
2525
#' \dontrun{
26-
#' library(mda.streams)
2726
#' library(dplyr)
28-
#' library(lubridate)
2927
#' library(ggplot2)
3028
#' library(unitted)
31-
#' coords <- get_site_coords('nwis_08062500')
32-
#' PAR.obs <- get_ts('par_calcSw', 'nwis_08062500') %>%
33-
#' mutate(solar.time = convert_UTC_to_solartime(DateTime, coords$lon)) %>%
34-
#' select(solar.time, light=par) %>%
35-
#' subset(solar.time %within% interval(ymd("2008-03-10"), ymd("2008-03-14"), tz=tz(solar.time)) &
36-
#' !(solar.time %within% interval(as.POSIXct("2008-03-12 10:00", tz=tz(solar.time)),
37-
#' as.POSIXct("2008-03-12 14:00", tz=tz(solar.time)))))
38-
#' PAR.mod <- u(data.frame(solar.time=seq(as.POSIXct('2008-03-11', tz=tz(PAR.obs$solar.time)),
39-
#' as.POSIXct('2008-03-15', tz=tz(PAR.obs$solar.time)), by=as.difftime(10, units='mins'))) %>%
40-
#' mutate(light=calc_light(u(solar.time), latitude=coords$lat, longitude=coords$lon)))
29+
#' timebounds <- as.POSIXct(c('2008-03-12 00:00', '2008-03-12 23:59'), tz='UTC')
30+
#' coords <- list(lat=32.4, lon=-96.5)
31+
#' PAR.obs <- data_frame(
32+
#' solar.time=seq(timebounds[1], timebounds[2], by=as.difftime(3, units='hours')),
33+
#' light=c(0, 0, 85.9, 1160.5, 1539.0, 933.9, 0, 0)
34+
#' ) %>% as.data.frame()
35+
#' PAR.mod <- data_frame(
36+
#' solar.time=seq(timebounds[1], timebounds[2], by=as.difftime(0.25, units='hours')),
37+
#' light=calc_light(solar.time, latitude=coords$lat, longitude=coords$lon)
38+
#' ) %>% as.data.frame()
4139
#' PAR.merged <- calc_light_merged(PAR.obs, PAR.mod$solar.time,
4240
#' latitude=coords$lat, longitude=coords$lon, max.gap=as.difftime(20, units='hours'))
4341
#' ggplot(bind_rows(mutate(v(PAR.obs), type='obs'), mutate(v(PAR.mod), type='mod'),
@@ -51,6 +49,22 @@ calc_light_merged <- function(
5149
solar.time, latitude, longitude, max.PAR=NA,
5250
max.gap=as.difftime(3, units="hours"), attach.units=is.unitted(PAR.obs)) {
5351

52+
# ensure units are correct and present within this function
53+
arg_units <- list(
54+
PAR.obs=get_units(mm_data(solar.time, light)),
55+
solar.time='',
56+
latitude='degN',
57+
longitude='degE')
58+
for(argname in names(arg_units)) {
59+
arg <- get(argname)
60+
unit <- arg_units[[argname]]
61+
if(is.unitted(arg)) {
62+
stopifnot(all(get_units(arg) == unit))
63+
} else {
64+
assign(argname, u(arg, unit))
65+
}
66+
}
67+
5468
. <- is.mod <- obs <- mod <- resid.abs.int <- resid.prop.int <- merged <- '.dplyr.var'
5569

5670
# set smart default for max.PAR to make the ts pretty
@@ -94,27 +108,34 @@ calc_light_merged <- function(
94108
}
95109

96110
# create a 'merged' time series where modeled values are adjusted to flow
97-
# through observed values
111+
# through observed values.
112+
113+
# compute the modeled values and then the residuals as both differences and
114+
# proportions, dealing with 0 specially
98115
PAR.merged <- PAR.merged %>%
99116
mutate(
100-
# model light
101117
mod = calc_light(solar.time, latitude, longitude, max.PAR),
102-
# compute the residuals as both differences and proportions, dealing with NA and 0 specially
103-
resid.abs = ifelse(is.na(obs), 0, obs-mod),
104-
resid.prop = ifelse(mod==u(0, 'umol m^-2 s^-1') | (is.na(obs) & mod==u(0, 'umol m^-2 s^-1')), 1, obs/mod))
105-
# interpolate the residuals to match up with every modeled light value. pipes fail with this approx call, so use boring notation
106-
PAR.merged$resid.abs.int <- approx(x=PAR.merged$solar.time, y=PAR.merged$resid.abs, xout=PAR.merged$solar.time, rule=2)$y
107-
if(is.unitted(PAR.merged)) PAR.merged$resid.abs.int <- u(PAR.merged$resid.abs.int, get_units(PAR.merged$obs))
108-
PAR.merged$resid.prop.int <- approx(x=PAR.merged$solar.time, y=PAR.merged$resid.prop, xout=PAR.merged$solar.time, rule=2)$y
118+
resid.abs = obs - mod,
119+
resid.prop = ifelse(mod==u(0, 'umol m^-2 s^-1'), NA, obs / mod))
120+
121+
# interpolate the residuals to match up with every modeled light value. pipes
122+
# fail with this approx call, so use boring notation
123+
PAR.obsonly <- PAR.merged[!is.na(PAR.merged$obs), ]
124+
PAR.merged$resid.abs.int <- approx(x=PAR.obsonly$solar.time, y=v(PAR.obsonly$resid.abs), xout=v(PAR.merged$solar.time), rule=2)$y
125+
PAR.merged$resid.prop.int <- approx(x=PAR.obsonly$solar.time, y=PAR.obsonly$resid.prop, xout=PAR.merged$solar.time, rule=2)$y
126+
127+
# do the correction from mod scale to obs scale
109128
PAR.merged <- PAR.merged %>%
110-
# do the correction from mod scale to obs scale. purely absolute or purely proportional can give some funky values, so use the
111-
mutate(merged = u(ifelse(resid.prop.int <= 1, mod * resid.prop.int, mod + resid.abs.int), get_units(mod)))
129+
mutate(
130+
merged = u(ifelse(resid.prop.int <= 1, mod * resid.prop.int, pmax(0, v(mod) + resid.abs.int)), get_units(mod)))
112131

132+
# collect just the rows and cols we want
113133
PAR.merged <- PAR.merged %>%
114-
# collect just the rows and cols we want
115134
subset(is.mod) %>%
116135
select(solar.time, light=merged)
117136

137+
if(!attach.units) PAR.merged <- v(PAR.merged)
138+
118139
# return
119140
PAR.merged
120141
}

R/calc_velocity.R

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,12 @@
99
#' @param m exponent in velocity-discharge relation (unitless; f in Raymond et al.)
1010
#' @return v (= V = U), stream flow velcoity, in the same units as k
1111
#' @examples
12-
#' \dontrun{
13-
#' # Warning: this function is deprecated.
1412
#' Qs <- seq(1,9,2)
1513
#' calc_velocity(Q=Qs)
1614
#' calc_velocity(Q=Qs, k=0.4)
1715
#' library(unitted)
1816
#' calc_velocity(Q=u(Qs, "m^3 s^-1"), m=u(40))
1917
#' calc_velocity(Q=u(Qs, "m^3 s^-1"), k=u(0.36, "m s^-1"))
20-
#' }
2118
#' @references Raymond, Peter A., Christopher J. Zappa, David Butman, Thomas L.
2219
#' Bott, Jody Potter, Patrick Mulholland, Andrew E. Laursen, William H.
2320
#' McDowell, and Denis Newbold. \emph{Scaling the gas transfer velocity and
@@ -33,9 +30,6 @@
3330
#' @export
3431
calc_velocity <- function(Q, k=u(0.194,"m s^-1"), m=u(0.285,"")) {
3532

36-
.Deprecated()
37-
warning("submit a GitHub issue if you want calc_velocity() to stick around")
38-
3933
with.units <- is.unitted(Q) || (if(!missing(k)) is.unitted(k) else FALSE) || (if(!missing(m)) is.unitted(m) else FALSE)
4034

4135
if(with.units) {

R/metab_Kmodel.R

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -398,13 +398,14 @@ get_params.metab_Kmodel <- function(
398398
K600.daily.sd = fit[['se']])
399399
},
400400
lm = {
401-
preds <- predict(fit, newdata=data_daily, interval='confidence', level=0.95)
401+
preds <- predict(fit, newdata=data_daily, interval='confidence', level=0.95) %>%
402+
as.data.frame()
402403
params %<>% mutate(
403-
K600.daily = preds[,'fit'], # only the approx mean if ktrans=='log'
404+
K600.daily = preds[['fit']], # only the approx mean if ktrans=='log'
404405
K600.daily.sd = NA, # this shouldn't be necessary after resolving #238
405-
K600_daily_50pct = preds[,'fit'],
406-
K600_daily_2.5pct = preds[,'lwr'],
407-
K600_daily_97.5pct = preds[,'upr'])
406+
K600_daily_50pct = preds[['fit']],
407+
K600_daily_2.5pct = preds[['lwr']],
408+
K600_daily_97.5pct = preds[['upr']])
408409
},
409410
loess = {
410411
preds <- predict(fit, newdata=data_daily, se=TRUE)

R/metab_bayes.R

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,16 @@ metab_bayes <- function(
6363
# Check data for correct column names & units
6464
dat_list <- mm_validate_data(if(missing(data)) NULL else data, if(missing(data_daily)) NULL else data_daily, "metab_bayes")
6565
num_discharge_cols <- length(grep('discharge', c(names(dat_list$data), names(dat_list$data_daily))))
66-
pool_K600 <- mm_parse_name(specs$model_name)$pool_K600
67-
if(xor(num_discharge_cols > 0, pool_K600 %in% c('linear','binned')))
68-
stop('discharge data should be included if & only if pool_K600 indicates hierarchy')
66+
pool_K600_type <- mm_parse_name(specs$model_name, expand = TRUE)$pool_K600_type
67+
if(xor(num_discharge_cols > 0, pool_K600_type %in% c('linear','binned')))
68+
stop('discharge data should be included if & only if pool_K600_type indicates hierarchy')
6969
if(num_discharge_cols > 1)
7070
stop('either discharge or discharge.daily may be specified, but not both')
7171

7272
# Handle discharge. If K600 is a hierarchical function of discharge and
7373
# data$discharge was given, compute daily discharge and store in data.daily
7474
# where it'll be accessible for the user to inspect it after model fitting
75-
if((pool_K600 %in% c('linear','binned')) && ('discharge' %in% names(dat_list$data))) {
75+
if((pool_K600_type %in% c('linear','binned')) && ('discharge' %in% names(dat_list$data))) {
7676
# calculate daily discharge
7777
dailymean <- function(data_ply, data_daily_ply, day_start, day_end, ply_date, ply_validity, timestep_days, ...) {
7878
data.frame(discharge.daily = if(isTRUE(ply_validity[1])) mean(data_ply$discharge) else NA)
@@ -111,7 +111,7 @@ metab_bayes <- function(
111111
dat_list$data_daily$lnQ.daily <- log(v(dat_list$data_daily$discharge.daily))
112112
}
113113
# If we need discharge bins, compute & store those now, as well
114-
if(pool_K600 %in% c('binned')) {
114+
if(pool_K600_type %in% c('binned')) {
115115
# linear interpolation from node to node, horizontal at the edges
116116
bounds <- c(-Inf, specs$K600_lnQ_nodes_centers, Inf)
117117
cuts <- cut(dat_list$data_daily$lnQ.daily, breaks=bounds, ordered_result=TRUE)
@@ -176,6 +176,7 @@ metab_bayes <- function(
176176
{if(!is.null(.)) setNames(., 'Compilation') else .}
177177
log <- extract_object_list('log') %>% { setNames(., paste0('MCMC_', names(.))) }
178178
bayes_log <- c(compile_log, log)
179+
bayes_compile_time <- bayes_all_list[['compile_time']]
179180
bayes_mcmc <- extract_object_list('mcmcfit')
180181
bayes_mcmc_data <- extract_object_list('mcmc_data')
181182
bayes_all <- list(daily=bayes_daily)
@@ -195,10 +196,11 @@ metab_bayes <- function(
195196
. <- '.dplyr.var'
196197
bayes_log <- bayes_all_list[c('compile_log', 'log')] %>%
197198
setNames(c('Compilation','MCMC_All_Days')) %>% { .[!sapply(., is.null)] }
199+
bayes_compile_time <- bayes_all_list[['compile_time']]
198200
bayes_mcmc <- bayes_all_list$mcmcfit
199201
bayes_mcmc_data <- bayes_all_list$mcmc_data
200202
# now a list of dfs, log, warnings, and errors
201-
bayes_all <- bayes_all_list[!(names(bayes_all_list) %in% c('compile_log','log','mcmcfit','mcmc_data'))]
203+
bayes_all <- bayes_all_list[!(names(bayes_all_list) %in% c('compile_log','compile_time','log','mcmcfit','mcmc_data'))]
202204
}
203205
})
204206

@@ -210,7 +212,8 @@ metab_bayes <- function(
210212
log=bayes_log,
211213
mcmc=bayes_mcmc,
212214
mcmc_data=bayes_mcmc_data,
213-
fitting_time=fitting_time,
215+
fitting_time=fitting_time - bayes_compile_time,
216+
compile_time=bayes_compile_time,
214217
specs=specs,
215218
data=dat_list$data, # keep the units if given
216219
data_daily=dat_list$data_daily)
@@ -483,7 +486,7 @@ prepdata_bayes <- function(
483486
if(n24 > num_daily_obs) stop("day_end - day_start < 24 hours; aborting because daily metabolism could be wrong")
484487

485488
# parse model name into features for deciding what data to include
486-
features <- mm_parse_name(model_name)
489+
features <- mm_parse_name(model_name, expand=TRUE)
487490

488491
# Format the data for Stan. Stan disallows period-separated names, so
489492
# change all the input data to underscore-separated. parameters given in
@@ -501,7 +504,7 @@ prepdata_bayes <- function(
501504
),
502505

503506
switch(
504-
features$pool_K600,
507+
features$pool_K600_type,
505508
linear = list(lnQ_daily = data_daily$lnQ.daily),
506509
binned = list(
507510
b = length(specs$K600_lnQ_nodes_centers),
@@ -533,7 +536,7 @@ prepdata_bayes <- function(
533536

534537
specs[specs$params_in]
535538
)
536-
if(features$pool_K600 == 'binned') {
539+
if(features$pool_K600_type == 'binned') {
537540
data_list$K600_lnQ_nodes_meanlog <- array(data_list$K600_lnQ_nodes_meanlog, dim=data_list$b)
538541
data_list$K600_lnQ_nodes_sdlog <- array(data_list$K600_lnQ_nodes_sdlog, dim=data_list$b)
539542
}
@@ -604,12 +607,15 @@ runstan_bayes <- function(data_list, model_path, params_out, split_dates, keep_m
604607

605608
# use auto_write=TRUE to recompile if needed, or load from existing .rds file
606609
# without recompiling if possible
610+
compile_time <- system.time({})
607611
mobj_path <- gsub('.stan$', '.stanrds', model_path)
608612
if(!file.exists(mobj_path) || file.info(mobj_path)$mtime < file.info(model_path)$mtime) {
609613
if(verbose) message("compiling Stan model")
610-
compile_log <- capture.output({
611-
stan_mobj <- rstan::stan_model(file=model_path, auto_write=TRUE)
612-
}, type=c('output'), split=verbose)
614+
compile_time <- system.time({
615+
compile_log <- capture.output({
616+
stan_mobj <- rstan::stan_model(file=model_path, auto_write=TRUE)
617+
}, type=c('output'), split=verbose)
618+
})
613619
rm(stan_mobj)
614620
gc() # this humble line saves us from many horrible R crashes
615621
autowrite_path <- gsub('.stan$', '.rds', model_path)
@@ -681,7 +687,10 @@ runstan_bayes <- function(data_list, model_path, params_out, split_dates, keep_m
681687
newlogfiles <- normalizePath(file.path(tempdir(), grep("_StanProgress.txt", dir(tempdir()), value=TRUE)))
682688
logfile <- setdiff(newlogfiles, oldlogfiles)
683689
log <- if(length(logfile) > 0) readLines(logfile) else consolelog
684-
stan_out <- c(stan_out, c(list(log=log), if(exists('compile_log')) list(compile_log=compile_log)))
690+
stan_out <- c(stan_out, c(
691+
list(log=log),
692+
if(exists('compile_log')) list(compile_log=compile_log),
693+
list(compile_time=compile_time)))
685694

686695
return(stan_out)
687696
}
@@ -770,7 +779,7 @@ format_mcmc_mat_nosplit <- function(mcmc_mat, data_list_d, data_list_n, keep_mcm
770779
setClass(
771780
"metab_bayes",
772781
contains="metab_model",
773-
slots=c(log="ANY", mcmc="ANY", mcmc_data="ANY")
782+
slots=c(log="ANY", mcmc="ANY", mcmc_data="ANY", compile_time="ANY")
774783
)
775784

776785
#' Extract any MCMC model objects that were stored with the model
@@ -957,6 +966,7 @@ get_params.metab_bayes <- function(metab_model, date_start=NA, date_end=NA, unce
957966
}
958967
names(metab_model@fit$daily) <- gsub('_mean$', '', names(metab_model@fit$daily))
959968
names(metab_model@fit$daily) <- gsub('_sd$', '.sd', names(metab_model@fit$daily))
969+
names(metab_model@fit$daily) <- gsub('_50pct$', '.median', names(metab_model@fit$daily))
960970
names(metab_model@fit$daily) <- gsub('_2.5pct$', '.lower', names(metab_model@fit$daily))
961971
names(metab_model@fit$daily) <- gsub('_97.5pct$', '.upper', names(metab_model@fit$daily))
962972
# code duplicated in get_params.metab_Kmodel:
@@ -970,6 +980,6 @@ get_params.metab_bayes <- function(metab_model, date_start=NA, date_end=NA, unce
970980
dmsg <- metab_model@fit$daily$errors
971981
metab_model@fit$daily$errors <- ifelse(dmsg == '', omsg, paste(omsg, dmsg, sep=';'))
972982
}
973-
metab_model@fit <- metab_model@fit$daily # SUPER-TEMPORARY we're still converting fit$daily to fit until #247, #229
983+
metab_model@fit <- metab_model@fit$daily # TEMPORARY we're still converting fit$daily to fit until #247, #229
974984
NextMethod()
975985
}

R/metab_model.get_params.R

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ get_params.metab_model <- function(
7272
# add uncertainty columns if requested
7373
if(uncertainty != 'none') {
7474
metab.vars <- metab.out
75-
metab.uncert <- matrix(paste0(rep(metab.out, each=3), rep(c('.sd','.lower','.upper'), times=length(metab.out))), nrow=3, byrow=FALSE)
75+
suffixes <- c('.sd','.median','.lower','.upper')
76+
metab.uncert <- matrix(paste0(rep(metab.out, each=length(suffixes)), rep(suffixes, times=length(metab.out))), nrow=length(suffixes), byrow=FALSE)
7677
metab.out <- c(rbind(metab.out, metab.uncert)) %>% { .[. %in% names(pars)]}
7778
}
7879

@@ -91,16 +92,24 @@ get_params.metab_model <- function(
9192

9293
# convert sds to CIs if requested
9394
if(uncertainty == 'sd') {
94-
extra.cols <- grep('\\.lower$|\\.upper$', names(params))
95+
extra.cols <- grep('\\.median$|\\.lower$|\\.upper$', names(params))
9596
if(length(extra.cols) > 0) params <- params[-extra.cols]
9697
} else if(uncertainty == 'ci') {
9798
# use existing .lower and .upper cols if available
9899
for(mv in metab.vars) {
99100
if(all(paste0(mv,c('.lower','.upper')) %in% names(params))) {
100101
extra.cols <- grep(paste0(mv,'\\.sd$'), names(params))
101102
if(length(extra.cols) > 0) params <- params[-extra.cols]
103+
# if we're using existing .lower and .upper cols, also try to use existing .median col
104+
if(paste0(mv,'.median') %in% names(params)) {
105+
params[[mv]] <- params[[paste0(mv,'.median')]] # copy .median over/into un-suffixed name
106+
}
102107
}
103108
}
109+
# remove any '.median' columns; by now we've either used them or have no
110+
# use for them
111+
extra.cols <- grep(paste0('\\.median$'), names(params))
112+
if(length(extra.cols) > 0) params <- params[-extra.cols]
104113
# convert any remaining .sd cols to .lower and .upper parametrically
105114
params <- mm_sd_to_ci(params)
106115
}

R/metab_model.show.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ setMethod(
1818
}
1919
cat("streamMetabolizer version", object@pkg_version, "\n")
2020
print(get_specs(object), header="Specifications:\n", prefix=" ")
21-
cat("Fitting time: ", get_fitting_time(object)[['elapsed']], " secs elapsed\n", sep="")
21+
cat("Fitting time: ", tryCatch(get_fitting_time(object)[['elapsed']], error=function(e) "NA"), " secs elapsed\n", sep="")
2222

2323
# set the sim.seed for a sec so the params and metab preds look the same.
2424
# setting the seed makes a copy of object, so we won't need to reset the

R/metab_model_interface.R

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,10 @@ get_version <- function(metab_model) {
163163
#' @param uncertainty character. Should columns for the uncertainty of parameter
164164
#' estimates be excluded ('none'), reported as standard deviations ('sd'), or
165165
#' reported as lower and upper bounds of a 95 percent confidence interval
166-
#' ('ci')?
166+
#' ('ci')? When available (e.g., for Bayesian models), if 'ci' then the
167+
#' central value will be the median (50th quantile) and the ranges will be the
168+
#' 2.5th and 97.5th quantiles. If 'sd' then the central value will always be
169+
#' the mean.
167170
#' @param messages logical. Should warning and error messages from the fitting
168171
#' procedure be included in the output?
169172
#' @param fixed character. Should values pulled from data_daily (i.e., fixed

0 commit comments

Comments
 (0)