Skip to contents

Takes daily estimates of K, usually from nighttime regression, and regresses against predictors such as discharge.daily. Returns a metab_Kmodel object that only predicts daily K, nothing else.

Usage

metab_Kmodel(
  specs = specs(mm_name("Kmodel")),
  data = mm_data(solar.time, discharge, velocity, optional = c("all")),
  data_daily = mm_data(date, K600.daily, K600.daily.lower, K600.daily.upper,
    discharge.daily, velocity.daily, optional = c("K600.daily.lower", "K600.daily.upper",
    "discharge.daily", "velocity.daily")),
  info = NULL
)

Arguments

specs

A list of model specifications and parameters for a model. Although this may be specified manually (it's just a list), it is easier and safer to use specs() to generate the list, because the set of required parameters and their defaults depends on the model given in the model_name argument to specs. The help file for specs() lists the necessary parameters, describes them in detail, and gives default values.

data

A data frame or tibble of input data at the temporal resolution of raw observations (unit-value). Columns must have the same names, units, and format as the default. The solar.time column must also have a timezone code ('tzone' attribute) of 'UTC'. See the 'Formatting data' section below for a full description.

data_daily

A data frame or tibble containing inputs with a daily timestep. See the 'Formatting data_daily' section below for a full description.

info

Any information, in any format, that you would like to store within the metab_model object.

Value

A metab_Kmodel object containing the fitted model. Inspect it with the functions in metab_model_interface().

Details

Possible approaches:

  • Mean: Predict K as the mean of all K values.

  • Weighted mean: Predict K as the mean of all K values, weighted by the inverse confidence intervals of the input K values.

  • KvQ: Regress K against Q, tending toward the overall mean in ranges of Q with sparse data.

  • Weighted KvQ: Regress K against Q, tending toward the overall mean in ranges of Q with sparse data and weighting high-confidence K values more heavily.

  • T smoother: Predict K using a loess or spline smoother over time.

  • Q smoother: Predict K using a loess or spline smoother over discharge.daily.

  • TQ smoother: Predict K using a loess or spline smoother over time and discharge.daily.

See also

Author

Alison Appling

Examples

library(dplyr)
# create example data
set.seed(24842)
example_Ks <- data.frame(date=seq(as.Date("2012-08-15"),as.Date("2012-09-15"),
  as.difftime(1,units='days')), discharge.daily=exp(rnorm(32,2,1)), K600.daily=rnorm(32,30,4)) |>
  mutate(K600.daily.lower=K600.daily-5, K600.daily.upper=K600.daily+6)

# mean
mm <- metab_Kmodel(
  specs(mm_name('Kmodel', engine='mean')),
  data_daily=example_Ks) # two warnings expected for engine='mean'
get_params(mm)
#>          date K600.daily K600.daily.sd         warnings errors
#> 1  2012-08-15   29.41813            NA overall warnings       
#> 2  2012-08-16   29.41813            NA overall warnings       
#> 3  2012-08-17   29.41813            NA overall warnings       
#> 4  2012-08-18   29.41813            NA overall warnings       
#> 5  2012-08-19   29.41813            NA overall warnings       
#> 6  2012-08-20   29.41813            NA overall warnings       
#> 7  2012-08-21   29.41813            NA overall warnings       
#> 8  2012-08-22   29.41813            NA overall warnings       
#> 9  2012-08-23   29.41813            NA overall warnings       
#> 10 2012-08-24   29.41813            NA overall warnings       
#> 11 2012-08-25   29.41813            NA overall warnings       
#> 12 2012-08-26   29.41813            NA overall warnings       
#> 13 2012-08-27   29.41813            NA overall warnings       
#> 14 2012-08-28   29.41813            NA overall warnings       
#> 15 2012-08-29   29.41813            NA overall warnings       
#> 16 2012-08-30   29.41813            NA overall warnings       
#> 17 2012-08-31   29.41813            NA overall warnings       
#> 18 2012-09-01   29.41813            NA overall warnings       
#> 19 2012-09-02   29.41813            NA overall warnings       
#> 20 2012-09-03   29.41813            NA overall warnings       
#> 21 2012-09-04   29.41813            NA overall warnings       
#> 22 2012-09-05   29.41813            NA overall warnings       
#> 23 2012-09-06   29.41813            NA overall warnings       
#> 24 2012-09-07   29.41813            NA overall warnings       
#> 25 2012-09-08   29.41813            NA overall warnings       
#> 26 2012-09-09   29.41813            NA overall warnings       
#> 27 2012-09-10   29.41813            NA overall warnings       
#> 28 2012-09-11   29.41813            NA overall warnings       
#> 29 2012-09-12   29.41813            NA overall warnings       
#> 30 2012-09-13   29.41813            NA overall warnings       
#> 31 2012-09-14   29.41813            NA overall warnings       
#> 32 2012-09-15   29.41813            NA overall warnings       
plot(get_params(mm)$date, get_params(mm)$K600.daily)


# linear model
mm <- metab_Kmodel(
  specs(mm_name('Kmodel', engine='lm'), predictors='discharge.daily'),
  data_daily=example_Ks)
get_params(mm)
#>          date K600.daily K600.daily.sd warnings errors
#> 1  2012-08-15   29.48773            NA                
#> 2  2012-08-16   29.45253            NA                
#> 3  2012-08-17   30.52907            NA                
#> 4  2012-08-18   29.36423            NA                
#> 5  2012-08-19   26.97996            NA                
#> 6  2012-08-20   29.85889            NA                
#> 7  2012-08-21   29.41888            NA                
#> 8  2012-08-22   29.21206            NA                
#> 9  2012-08-23   28.90789            NA                
#> 10 2012-08-24   28.55220            NA                
#> 11 2012-08-25   30.51001            NA                
#> 12 2012-08-26   28.45314            NA                
#> 13 2012-08-27   30.15313            NA                
#> 14 2012-08-28   29.14110            NA                
#> 15 2012-08-29   28.96144            NA                
#> 16 2012-08-30   29.49264            NA                
#> 17 2012-08-31   28.70135            NA                
#> 18 2012-09-01   30.78642            NA                
#> 19 2012-09-02   29.42760            NA                
#> 20 2012-09-03   28.33825            NA                
#> 21 2012-09-04   29.61804            NA                
#> 22 2012-09-05   29.14045            NA                
#> 23 2012-09-06   29.01319            NA                
#> 24 2012-09-07   29.95855            NA                
#> 25 2012-09-08   29.99182            NA                
#> 26 2012-09-09   28.54950            NA                
#> 27 2012-09-10   29.76544            NA                
#> 28 2012-09-11   29.46747            NA                
#> 29 2012-09-12   29.70034            NA                
#> 30 2012-09-13   28.51264            NA                
#> 31 2012-09-14   30.65190            NA                
#> 32 2012-09-15   30.86205            NA                
plot(get_data_daily(mm)$discharge.daily, get_params(mm)$K600.daily)


# loess
mm <- metab_Kmodel(    ### breaks ###
  specs(mm_name('Kmodel', engine='loess'), predictors='date', other_args=list(span=0.4)),
  data_daily=example_Ks)
get_params(mm)
#>          date K600.daily K600.daily.sd warnings errors
#> 1  2012-08-15   26.93642      1.136389                
#> 2  2012-08-16   28.13190      1.087341                
#> 3  2012-08-17   28.79526      1.069291                
#> 4  2012-08-18   29.09960      1.071040                
#> 5  2012-08-19   28.84944      1.075185                
#> 6  2012-08-20   28.29487      1.079092                
#> 7  2012-08-21   27.62516      1.075342                
#> 8  2012-08-22   27.12816      1.079242                
#> 9  2012-08-23   27.21836      1.074020                
#> 10 2012-08-24   27.67841      1.078880                
#> 11 2012-08-25   28.83481      1.073739                
#> 12 2012-08-26   30.20604      1.076872                
#> 13 2012-08-27   31.72782      1.070802                
#> 14 2012-08-28   33.11495      1.073499                
#> 15 2012-08-29   33.64264      1.068786                
#> 16 2012-08-30   33.69489      1.073006                
#> 17 2012-08-31   32.56211      1.070038                
#> 18 2012-09-01   31.32665      1.074744                
#> 19 2012-09-02   31.20208      1.070357                
#> 20 2012-09-03   31.10106      1.074969                
#> 21 2012-09-04   30.84886      1.071741                
#> 22 2012-09-05   30.37960      1.076465                
#> 23 2012-09-06   28.82896      1.072684                
#> 24 2012-09-07   27.27600      1.079072                
#> 25 2012-09-08   26.11465      1.076778                
#> 26 2012-09-09   25.49586      1.082287                
#> 27 2012-09-10   26.40117      1.076760                
#> 28 2012-09-11   27.50791      1.077389                
#> 29 2012-09-12   28.11343      1.072039                
#> 30 2012-09-13   28.71594      1.069151                
#> 31 2012-09-14   29.09925      1.084802                
#> 32 2012-09-15   29.31613      1.132190                
plot(get_params(mm)$date, get_params(mm)$K600.daily)


## 3-phase workflow (sort of like complete pooling) for estimating K within
## days, then K across days, then GPP and ER within days

# 1. data and specifications for both of the MLE models
dat <- data_metab('10','15')
mle_specs <- specs(mm_name('mle'))

# fit a first-round MLE and extract the K estimates
mm1 <- metab_mle(mle_specs, data=dat)
K600_mm1 <- get_params(mm1, uncertainty='ci') |>
  select(date, K600.daily, K600.daily.lower, K600.daily.upper)

# smooth the K600s
mm2 <- metab_Kmodel(specs(mm_name('Kmodel', engine='mean'),
  day_start=-1, day_end=23), data_daily=K600_mm1)
K600_mm2 <- get_params(mm2) |> select(date, K600.daily)

# refit the MLE with fixed K
mm3 <- metab_mle(mle_specs, data=dat, data_daily=K600_mm2)
get_params(mm3, fixed='stars')
#>          date GPP.daily GPP.daily.sd   ER.daily ER.daily.sd K600.daily warnings
#> 1  2012-09-18 2.558979    0.05519044 -1.913915   0.08116143  28.44894*         
#> 2  2012-09-19 2.765987    0.05888406 -2.066356   0.08646030  28.44894*         
#> 3  2012-09-20 2.564581    0.05024763 -1.693337   0.07446124  28.44894*         
#> 4  2012-09-21 2.558030    0.04396162 -1.709250   0.06493983  28.44894*         
#> 5  2012-09-22 2.607292    0.05752125 -1.745543   0.08553130  28.44894*         
#> 6  2012-09-23 2.835975    0.06980850 -2.159617   0.10599572  28.44894*         
#> 7  2012-09-24 2.756249    0.07120201 -2.627882   0.10734383  28.44894*         
#> 8  2012-09-25 1.881598    0.06901491 -1.999497   0.10824960  28.44894*         
#> 9  2012-09-26 2.139146    0.05002992 -1.970511   0.07780874  28.44894*         
#> 10 2012-09-27 1.954997    0.04672300 -1.854895   0.07239294  28.44894*         
#>    errors
#> 1        
#> 2        
#> 3        
#> 4        
#> 5        
#> 6        
#> 7        
#> 8        
#> 9        
#> 10       
predict_metab(mm3)
#> # A tibble: 10 × 10
#>    date         GPP GPP.lower GPP.upper    ER ER.lower ER.upper msgs.fit 
#>    <date>     <dbl>     <dbl>     <dbl> <dbl>    <dbl>    <dbl> <chr>    
#>  1 2012-09-18  2.56      2.45      2.67 -1.91    -2.07    -1.75 "       "
#>  2 2012-09-19  2.77      2.65      2.88 -2.07    -2.24    -1.90 "       "
#>  3 2012-09-20  2.56      2.47      2.66 -1.69    -1.84    -1.55 "       "
#>  4 2012-09-21  2.56      2.47      2.64 -1.71    -1.84    -1.58 "       "
#>  5 2012-09-22  2.61      2.49      2.72 -1.75    -1.91    -1.58 "       "
#>  6 2012-09-23  2.84      2.70      2.97 -2.16    -2.37    -1.95 "       "
#>  7 2012-09-24  2.76      2.62      2.90 -2.63    -2.84    -2.42 "       "
#>  8 2012-09-25  1.88      1.75      2.02 -2.00    -2.21    -1.79 "       "
#>  9 2012-09-26  2.14      2.04      2.24 -1.97    -2.12    -1.82 "       "
#> 10 2012-09-27  1.95      1.86      2.05 -1.85    -2.00    -1.71 "       "
#> # ℹ 2 more variables: warnings <chr>, errors <chr>
plot_metab_preds(mm1)

plot_metab_preds(mm3)