diff options
Diffstat (limited to 'docs/coverage')
25 files changed, 84996 insertions, 0 deletions
diff --git a/docs/coverage/coverage.html b/docs/coverage/coverage.html new file mode 100644 index 00000000..749ccdd0 --- /dev/null +++ b/docs/coverage/coverage.html @@ -0,0 +1,69858 @@ +<!DOCTYPE html> +<html lang="en"> +<head> +<meta charset="utf-8"/> +<style>body{background-color:white;}</style> +<link href="lib/htmltools-fill-0.5.8.1/fill.css" rel="stylesheet" /> +<script src="lib/htmlwidgets-1.6.4/htmlwidgets.js"></script> +<link href="lib/datatables-css-0.0.0/datatables-crosstalk.css" rel="stylesheet" /> +<script src="lib/datatables-binding-0.33/datatables.js"></script> +<script src="lib/jquery-3.6.0/jquery-3.6.0.min.js"></script> +<link href="lib/dt-core-1.13.6/css/jquery.dataTables.min.css" rel="stylesheet" /> +<link href="lib/dt-core-1.13.6/css/jquery.dataTables.extra.css" rel="stylesheet" /> +<script src="lib/dt-core-1.13.6/js/jquery.dataTables.min.js"></script> +<link href="lib/crosstalk-1.2.1/css/crosstalk.min.css" rel="stylesheet" /> +<script src="lib/crosstalk-1.2.1/js/crosstalk.min.js"></script> +<link href="lib/highlight.js-6.2/rstudio.css" rel="stylesheet" /> +<script src="lib/highlight.js-6.2/highlight.pack.js"></script> +<meta name="viewport" content="width=device-width, initial-scale=1" /> +<link href="lib/bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" /> +<link href="lib/bootstrap-3.3.5/css/bootstrap-theme.min.css" rel="stylesheet" /> +<script src="lib/bootstrap-3.3.5/js/bootstrap.min.js"></script> +<script src="lib/bootstrap-3.3.5/shim/html5shiv.min.js"></script> +<script src="lib/bootstrap-3.3.5/shim/respond.min.js"></script> + +</head> +<body> +<div class="container-fluid"> + <style type="text/css">table tr:hover td { + font-weight:bold;text-decoration:none +} +table tr.covered td{ + background-color:rgba(95,151,68,0.3) +} + +table tr:hover.covered .num{ + background-color:rgba(95,151,68,0.7) +} +table tr.missed td{ + background-color:rgba(185,73,71,0.3) +} +table tr:hover.missed .num{ + background-color:rgba(185,73,71,0.7) +} + +table tr.missed:hover td{ + -webkit-box-shadow:0 -2px 0 0 #b94947 inset; + -moz-box-shadow:0 -2px 0 0 #b94947 inset; + box-shadow:0 -2px 0 0 #b94947 inset +} +table tr.covered:hover td{ + -webkit-box-shadow:0 -2px 0 0 #5f9744 inset; + -moz-box-shadow:0 -2px 0 0 #5f9744 inset; + box-shadow:0 -2px 0 0 #5f9744 inset +} + +table tr.never td{ + background-color:transparent +} + +table tbody { + border-style: solid; + border: 1px solid rgba(0,0,0,0.1) +} + +table .num { + border-right: 1px solid rgba(0,0,0,0.1) +} + +td.coverage em { + opacity: 0.5; +} + +table td.coverage { + border-right: 1px solid rgba(0,0,0,0.1); + font-weight: bold; + text-align: center; +} +table.table-condensed pre { + background-color: transparent; + margin: 0; + padding: 0; + border: 0; + font-size: 11px; +} +div#files td { + padding: 0; + padding-left: 5px; +} + +div#files td.num { + padding-right: 5px; +} + +table.table-condensed { + font-size: 11px; +}</style> + <div class="col-md-8 col-md-offset-2"> + <h2>mkin coverage - 89.32%</h2> + <div class="tabbable"> + <ul class="nav nav-tabs" data-tabsetid="covr"> + <li class="active"> + <a href="#tab-covr-1" data-toggle="tab" data-value="Files">Files</a> + </li> + <li> + <a href="#tab-covr-2" data-toggle="tab" data-value="Source">Source</a> + </li> + </ul> + <div class="tab-content" data-tabsetid="covr"> + <div class="tab-pane active" title="Files" data-value="Files" id="tab-covr-1"> + <div class="datatables html-widget html-fill-item" id="htmlwidget-df8b8ed832d104ae69ed" style="width:100%;height:500px;"></div> + <script type="application/json" data-for="htmlwidget-df8b8ed832d104ae69ed">{"x":{"filter":"none","vertical":false,"fillContainer":false,"data":[["<a href=\"#\">R/summary_listing.R<\/a>","<a href=\"#\">R/hierarchical_kinetics.R<\/a>","<a href=\"#\">R/aw.R<\/a>","<a href=\"#\">R/multistart.R<\/a>","<a href=\"#\">R/status.R<\/a>","<a href=\"#\">R/parms.R<\/a>","<a href=\"#\">R/lrtest.mkinfit.R<\/a>","<a href=\"#\">R/mkinresplot.R<\/a>","<a href=\"#\">R/mkinds.R<\/a>","<a href=\"#\">R/f_time_norm_focus.R<\/a>","<a href=\"#\">R/loftest.R<\/a>","<a href=\"#\">R/read_spreadsheet.R<\/a>","<a href=\"#\">R/mhmkin.R<\/a>","<a href=\"#\">R/plot.mixed.mmkin.R<\/a>","<a href=\"#\">R/plot.mkinfit.R<\/a>","<a href=\"#\">R/mkinpredict.R<\/a>","<a href=\"#\">R/update.mkinfit.R<\/a>","<a href=\"#\">R/anova.saem.mmkin.R<\/a>","<a href=\"#\">R/plot.mmkin.R<\/a>","<a href=\"#\">R/max_twa_parent.R<\/a>","<a href=\"#\">R/nafta.R<\/a>","<a href=\"#\">R/saem.R<\/a>","<a href=\"#\">R/llhist.R<\/a>","<a href=\"#\">R/illparms.R<\/a>","<a href=\"#\">R/mkin_wide_to_long.R<\/a>","<a href=\"#\">R/summary.saem.mmkin.R<\/a>","<a href=\"#\">R/summary.nlme.mmkin.R<\/a>","<a href=\"#\">R/summary.mkinfit.R<\/a>","<a href=\"#\">R/mean_degparms.R<\/a>","<a href=\"#\">R/transform_odeparms.R<\/a>","<a href=\"#\">R/mkinmod.R<\/a>","<a href=\"#\">R/mkinfit.R<\/a>","<a href=\"#\">R/endpoints.R<\/a>","<a href=\"#\">R/intervals.R<\/a>","<a href=\"#\">R/ilr.R<\/a>","<a href=\"#\">R/set_nd_nq.R<\/a>","<a href=\"#\">R/parplot.R<\/a>","<a href=\"#\">R/mkinparplot.R<\/a>","<a href=\"#\">R/nlme.R<\/a>","<a href=\"#\">R/mixed.mmkin.R<\/a>","<a href=\"#\">R/mkinerrplot.R<\/a>","<a href=\"#\">R/nlme.mmkin.R<\/a>","<a href=\"#\">R/mmkin.R<\/a>","<a href=\"#\">R/confint.mkinfit.R<\/a>","<a href=\"#\">R/create_deg_func.R<\/a>","<a href=\"#\">R/mkinerrmin.R<\/a>","<a href=\"#\">R/CAKE_export.R<\/a>","<a href=\"#\">R/summary.mmkin.R<\/a>","<a href=\"#\">R/AIC.mmkin.R<\/a>","<a href=\"#\">R/parent_solutions.R<\/a>","<a href=\"#\">R/residuals.mkinfit.R<\/a>","<a href=\"#\">R/add_err.R<\/a>","<a href=\"#\">R/mkin_long_to_wide.R<\/a>","<a href=\"#\">R/logLik.mkinfit.R<\/a>","<a href=\"#\">R/nobs.mkinfit.R<\/a>","<a href=\"#\">R/sigma_twocomp.R<\/a>","<a href=\"#\">R/mkinsub.R<\/a>"],[59,59,84,224,117,82,80,94,178,112,112,120,300,380,336,271,61,114,157,125,153,867,43,168,35,317,240,291,68,278,513,985,255,102,89,164,124,75,145,103,107,267,199,238,159,120,95,56,68,238,31,104,29,43,8,54,17],[28,14,27,76,59,22,20,26,44,39,28,46,110,183,109,87,23,62,47,48,58,466,18,66,11,149,116,167,28,88,225,452,159,53,18,56,64,47,62,31,37,83,51,69,95,43,41,20,17,15,13,12,6,5,1,1,1],[0,0,17,49,39,16,15,21,36,32,23,38,91,152,91,74,20,54,41,42,51,411,16,60,10,136,106,155,26,82,211,425,150,50,17,53,61,45,60,30,36,81,50,68,95,43,41,20,17,15,13,12,6,5,1,1,1],[28,14,10,27,20,6,5,5,8,7,5,8,19,31,18,13,3,8,6,6,7,55,2,6,1,13,10,12,2,6,14,27,9,3,1,3,3,2,2,1,1,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0],["0","0","403","168","482","20261","5","976","102","290","1","305","305","634","738","19867308","4","509","523","2","179","2273233","225","867","1025","500","323","44586","6538","30119107","4421","292559","29490","3125","529091","18","160","104","1217374","149","206","3258","1963","773","4031","72485","337","1","247","426770","1607","1285","535","166798","166810","4250","9864"],["0.00%","0.00%","62.96%","64.47%","66.10%","72.73%","75.00%","80.77%","81.82%","82.05%","82.14%","82.61%","82.73%","83.06%","83.49%","85.06%","86.96%","87.10%","87.23%","87.50%","87.93%","88.20%","88.89%","90.91%","90.91%","91.28%","91.38%","92.81%","92.86%","93.18%","93.78%","94.03%","94.34%","94.34%","94.44%","94.64%","95.31%","95.74%","96.77%","96.77%","97.30%","97.59%","98.04%","98.55%","100.00%","100.00%","100.00%","100.00%","100.00%","100.00%","100.00%","100.00%","100.00%","100.00%","100.00%","100.00%","100.00%"]],"container":"<table class=\"row-border\">\n <thead>\n <tr>\n <th>File<\/th>\n <th>Lines<\/th>\n <th>Relevant<\/th>\n <th>Covered<\/th>\n <th>Missed<\/th>\n <th>Hits / Line<\/th>\n <th>Coverage<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"searching":false,"dom":"t","paging":false,"columnDefs":[{"targets":6,"createdCell":"function(td, cellData, rowData, row, col) {\n var percent = cellData.replace(\"%\", \"\");\n if (percent > 90) {\n var grad = \"linear-gradient(90deg, #edfde7 \" + cellData + \", white \" + cellData + \")\";\n } else if (percent > 75) {\n var grad = \"linear-gradient(90deg, #f9ffe5 \" + cellData + \", white \" + cellData + \")\";\n } else {\n var grad = \"linear-gradient(90deg, #fcece9 \" + cellData + \", white \" + cellData + \")\";\n }\n $(td).css(\"background\", grad);\n}\n"},{"className":"dt-right","targets":[1,2,3,4]},{"name":"File","targets":0},{"name":"Lines","targets":1},{"name":"Relevant","targets":2},{"name":"Covered","targets":3},{"name":"Missed","targets":4},{"name":"Hits / Line","targets":5},{"name":"Coverage","targets":6}],"order":[],"autoWidth":false,"orderClasses":false},"callback":"function(table) {\ntable.on('click.dt', 'a', function() {\n files = $('div#files div');\n files.not('div.hidden').addClass('hidden');\n id = $(this).text();\n files.filter('div[id=\\'' + id + '\\']').removeClass('hidden');\n $('ul.nav a[data-value=Source]').text(id).tab('show');\n});\n}"},"evals":["options.columnDefs.0.createdCell","callback"],"jsHooks":[]}</script> + </div> + <div class="tab-pane" title="Source" data-value="Source" id="tab-covr-2"> + <div id="files"> + <div id="R/saem.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables(c("predicted", "std"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Fit nonlinear mixed models with SAEM</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function uses [saemix::saemix()] as a backend for fitting nonlinear mixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' effects models created from [mmkin] row objects using the Stochastic Approximation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Expectation Maximisation algorithm (SAEM).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' An mmkin row object is essentially a list of mkinfit objects that have been</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' obtained by fitting the same model to a list of datasets using [mkinfit].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Starting values for the fixed effects (population mean parameters, argument</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' psi0 of [saemix::saemixModel()] are the mean values of the parameters found</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' using [mmkin].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom utils packageVersion</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom saemix saemix</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An [mmkin] row object containing several fits of the same</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [mkinmod] model to different datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param verbose Should we print information about created objects of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' type [saemix::SaemixModel] and [saemix::SaemixData]?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param transformations Per default, all parameter transformations are done</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in mkin. If this argument is set to 'saemix', parameter transformations</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' are done in 'saemix' for the supported cases, i.e. (as of version 1.1.2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO, FOMC, DFOP and HS without fixing `parent_0`, and SFO or DFOP with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' one SFO metabolite.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param error_model Possibility to override the error model used in the mmkin object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param degparms_start Parameter values given as a named numeric vector will</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be used to override the starting values obtained from the 'mmkin' object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param test_log_parms If TRUE, an attempt is made to use more robust starting</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' values for population parameters fitted as log parameters in mkin (like</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rate constants) by only considering rate constants that pass the t-test</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' when calculating mean degradation parameters using [mean_degparms].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param conf.level Possibility to adjust the required confidence level</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for parameter that are tested if requested by 'test_log_parms'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param solution_type Possibility to specify the solution type in case the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' automatic choice is not desired</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param no_random_effect Character vector of degradation parameters for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' which there should be no variability over the groups. Only used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if the covariance model is not explicitly specified.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param covariance.model Will be passed to [saemix::saemixModel()]. Per</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' default, uncorrelated random effects are specified for all degradation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param omega.init Will be passed to [saemix::saemixModel()]. If using</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkin transformations and the default covariance model with optionally</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' excluded random effects, the variances of the degradation parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' are estimated using [mean_degparms], with testing of untransformed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' log parameters for significant difference from zero. If not using</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkin transformations or a custom covariance model, the default</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' initialisation of [saemix::saemixModel] is used for omega.init.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param covariates A data frame with covariate data for use in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 'covariate_models', with dataset names as row names.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param covariate_models A list containing linear model formulas with one explanatory</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variable, i.e. of the type 'parameter ~ covariate'. Covariates must be available</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in the 'covariates' data frame.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param error.init Will be passed to [saemix::saemixModel()].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param quiet Should we suppress the messages saemix prints at the beginning</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and the end of the optimisation process?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param nbiter.saemix Convenience option to increase the number of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' iterations</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param control Passed to [saemix::saemix].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further parameters passed to [saemix::saemixModel].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An S3 object of class 'saem.mmkin', containing the fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [saemix::SaemixObject] as a list component named 'so'. The</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' object also inherits from 'mixed.mmkin'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso [summary.saem.mmkin] [plot.mixed.mmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds <- lapply(experimental_data_for_UBA_2019[6:10],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' function(x) subset(x$data[c("name", "time", "value")]))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(ds) <- paste("Dataset", 6:10)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mmkin_parent_p0_fixed <- mmkin("FOMC", ds,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' state.ini = c(parent = 100), fixed_initials = "parent", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_p0_fixed <- saem(f_mmkin_parent_p0_fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mmkin_parent <- mmkin(c("SFO", "FOMC", "DFOP"), ds, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_sfo <- saem(f_mmkin_parent["SFO", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_fomc <- saem(f_mmkin_parent["FOMC", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_dfop <- saem(f_mmkin_parent["DFOP", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_sfo, f_saem_fomc, f_saem_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_sfo, f_saem_dfop, test = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(f_saem_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_dfop_red <- update(f_saem_dfop, no_random_effect = "g_qlogis")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_dfop, f_saem_dfop_red, test = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_sfo, f_saem_fomc, f_saem_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The returned saem.mmkin object contains an SaemixObject, therefore we can use</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # functions from saemix</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(saemix)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' compare.saemix(f_saem_sfo$so, f_saem_fomc$so, f_saem_dfop$so)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_saem_fomc$so, plot.type = "convergence")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_saem_fomc$so, plot.type = "individual.fit")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_saem_fomc$so, plot.type = "npde")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_saem_fomc$so, plot.type = "vpc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mmkin_parent_tc <- update(f_mmkin_parent, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_fomc_tc <- saem(f_mmkin_parent_tc["FOMC", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_fomc, f_saem_fomc_tc, test = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sfo_sfo <- mkinmod(parent = mkinsub("SFO", "A1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fomc_sfo <- mkinmod(parent = mkinsub("FOMC", "A1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "A1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The following fit uses analytical solutions for SFO-SFO and DFOP-SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # and compiled ODEs for FOMC that are much slower</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mmkin <- mmkin(list(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "SFO-SFO" = sfo_sfo, "FOMC-SFO" = fomc_sfo, "DFOP-SFO" = dfop_sfo),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # saem fits of SFO-SFO and DFOP-SFO to these data take about five seconds</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # each on this system, as we use analytical solutions written for saemix.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # When using the analytical solutions written for mkin this took around</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # four minutes</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_sfo_sfo <- saem(f_mmkin["SFO-SFO", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_dfop_sfo <- saem(f_mmkin["DFOP-SFO", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We can use print, plot and summary methods to check the results</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(f_saem_dfop_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_saem_dfop_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(f_saem_dfop_sfo, data = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The following takes about 6 minutes</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_dfop_sfo_deSolve <- saem(f_mmkin["DFOP-SFO", ], solution_type = "deSolve",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' nbiter.saemix = c(200, 80))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #anova(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # f_saem_dfop_sfo,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # f_saem_dfop_sfo_deSolve))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # If the model supports it, we can also use eigenvalue based solutions, which</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # take a similar amount of time</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #f_saem_sfo_sfo_eigen <- saem(f_mmkin["SFO-SFO", ], solution_type = "eigen",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # control = list(nbiter.saemix = c(200, 80), nbdisplay = 10))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r">saem <- function(object, ...) UseMethod("saem")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname saem</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">saem.mmkin <- function(object,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> transformations = c("mkin", "saemix"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">142</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_start = numeric(),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">144</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> test_log_parms = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.level = 0.6,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> covariance.model = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> omega.init = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_models = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> no_random_effect = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> error.init = c(1, 1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> nbiter.saemix = c(300, 100),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> control = list(displayProgress = FALSE, print = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> nbiter.saemix = nbiter.saemix,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> save = FALSE, save.graphs = FALSE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> verbose = FALSE, quiet = FALSE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- match.call()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transformations <- match.arg(transformations)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m_saemix <- saemix_model(object, verbose = verbose,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model = error_model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_start = degparms_start,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">164</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> test_log_parms = test_log_parms, conf.level = conf.level,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">165</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = solution_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transformations = transformations,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariance.model = covariance.model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> omega.init = omega.init,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = covariates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">170</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_models = covariate_models,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error.init = error.init,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">2411<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> no_random_effect = no_random_effect,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">173</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_saemix <- saemix_data(object, covariates = covariates, verbose = verbose)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">175</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">176</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_failed <- FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> FIM_failed <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_time <- system.time({</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">179</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> utils::capture.output(f_saemix <- try(saemix(m_saemix, d_saemix, control)), split = !quiet)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">180</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(f_saemix, "try-error")) fit_failed <- TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">181</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">182</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return_data <- nlme_data(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">184</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">185</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!fit_failed) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">186</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(is.na(f_saemix@results@se.fixed))) FIM_failed <- c(FIM_failed, "fixed effects")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(is.na(c(f_saemix@results@se.omega, f_saemix@results@se.respar)))) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">188</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> FIM_failed <- c(FIM_failed, "random effects and error model parameters")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">191</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms_optim <- f_saemix@results@fixed.effects</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(transparms_optim) <- f_saemix@results@name.fixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">194</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">1413<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparms_optim <- backtransform_odeparms(transparms_optim,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">1413<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object[[1]]$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">197</td> + <td class="coverage">1413<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object[[1]]$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">1413<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object[[1]]$transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">199</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">774<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparms_optim <- transparms_optim</pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">202</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">203</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saemix_data_ds <- f_saemix@data@data$ds</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkin_ds_order <- as.character(unique(return_data$ds))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saemix_ds_order <- unique(saemix_data_ds)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">206</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">207</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi <- saemix::psi(f_saemix)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(psi) <- saemix_ds_order</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return_data$predicted <- f_saemix@model@model(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">210</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi = psi[mkin_ds_order, ],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">211</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> id = as.numeric(return_data$ds),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">212</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xidep = return_data[c("time", "name")])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">214</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return_data <- transform(return_data,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">215</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residual = value - predicted,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">216</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> std = sigma_twocomp(predicted,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_saemix@results@respar[1], f_saemix@results@respar[2]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">218</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return_data <- transform(return_data,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">219</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> standardized = residual / std)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- list(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinmod = object[[1]]$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">224</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mmkin = object,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">225</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = object[[1]]$solution_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">226</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transformations = transformations,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">227</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = object[[1]]$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = object[[1]]$transform_fractions,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">229</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = covariates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">230</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_models = covariate_models,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">231</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sm = m_saemix,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">232</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> so = f_saemix,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">233</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call = call,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">234</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> time = fit_time,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> FIM_failed = FIM_failed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">236</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mean_dp_start = attr(m_saemix, "mean_dp_start"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparms.fixed = object[[1]]$bparms.fixed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">238</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data = return_data,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">239</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> err_mod = object[[1]]$err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">240</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> date.fit = date(),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">241</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saemixversion = as.character(utils::packageVersion("saemix")),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">242</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinversion = as.character(utils::packageVersion("mkin")),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> Rversion = paste(R.version$major, R.version$minor, sep=".")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">244</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">245</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">246</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!fit_failed) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">247</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$mkin_ds_order <- mkin_ds_order</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">248</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$saemix_ds_order <- saemix_ds_order</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">249</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$bparms.optim <- bparms_optim</pre> + </td> + </tr> + <tr class="never"> + <td class="num">250</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">251</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">252</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(result) <- c("saem.mmkin", "mixed.mmkin")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">253</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">254</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">255</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">256</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">257</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname saem</pre> + </td> + </tr> + <tr class="never"> + <td class="num">258</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An saem.mmkin object to print</pre> + </td> + </tr> + <tr class="never"> + <td class="num">259</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits Number of digits to use for printing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">260</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.saem.mmkin <- function(x, digits = max(3, getOption("digits") - 3), ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">261</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat( "Kinetic nonlinear mixed-effects model fit by SAEM" )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">262</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStructural model:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">263</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs <- x$mmkin[[1]]$mkinmod$diffs</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nice_diffs <- gsub("^(d.*) =", "\\1/dt =", diffs)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">265</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> writeLines(strwrap(nice_diffs, exdent = 11))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">266</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nData:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">267</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(nrow(x$data), "observations of",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">268</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$name)), "variable(s) grouped in",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">269</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$ds)), "datasets\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">270</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">271</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(x$so, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">272</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFit did not terminate successfully\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">273</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">274</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nLikelihood computed by importance sampling\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">275</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ll <- try(logLik(x$so, type = "is"), silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">276</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(ll, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">277</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Not available\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">278</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">279</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(data.frame(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">280</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> AIC = AIC(x$so, type = "is"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">281</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> BIC = BIC(x$so, type = "is"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">282</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> logLik = logLik(x$so, type = "is"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">283</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = " "), digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">284</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">285</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">286</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFitted parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">287</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int <- parms(x, ci = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">288</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(conf.int, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">289</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">290</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">291</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> invisible(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">292</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">293</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">294</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname saem</pre> + </td> + </tr> + <tr class="never"> + <td class="num">295</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An [saemix::SaemixModel] object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">296</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">297</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">saemix_model <- function(object, solution_type = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">298</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> transformations = c("mkin", "saemix"), error_model = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">299</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_start = numeric(),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">300</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> covariance.model = "auto", no_random_effect = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">301</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> omega.init = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">302</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = NULL, covariate_models = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">303</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> error.init = numeric(),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">304</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> test_log_parms = FALSE, conf.level = 0.6, verbose = FALSE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">305</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">306</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(object) > 1) stop("Only row objects allowed")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">307</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">308</td> + <td class="coverage">2346<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkin_model <- object[[1]]$mkinmod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">309</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">310</td> + <td class="coverage">2346<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(mkin_model$spec) > 1 & solution_type[1] == "analytical") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">311</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("mkin analytical solutions not supported for more thane one observed variable")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">312</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">313</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">314</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_optim <- mean_degparms(object, test_log_parms = test_log_parms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">315</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> na_degparms <- names(which(is.na(degparms_optim)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">316</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(na_degparms) > 0) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">317</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> message("Did not find valid starting values for ", paste(na_degparms, collapse = ", "), "\n",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">318</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> "Now trying with test_log_parms = FALSE")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">319</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_optim <- mean_degparms(object, test_log_parms = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">320</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">321</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "saemix") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">322</td> + <td class="coverage">779<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_optim <- backtransform_odeparms(degparms_optim,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">323</td> + <td class="coverage">779<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object[[1]]$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">324</td> + <td class="coverage">779<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object[[1]]$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">325</td> + <td class="coverage">779<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object[[1]]$transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">326</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">327</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_fixed <- object[[1]]$bparms.fixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">328</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">329</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transformations are done in the degradation function by default</pre> + </td> + </tr> + <tr class="never"> + <td class="num">330</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # (transformations = "mkin")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">331</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = rep(0, length(degparms_optim))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">332</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">333</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_optim_parm_names <- grep('_0$', names(degparms_optim), value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">334</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_fixed_parm_names <- grep('_0$', names(degparms_fixed), value = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">335</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">336</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_fixed_names <- setdiff(names(degparms_fixed), odeini_fixed_parm_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">337</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_fixed <- degparms_fixed[odeparms_fixed_names]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">338</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">339</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_fixed <- degparms_fixed[odeini_fixed_parm_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">340</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini_fixed) <- gsub('_0$', '', odeini_fixed_parm_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">341</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">342</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">343</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">344</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Model functions with analytical solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">345</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Fixed parameters, use_of_ff = "min" and turning off sinks currently not supported here</pre> + </td> + </tr> + <tr class="never"> + <td class="num">346</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # In general, we need to consider exactly how the parameters in mkinfit were specified,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">347</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # as the parameters are currently mapped by position in these solutions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">348</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sinks <- sapply(mkin_model$spec, function(x) x$sink)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">349</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(odeparms_fixed) == 0 & mkin_model$use_of_ff == "max" & all(sinks)) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">350</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Parent only</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">351</td> + <td class="coverage">2242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(mkin_model$spec) == 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">352</td> + <td class="coverage">1748<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_type <- mkin_model$spec[[1]]$type</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">353</td> + <td class="coverage">1748<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(odeini_fixed) == 1 && !grepl("_bound$", names(odeini_fixed))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">354</td> + <td class="coverage">50<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "saemix") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">355</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("saemix transformations are not supported for parent fits with fixed initial parent value")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">356</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">357</td> + <td class="coverage">50<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "SFO") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">358</td> + <td class="coverage">50<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("saemix needs at least two parameters to work on.")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">359</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">360</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "FOMC") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">361</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">362</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_fixed / (xidep[, "time"]/exp(psi[id, 2]) + 1)^exp(psi[id, 1])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">363</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">364</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">365</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "DFOP") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">366</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">367</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> g <- plogis(psi[id, 3])</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">368</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">369</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_fixed * (g * exp(- exp(psi[id, 1]) * t) +</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">370</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> (1 - g) * exp(- exp(psi[id, 2]) * t))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">371</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">372</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">373</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "HS") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">374</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">375</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> tb <- exp(psi[id, 3])</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">376</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">377</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> k1 = exp(psi[id, 1])</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">378</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_fixed * ifelse(t <= tb,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">379</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> exp(- k1 * t),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">380</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> exp(- k1 * tb) * exp(- exp(psi[id, 2]) * (t - tb)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">381</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">382</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">383</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">384</td> + <td class="coverage">1698<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(odeini_fixed) == 2) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">385</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("SFORB with fixed initial parent value is not supported")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">386</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">387</td> + <td class="coverage">1698<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "SFO") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">388</td> + <td class="coverage">785<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">389</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">390</td> + <td class="coverage">2628025<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] * exp( - exp(psi[id, 2]) * xidep[, "time"])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">391</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">392</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">393</td> + <td class="coverage">502<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">394</td> + <td class="coverage">4054103<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] * exp( - psi[id, 2] * xidep[, "time"])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">395</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">396</td> + <td class="coverage">502<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = c(0, 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">397</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">398</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">399</td> + <td class="coverage">1698<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "FOMC") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">400</td> + <td class="coverage">76<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">401</td> + <td class="coverage">41<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">402</td> + <td class="coverage">510269<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] / (xidep[, "time"]/exp(psi[id, 3]) + 1)^exp(psi[id, 2])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">403</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">404</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">405</td> + <td class="coverage">35<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">406</td> + <td class="coverage">432565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] / (xidep[, "time"]/psi[id, 3] + 1)^psi[id, 2]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">407</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">408</td> + <td class="coverage">35<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = c(0, 1, 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">409</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">410</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">411</td> + <td class="coverage">1698<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "DFOP") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">412</td> + <td class="coverage">677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">413</td> + <td class="coverage">637<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">414</td> + <td class="coverage">8785439<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g <- plogis(psi[id, 4])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">415</td> + <td class="coverage">8785439<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">416</td> + <td class="coverage">8785439<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] * (g * exp(- exp(psi[id, 2]) * t) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">417</td> + <td class="coverage">8785439<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (1 - g) * exp(- exp(psi[id, 3]) * t))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">418</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">419</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">420</td> + <td class="coverage">40<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">421</td> + <td class="coverage">507885<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g <- psi[id, 4]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">422</td> + <td class="coverage">507885<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">423</td> + <td class="coverage">507885<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] * (g * exp(- psi[id, 2] * t) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">424</td> + <td class="coverage">507885<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (1 - g) * exp(- psi[id, 3] * t))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">425</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">426</td> + <td class="coverage">40<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = c(0, 1, 1, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">427</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">428</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">429</td> + <td class="coverage">1698<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "SFORB") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">430</td> + <td class="coverage">150<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">431</td> + <td class="coverage">130<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">432</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_12 <- exp(psi[id, 3])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">433</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_21 <- exp(psi[id, 4])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">434</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_1output <- exp(psi[id, 2])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">435</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">436</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">437</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sqrt_exp = sqrt(1/4 * (k_12 + k_21 + k_1output)^2 - k_1output * k_21)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">438</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> b1 = 0.5 * (k_12 + k_21 + k_1output) + sqrt_exp</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">439</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> b2 = 0.5 * (k_12 + k_21 + k_1output) - sqrt_exp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">440</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">441</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] * (((k_12 + k_21 - b1)/(b2 - b1)) * exp(-b1 * t) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">442</td> + <td class="coverage">1240580<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((k_12 + k_21 - b2)/(b1 - b2)) * exp(-b2 * t))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">443</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">444</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">445</td> + <td class="coverage">20<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">446</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_12 <- psi[id, 3]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">447</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_21 <- psi[id, 4]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">448</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_1output <- psi[id, 2]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">449</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">450</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">451</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sqrt_exp = sqrt(1/4 * (k_12 + k_21 + k_1output)^2 - k_1output * k_21)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">452</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> b1 = 0.5 * (k_12 + k_21 + k_1output) + sqrt_exp</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">453</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> b2 = 0.5 * (k_12 + k_21 + k_1output) - sqrt_exp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">454</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">455</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] * (((k_12 + k_21 - b1)/(b2 - b1)) * exp(-b1 * t) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">456</td> + <td class="coverage">290980<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((k_12 + k_21 - b2)/(b1 - b2)) * exp(-b2 * t))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">457</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">458</td> + <td class="coverage">20<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = c(0, 1, 1, 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">459</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">460</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">461</td> + <td class="coverage">1698<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "HS") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">462</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">463</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">464</td> + <td class="coverage">150610<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tb <- exp(psi[id, 4])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">465</td> + <td class="coverage">150610<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">466</td> + <td class="coverage">150610<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1 <- exp(psi[id, 2])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">467</td> + <td class="coverage">150610<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] * ifelse(t <= tb,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">468</td> + <td class="coverage">150610<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> exp(- k1 * t),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">469</td> + <td class="coverage">150610<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> exp(- k1 * tb) * exp(- exp(psi[id, 3]) * (t - tb)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">470</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">471</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">472</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">473</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> tb <- psi[id, 4]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">474</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">475</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> psi[id, 1] * ifelse(t <= tb,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">476</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> exp(- psi[id, 2] * t),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">477</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> exp(- psi[id, 2] * tb) * exp(- psi[id, 3] * (t - tb)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">478</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">479</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = c(0, 1, 1, 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">480</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">481</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">482</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">483</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">484</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">485</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Parent with one metabolite</pre> + </td> + </tr> + <tr class="never"> + <td class="num">486</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Parameter names used in the model functions are as in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">487</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # https://nbviewer.jupyter.org/urls/jrwb.de/nb/Symbolic%20ODE%20solutions%20for%20mkin.ipynb</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">488</td> + <td class="coverage">2192<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> types <- unname(sapply(mkin_model$spec, function(x) x$type))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">489</td> + <td class="coverage">2192<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(mkin_model$spec) == 2 &! "SFORB" %in% types ) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">490</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Initial value for the metabolite (n20) must be fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">491</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (names(odeini_fixed) == names(mkin_model$spec)[2]) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">492</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n20 <- odeini_fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">493</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_name <- names(mkin_model$spec)[1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">494</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(types, c("SFO", "SFO"))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">495</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">496</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">497</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">498</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n10 <- psi[id, 1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">499</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1 <- exp(psi[id, 2])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">500</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- exp(psi[id, 3])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">501</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f12 <- plogis(psi[id, 4])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">502</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(xidep[, "name"] == parent_name,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">503</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n10 * exp(- k1 * t),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">504</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (((k2 - k1) * n20 - f12 * k1 * n10) * exp(- k2 * t)) / (k2 - k1) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">505</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (f12 * k1 * n10 * exp(- k1 * t)) / (k2 - k1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">506</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">507</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">508</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">509</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">510</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">511</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> n10 <- psi[id, 1]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">512</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> k1 <- psi[id, 2]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">513</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- psi[id, 3]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">514</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> f12 <- psi[id, 4]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">515</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(xidep[, "name"] == parent_name,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">516</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> n10 * exp(- k1 * t),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">517</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> (((k2 - k1) * n20 - f12 * k1 * n10) * exp(- k2 * t)) / (k2 - k1) +</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">518</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> (f12 * k1 * n10 * exp(- k1 * t)) / (k2 - k1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">519</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">520</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">521</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = c(0, 1, 1, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">522</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">523</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">524</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(types, c("DFOP", "SFO"))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">525</td> + <td class="coverage">286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">526</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">527</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">528</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n10 <- psi[id, 1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">529</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- exp(psi[id, 2])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">530</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f12 <- plogis(psi[id, 3])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">531</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> l1 <- exp(psi[id, 4])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">532</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> l2 <- exp(psi[id, 5])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">533</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g <- plogis(psi[id, 6])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">534</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(xidep[, "name"] == parent_name,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">535</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n10 * (g * exp(- l1 * t) + (1 - g) * exp(- l2 * t)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">536</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((f12 * g - f12) * l2 * n10 * exp(- l2 * t)) / (l2 - k2) -</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">537</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (f12 * g * l1 * n10 * exp(- l1 * t)) / (l1 - k2) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">538</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((((l1 - k2) * l2 - k2 * l1 + k2^2) * n20 +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">539</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((f12 * l1 + (f12 * g - f12) * k2) * l2 -</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">540</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f12 * g * k2 * l1) * n10) * exp( - k2 * t)) /</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">541</td> + <td class="coverage">1821022<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((l1 - k2) * l2 - k2 * l1 + k2^2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">542</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">543</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">544</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">545</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">546</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- xidep[, "time"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">547</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n10 <- psi[id, 1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">548</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- psi[id, 2]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">549</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f12 <- psi[id, 3]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">550</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> l1 <- psi[id, 4]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">551</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> l2 <- psi[id, 5]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">552</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g <- psi[id, 6]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">553</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(xidep[, "name"] == parent_name,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">554</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n10 * (g * exp(- l1 * t) + (1 - g) * exp(- l2 * t)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">555</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((f12 * g - f12) * l2 * n10 * exp(- l2 * t)) / (l2 - k2) -</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">556</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (f12 * g * l1 * n10 * exp(- l1 * t)) / (l1 - k2) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">557</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((((l1 - k2) * l2 - k2 * l1 + k2^2) * n20 +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">558</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((f12 * l1 + (f12 * g - f12) * k2) * l2 -</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">559</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f12 * g * k2 * l1) * n10) * exp( - k2 * t)) /</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">560</td> + <td class="coverage">2908620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((l1 - k2) * l2 - k2 * l1 + k2^2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">561</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">562</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">563</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = c(0, 1, 3, 1, 1, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">564</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">565</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">566</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">567</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">568</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">569</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">570</td> + <td class="coverage">2192<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.function(model_function) & solution_type == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">571</td> + <td class="coverage">2083<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = "analytical saemix"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">572</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">573</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">574</td> + <td class="coverage">109<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "saemix") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">575</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Using saemix transformations is only supported if an analytical solution is implemented for saemix")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">576</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">577</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">578</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "auto")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">579</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type <- object[[1]]$solution_type</pre> + </td> + </tr> + <tr class="never"> + <td class="num">580</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">581</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define some variables to avoid function calls in model function</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">582</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms_optim_names <- names(degparms_optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">583</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_optim_names <- gsub('_0$', '', odeini_optim_parm_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">584</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diff_names <- names(mkin_model$diffs)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">585</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ode_transparms_optim_names <- setdiff(transparms_optim_names, odeini_optim_parm_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">586</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates <- object[[1]]$transform_rates</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">587</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions <- object[[1]]$transform_fractions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">588</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">589</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get native symbol info for speed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">590</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_symbols = FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">591</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "deSolve" & !is.null(mkin_model$cf)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">592</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkin_model$symbols <- try(deSolve::checkDLL(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">593</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dllname = mkin_model$dll_info[["name"]],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">594</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> func = "diffs", initfunc = "initpar",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">595</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> jacfunc = NULL, nout = 0, outnames = NULL))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">596</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!inherits(mkin_model$symbols, "try-error")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">597</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_symbols = TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">598</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">599</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">600</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">601</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define the model function</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">602</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- function(psi, id, xidep) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">603</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">604</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> uid <- unique(id)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">605</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">606</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_list <- lapply(uid, function(i) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">607</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">608</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms_optim <- as.numeric(psi[i, ]) # psi[i, ] is a dataframe when called in saemix.predict</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">609</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(transparms_optim) <- transparms_optim_names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">610</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">611</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_optim <- transparms_optim[odeini_optim_parm_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">612</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini_optim) <- odeini_optim_names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">613</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">614</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- c(odeini_optim, odeini_fixed)[diff_names]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">615</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">616</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_optim <- backtransform_odeparms(transparms_optim[ode_transparms_optim_names], mkin_model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">617</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">618</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">619</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms <- c(odeparms_optim, odeparms_fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">620</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">621</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xidep_i <- xidep[which(id == i), ]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">622</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">623</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type[1] == "analytical") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">624</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> out_values <- mkin_model$deg_func(xidep_i, odeini, odeparms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">625</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">626</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">627</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> i_time <- xidep_i$time</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">628</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> i_name <- xidep_i$name</pre> + </td> + </tr> + <tr class="never"> + <td class="num">629</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">630</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_wide <- mkinpredict(mkin_model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">631</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms = odeparms, odeini = odeini,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">632</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = solution_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">633</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes = sort(unique(i_time)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">634</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> na_stop = FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">635</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">636</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">637</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_index <- cbind(as.character(i_time), as.character(i_name))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">638</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_values <- out_wide[out_index]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">639</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">640</td> + <td class="coverage">43671888<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(out_values)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">641</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">642</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- unlist(res_list)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">643</td> + <td class="coverage">873912<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">644</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">645</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">646</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">647</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(error_model, "auto")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">648</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model = object[[1]]$err_mod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">649</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">650</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error.model <- switch(error_model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">651</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> const = "constant",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">652</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tc = "combined",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">653</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs = "constant")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">654</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">655</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model == "obs") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">656</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> warning("The error model 'obs' (variance by variable) can currently not be transferred to an saemix model")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">657</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">658</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">659</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_psi0 <- degparms_optim</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">660</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_psi0[names(degparms_start)] <- degparms_start</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">661</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi0_matrix <- matrix(degparms_psi0, nrow = 1,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">662</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list("(Intercept)", names(degparms_psi0)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">663</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">664</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (covariance.model[1] == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">665</td> + <td class="coverage">2062<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariance_diagonal <- rep(1, length(degparms_optim))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">666</td> + <td class="coverage">2062<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(no_random_effect)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">667</td> + <td class="coverage">766<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_no_random <- which(names(degparms_psi0) %in% no_random_effect)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">668</td> + <td class="coverage">766<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariance_diagonal[degparms_no_random] <- 0</pre> + </td> + </tr> + <tr class="never"> + <td class="num">669</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">670</td> + <td class="coverage">2062<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariance.model = diag(covariance_diagonal)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">671</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">672</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">673</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (omega.init[1] == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">674</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">675</td> + <td class="coverage">1413<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_eta_ini <- as.numeric( # remove names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">676</td> + <td class="coverage">1413<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mean_degparms(object,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">677</td> + <td class="coverage">1413<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> random = TRUE, test_log_parms = TRUE)$eta)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">678</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">679</td> + <td class="coverage">1413<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> omega.init <- 2 * diag(degparms_eta_ini^2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">680</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">681</td> + <td class="coverage">774<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> omega.init <- matrix(nrow = 0, ncol = 0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">682</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">683</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">684</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">685</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(covariate_models)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">686</td> + <td class="coverage">2027<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate.model <- matrix(nrow = 0, ncol = 0) # default in saemixModel()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">687</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">688</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_dependent <- sapply(covariate_models, function(x) as.character(x[[2]]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">689</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates_in_models = unique(unlist(lapply(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">690</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_models, function(x)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">691</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(attr(terms(x), "factors"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">692</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">693</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates_not_available <- setdiff(covariates_in_models, names(covariates))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">694</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(covariates_not_available) > 0) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">695</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Covariate(s) ", paste(covariates_not_available, collapse = ", "),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">696</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> " used in the covariate models not available in the covariate data")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">697</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">698</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi0_matrix <- rbind(psi0_matrix,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">699</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> matrix(0, nrow = length(covariates), ncol = ncol(psi0_matrix),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">700</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list(names(covariates), colnames(psi0_matrix))))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">701</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate.model <- matrix(0, nrow = length(covariates),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">702</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ncol = ncol(psi0_matrix),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">703</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">704</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = names(covariates),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">705</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms = colnames(psi0_matrix)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">706</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformations == "saemix") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">707</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Covariate models with saemix transformations currently not supported")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">708</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">709</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms_trans <- as.data.frame(t(sapply(object, parms, transformed = TRUE)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">710</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (covariate_model in covariate_models) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">711</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_name <- as.character(covariate_model[[2]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">712</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_data <- cbind(parms_trans, covariates)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">713</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ini_model <- lm(covariate_model, data = model_data)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">714</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ini_coef <- coef(ini_model)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">715</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi0_matrix[names(ini_coef), covariate_name] <- ini_coef</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">716</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate.model[names(ini_coef)[-1], covariate_name] <- as.numeric(as.logical(ini_coef[-1]))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">717</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">718</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">719</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">720</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- saemix::saemixModel(model_function,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">721</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi0 = psi0_matrix,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">722</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "Mixed model generated from mmkin object",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">723</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform.par = transform.par,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">724</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error.model = error.model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">725</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> verbose = verbose,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">726</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariance.model = covariance.model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">727</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate.model = covariate.model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">728</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> omega.init = omega.init,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">729</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error.init = error.init,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">730</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">731</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">732</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(res, "mean_dp_start") <- degparms_optim</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">733</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">734</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">735</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">736</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname saem</pre> + </td> + </tr> + <tr class="never"> + <td class="num">737</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom rlang !!!</pre> + </td> + </tr> + <tr class="never"> + <td class="num">738</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An [saemix::SaemixData] object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">739</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">740</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">saemix_data <- function(object, covariates = NULL, verbose = FALSE, ...) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">741</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(object) > 1) stop("Only row objects allowed")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">742</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_names <- colnames(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">743</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">744</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_list <- lapply(object, function(x) x$data[c("time", "variable", "observed")])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">745</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(ds_list) <- ds_names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">746</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_saemix_all <- vctrs::vec_rbind(!!!ds_list, .names_to = "ds")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">747</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_saemix <- data.frame(ds = ds_saemix_all$ds,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">748</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name = as.character(ds_saemix_all$variable),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">749</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> time = ds_saemix_all$time,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">750</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> value = ds_saemix_all$observed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">751</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stringsAsFactors = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">752</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(covariates)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">753</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name.covariates <- names(covariates)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">754</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates$ds <- rownames(covariates)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">755</td> + <td class="coverage">160<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_saemix <- merge(ds_saemix, covariates, sort = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">756</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">757</td> + <td class="coverage">2027<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name.covariates <- character(0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">758</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">759</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">760</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- saemix::saemixData(ds_saemix,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">761</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name.group = "ds",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">762</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name.predictors = c("time", "name"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">763</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name.response = "value",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">764</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name.covariates = name.covariates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">765</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> verbose = verbose,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">766</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">767</td> + <td class="coverage">2187<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">768</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">769</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">770</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' logLik method for saem.mmkin objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">771</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">772</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object The fitted [saem.mmkin] object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">773</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Passed to [saemix::logLik.SaemixObject]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">774</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param method Passed to [saemix::logLik.SaemixObject]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">775</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">776</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">logLik.saem.mmkin <- function(object, ..., method = c("is", "lin", "gq")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">777</td> + <td class="coverage">4404<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> method <- match.arg(method)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">778</td> + <td class="coverage">4404<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(logLik(object$so, method = method))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">779</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">780</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">781</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">782</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">update.saem.mmkin <- function(object, ..., evaluate = TRUE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">783</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- object$call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">784</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # For some reason we get saem.mmkin in the call when using mhmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">785</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # so we need to fix this so we do not have to export saem.mmkin in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">786</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # addition to the S3 method</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">787</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call[[1]] <- saem</pre> + </td> + </tr> + <tr class="never"> + <td class="num">788</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">789</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We also need to provide the mmkin object in the call, so it</pre> + </td> + </tr> + <tr class="never"> + <td class="num">790</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # will also be found when called by testthat or pkgdown</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">791</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call[[2]] <- object$mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">792</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">793</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments <- match.call(expand.dots = FALSE)$...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">794</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">795</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(update_arguments) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">796</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_in_call <- !is.na(match(names(update_arguments), names(call)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">797</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">798</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">799</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (a in names(update_arguments)[update_arguments_in_call]) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">800</td> + <td class="coverage">35<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call[[a]] <- update_arguments[[a]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">801</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">802</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">803</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_not_in_call <- !update_arguments_in_call</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">804</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(any(update_arguments_not_in_call)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">805</td> + <td class="coverage">472<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- c(as.list(call), update_arguments[update_arguments_not_in_call])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">806</td> + <td class="coverage">472<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- as.call(call)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">807</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">808</td> + <td class="coverage">507<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(evaluate) eval(call, parent.frame())</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">809</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> else call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">810</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">811</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">812</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">813</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname parms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">814</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ci Should a matrix with estimates and confidence interval boundaries</pre> + </td> + </tr> + <tr class="never"> + <td class="num">815</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be returned? If FALSE (default), a vector of estimates is returned if no</pre> + </td> + </tr> + <tr class="never"> + <td class="num">816</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' covariates are given, otherwise a matrix of estimates is returned, with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">817</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' each column corresponding to a row of the data frame holding the covariates</pre> + </td> + </tr> + <tr class="never"> + <td class="num">818</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param covariates A data frame holding covariate values for which to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">819</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' return parameter values. Only has an effect if 'ci' is FALSE.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">820</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">parms.saem.mmkin <- function(object, ci = FALSE, covariates = NULL, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">821</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cov.mod <- object$sm@covariance.model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">822</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_cov_mod_parms <- sum(cov.mod[upper.tri(cov.mod, diag = TRUE)])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">823</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_parms <- length(object$sm@name.modpar) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">824</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_cov_mod_parms +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">825</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(object$sm@name.sigma)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">826</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">827</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(object$so, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">828</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int <- matrix(rep(NA, 3 * n_parms), ncol = 3)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">829</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(conf.int) <- c("estimate", "lower", "upper")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">830</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">831</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int <- object$so@results@conf.int[c("estimate", "lower", "upper")]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">832</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(conf.int) <- object$so@results@conf.int[["name"]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">833</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int.var <- grepl("^Var\\.", rownames(conf.int))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">834</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int <- conf.int[!conf.int.var, ]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">835</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int.cov <- grepl("^Cov\\.", rownames(conf.int))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">836</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int <- conf.int[!conf.int.cov, ]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">837</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">838</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> estimate <- conf.int[, "estimate"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">839</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">840</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(estimate) <- rownames(conf.int)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">841</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">842</td> + <td class="coverage">2904<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ci) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">843</td> + <td class="coverage">1034<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(conf.int)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">844</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">845</td> + <td class="coverage">1870<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(covariates)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">846</td> + <td class="coverage">1760<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(estimate)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">847</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">848</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> est_for_cov <- matrix(NA,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">849</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nrow = length(object$sm@name.modpar), ncol = nrow(covariates),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">850</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = (list(object$sm@name.modpar, rownames(covariates))))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">851</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covmods <- object$covariate_models</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">852</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(covmods) <- sapply(covmods, function(x) as.character(x[[2]]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">853</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (deg_parm_name in rownames(est_for_cov)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">854</td> + <td class="coverage">440<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (deg_parm_name %in% names(covmods)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">855</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate <- covmods[[deg_parm_name]][[3]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">856</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> beta_degparm_name <- paste0("beta_", covariate,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">857</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "(", deg_parm_name, ")")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">858</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> est_for_cov[deg_parm_name, ] <- estimate[deg_parm_name] +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">859</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates[[covariate]] * estimate[beta_degparm_name]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">860</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">861</td> + <td class="coverage">330<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> est_for_cov[deg_parm_name, ] <- estimate[deg_parm_name]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">862</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">863</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">864</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(est_for_cov)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">865</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">866</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">867</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/status.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Method to get status information for fit array objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object The object to investigate</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x The object to be printed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots For potential future extensions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An object with the same dimensions as the fit array</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' suitable printing method.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">status <- function(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">11</td> + <td class="coverage">589<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("status", object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname status</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits <- mmkin(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c("SFO", "FOMC"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list("FOCUS A" = FOCUS_2006_A,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "FOCUS B" = FOCUS_2006_C),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' status(fits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">status.mmkin <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">26</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> all_summary_warnings <- character()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">27</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sww <- 0 # Counter for Shapiro-Wilks warnings</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">29</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- lapply(object,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">30</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> function(fit) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">31</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit, "try-error")) return("E")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">4391<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sw <- fit$summary_warnings</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">4391<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> swn <- names(sw)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">34</td> + <td class="coverage">4391<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(sw) > 0) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">35</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(grepl("S", swn))) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">36</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> sww <<- sww + 1</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">37</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> swn <- gsub("S", paste0("S", sww), swn)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">39</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> warnstring <- paste(swn, collapse = ", ")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">40</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> names(sw) <- swn</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">41</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> all_summary_warnings <<- c(all_summary_warnings, sw)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">42</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return(warnstring)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">4391<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return("OK")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- unlist(result)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(result) <- dim(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(result) <- dimnames(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> u_swn <- unique(names(all_summary_warnings))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(result, "unique_warnings") <- all_summary_warnings[u_swn]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(result) <- "status.mmkin"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname status</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.status.mmkin <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> u_w <- attr(x, "unique_warnings")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(x, "unique_warnings") <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(x) <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x, quote = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in seq_along(u_w)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">66</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat(names(u_w)[i], ": ", u_w[i], "\n", sep = "")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">376<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "OK")) cat("OK: No warnings\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">69</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "E")) cat("E: Error\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname status</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">status.mhmkin <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(object[[1]], "saem.mmkin")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> test_func <- function(fit) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">78</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return("E")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit$so, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">81</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return("E")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(fit$FIM_failed)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">84</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return_values <- c("fixed effects" = "Fth",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">85</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> "random effects and error model parameters" = "FO")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">86</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return(paste(return_values[fit$FIM_failed], collapse = ", "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return("OK")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">94</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Only mhmkin objects containing saem.mmkin objects currently supported")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- lapply(object, test_func)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- unlist(result)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(result) <- dim(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(result) <- dimnames(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(result) <- "status.mhmkin"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname status</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.status.mhmkin <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(x) <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x, quote = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "OK")) cat("OK: Fit terminated successfully\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">112</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "Fth")) cat("Fth: Could not invert FIM for fixed effects\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">113</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "FO")) cat("FO: Could not invert FIM for random effects and error model parameters\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">114</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "Fth, FO")) cat("Fth, FO: Could not invert FIM for fixed effects, nor for random effects and error model parameters\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">115</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "E")) cat("E: Error\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/endpoints.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function to calculate endpoints for further use from kinetic models fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' with mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function calculates DT50 and DT90 values as well as formation fractions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' from kinetic models fitted with mkinfit. If the SFORB model was specified</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for one of the parents or metabolites, the Eigenvalues are returned. These</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' are equivalent to the rate constants of the DFOP model, but with the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' advantage that the SFORB model can also be used for metabolites.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Additional DT50 values are calculated from the FOMC DT90 and k1 and k2 from</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' HS and DFOP, as well as from Eigenvalues b1 and b2 of any SFORB models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param fit An object of class [mkinfit], [nlme.mmkin] or [saem.mmkin], or</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' another object that has list components mkinmod containing an [mkinmod]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' degradation model, and two numeric vectors, bparms.optim and bparms.fixed,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' that contain parameter values for that model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param covariates Numeric vector with covariate values for all variables in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' any covariate models in the object. If given, it overrides 'covariate_quantile'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param covariate_quantile This argument only has an effect if the fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' object has covariate models. If so, the default is to show endpoints</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for the median of the covariate values (50th percentile).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats optimize</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A list with a matrix of dissipation times named distimes, and, if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' applicable, a vector of formation fractions named ff and, if the SFORB model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' was in use, a vector of eigenvalues of these SFORB models, equivalent to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' DFOP rate constants</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note The function is used internally by [summary.mkinfit],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [summary.nlme.mmkin] and [summary.saem.mmkin].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit("FOMC", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_2 <- mkinfit("DFOP", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(fit_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_3 <- mkinfit("SFORB", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(fit_3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">endpoints <- function(fit, covariates = NULL, covariate_quantile = 0.5) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinmod <- fit$mkinmod</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars <- names(mkinmod$spec)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(fit$covariate_models)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(covariates)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = as.data.frame(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> apply(fit$covariates, 2, quantile,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_quantile, simplify = FALSE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">52</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_m <- matrix(covariates, byrow = TRUE)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">53</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(covariate_m) <- names(covariates)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">54</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(covariate_m) <- "User"</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">55</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> covariates <- as.data.frame(covariate_m)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_trans <- parms(fit, covariates = covariates)[, 1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit, "saem.mmkin") & (fit$transformations == "saemix")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">59</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- degparms_trans</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- backtransform_odeparms(degparms_trans,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = fit$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">110<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = fit$transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">56098<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- c(fit$bparms.optim, fit$bparms.fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set up object to return</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep <- list()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$covariates <- covariates</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$ff <- vector()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$SFORB <- vector()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes <- data.frame(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50 = rep(NA, length(obs_vars)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90 = rep(NA, length(obs_vars)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = obs_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs_var in obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> type = names(mkinmod$map[[obs_var]])[1]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get formation fractions if directly fitted, and calculate remaining fraction to sink</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names = grep(paste("^f", obs_var, sep = "_"), names(degparms), value=TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(f_names) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">15068<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_values = degparms[f_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">15068<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_to_sink = 1 - sum(f_values)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">15068<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(f_to_sink) = ifelse(type == "SFORB",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">15068<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste(obs_var, "free", "sink", sep = "_"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">15068<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste(obs_var, "sink", sep = "_"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">15068<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (f_name in f_names) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">17338<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$ff[[sub("f_", "", sub("_to_", "_", f_name))]] = f_values[[f_name]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">15068<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$ff = append(ep$ff, f_to_sink)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get the rest</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "SFO") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">40900<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_names = grep(paste("^k", obs_var, sep="_"), names(degparms), value=TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">40900<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_tot = sum(degparms[k_names])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">40900<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50 = log(2)/k_tot</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">40900<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90 = log(10)/k_tot</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">40900<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (mkinmod$use_of_ff == "min" && length(obs_vars) > 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">622<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (k_name in k_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">932<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$ff[[sub("k_", "", k_name)]] = degparms[[k_name]] / k_tot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "FOMC") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">1790<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> alpha = degparms["alpha"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">1790<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> beta = degparms["beta"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">1790<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50 = beta * (2^(1/alpha) - 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">1790<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90 = beta * (10^(1/alpha) - 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">1790<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_back = DT90 / (log(10)/log(2)) # Backcalculated DT50 as recommended in FOCUS 2011</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">1790<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50back")] = DT50_back</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "IORE") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_names = grep(paste("^k__iore", obs_var, sep="_"), names(degparms), value=TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_tot = sum(degparms[k_names])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # From the NAFTA kinetics guidance, p. 5</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n = degparms[paste("N", obs_var, sep = "_")]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k = k_tot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Use the initial concentration of the parent compound</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> source_name = mkinmod$map[[1]][[1]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">126</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> c0 = degparms[paste(source_name, "0", sep = "_")]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> alpha = 1 / (n - 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">128</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> beta = (c0^(1 - n))/(k * (n - 1))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50 = beta * (2^(1/alpha) - 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90 = beta * (10^(1/alpha) - 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_back = DT90 / (log(10)/log(2)) # Backcalculated DT50 as recommended in FOCUS 2011</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50back")] = DT50_back</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (mkinmod$use_of_ff == "min") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">134</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> for (k_name in k_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">136</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ep$ff[[sub("k_", "", k_name)]] = degparms[[k_name]] / k_tot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "DFOP") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1 = degparms["k1"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 = degparms["k2"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g = degparms["g"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f <- function(log_t, x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">684705<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t <- exp(log_t)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">684705<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fraction <- g * exp( - k1 * t) + (1 - g) * exp( - k2 * t)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">684705<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (fraction - (1 - x/100))^2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_k1 = log(2)/k1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_k2 = log(2)/k2</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90_k1 = log(10)/k1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">152</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90_k2 = log(10)/k2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">154</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50 <- try(exp(optimize(f, c(log(DT50_k1), log(DT50_k2)), x=50)$minimum),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">155</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">156</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90 <- try(exp(optimize(f, c(log(DT90_k1), log(DT90_k2)), x=90)$minimum),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">157</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> silent = TRUE)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">158</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(DT50, "try-error")) DT50 = NA</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">159</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(DT90, "try-error")) DT90 = NA</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_back = DT90 / (log(10)/log(2)) # Backcalculated DT50 as recommended in FOCUS 2011</pre> + </td> + </tr> + <tr class="never"> + <td class="num">161</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50back")] = DT50_back</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50_k1")] = DT50_k1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">164</td> + <td class="coverage">27729<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50_k2")] = DT50_k2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "HS") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1 = degparms["k1"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 = degparms["k2"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tb = degparms["tb"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">170</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DTx <- function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">636<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DTx.a <- (log(100/(100 - x)))/k1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">636<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DTx.b <- tb + (log(100/(100 - x)) - k1 * tb)/k2</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">339<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (DTx.a < tb) DTx <- DTx.a</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">297<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else DTx <- DTx.b</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">636<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(DTx)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50 <- DTx(50)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90 <- DTx(90)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">179</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_back = DT90 / (log(10)/log(2)) # Backcalculated DT50 as recommended in FOCUS 2011</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">180</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_k1 = log(2)/k1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_k2 = log(2)/k2</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50back")] = DT50_back</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50_k1")] = DT50_k1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">318<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50_k2")] = DT50_k2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">186</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "SFORB") {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">187</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # FOCUS kinetics (2006), p. 60 f</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_out_names = grep(paste("^k", obs_var, "free", sep="_"), names(degparms), value=TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">189</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_out_names = setdiff(k_out_names, paste("k", obs_var, "free", "bound", sep="_"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">190</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_1output = sum(degparms[k_out_names])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">191</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_12 = degparms[paste("k", obs_var, "free", "bound", sep="_")]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_21 = degparms[paste("k", obs_var, "bound", "free", sep="_")]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">194</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sqrt_exp = sqrt(1/4 * (k_12 + k_21 + k_1output)^2 - k_1output * k_21)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> b1 = 0.5 * (k_12 + k_21 + k_1output) + sqrt_exp</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> b2 = 0.5 * (k_12 + k_21 + k_1output) - sqrt_exp</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">197</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g = (k_12 + k_21 - b1)/(b2 - b1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">198</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_b1 = log(2)/b1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_b2 = log(2)/b2</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">201</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90_b1 = log(10)/b1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">202</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90_b2 = log(10)/b2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> SFORB_fraction = function(t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">60096<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g * exp(-b1 * t) + (1 - g) * exp(-b2 * t)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">206</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">207</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_50 <- function(log_t) (SFORB_fraction(exp(log_t)) - 0.5)^2</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> log_DT50 <- try(optimize(f_50, c(log(DT50_b1), log(DT50_b2)))$minimum,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">210</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">211</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_90 <- function(log_t) (SFORB_fraction(exp(log_t)) - 0.1)^2</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">212</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> log_DT90 <- try(optimize(f_90, c(log(DT90_b1), log(DT90_b2)))$minimum,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">213</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> silent = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">214</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">215</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50 = if (inherits(log_DT50, "try-error")) NA</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">216</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else exp(log_DT50)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90 = if (inherits(log_DT90, "try-error")) NA</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">218</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else exp(log_DT90)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">219</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">220</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_back = DT90 / (log(10)/log(2)) # Backcalculated DT50 as recommended in FOCUS 2011</pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (k_out_name in k_out_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">223</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">224</td> + <td class="coverage">2618<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$ff[[sub("k_", "", k_out_name)]] = degparms[[k_out_name]] / k_1output</pre> + </td> + </tr> + <tr class="never"> + <td class="num">225</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">226</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Return the eigenvalues for comparison with DFOP rate constants</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$SFORB[[paste(obs_var, "b1", sep="_")]] = b1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">229</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$SFORB[[paste(obs_var, "b2", sep="_")]] = b2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">230</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Return g for comparison with DFOP</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">231</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$SFORB[[paste(obs_var, "g", sep="_")]] = g</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">233</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50back")] = DT50_back</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">234</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c(paste("DT50", obs_var, "b1", sep = "_"))] = DT50_b1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">2616<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c(paste("DT50", obs_var, "b2", sep = "_"))] = DT50_b2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">236</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "logistic") {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # FOCUS kinetics (2014) p. 67</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">239</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> kmax = degparms["kmax"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">240</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k0 = degparms["k0"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">241</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> r = degparms["r"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">242</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50 = (1/r) * log(1 - ((kmax/k0) * (1 - 2^(r/kmax))))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT90 = (1/r) * log(1 - ((kmax/k0) * (1 - 10^(r/kmax))))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">244</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">245</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_k0 = log(2)/k0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">246</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DT50_kmax = log(2)/kmax</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">247</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50_k0")] = DT50_k0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">248</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50_kmax")] = DT50_kmax</pre> + </td> + </tr> + <tr class="never"> + <td class="num">249</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">250</td> + <td class="coverage">73858<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep$distimes[obs_var, c("DT50", "DT90")] = c(DT50, DT90)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">251</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">252</td> + <td class="coverage">38846<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ep$ff) == 0) ep$ff <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">253</td> + <td class="coverage">53592<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ep$SFORB) == 0) ep$SFORB <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">254</td> + <td class="coverage">56208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ep)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">255</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinmod.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function to set up a kinetic model with one or more state variables</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function is usually called using a call to [mkinsub()] for each observed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variable, specifying the corresponding submodel as well as outgoing pathways</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' (see examples).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' For the definition of model types and their parameters, the equations given</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in the FOCUS and NAFTA guidance documents are used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' For kinetic models with more than one observed variable, a symbolic solution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the system of differential equations is included in the resulting</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinmod object in some cases, speeding up the solution.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If a C compiler is found by [pkgbuild::has_compiler()] and there</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is more than one observed variable in the specification, C code is generated</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for evaluating the differential equations, compiled using</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [inline::cfunction()] and added to the resulting mkinmod object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ... For each observed variable, a list as obtained by [mkinsub()]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' has to be specified as an argument (see examples). Currently, single</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' first order kinetics "SFO", indeterminate order rate equation kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "IORE", or single first order with reversible binding "SFORB" are</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' implemented for all variables, while "FOMC", "DFOP", "HS" and "logistic"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' can additionally be chosen for the first variable which is assumed to be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the source compartment.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Additionally, [mkinsub()] has an argument \code{to}, specifying names of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variables to which a transfer is to be assumed in the model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If the argument \code{use_of_ff} is set to "min"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and the model for the compartment is "SFO" or "SFORB", an</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' additional [mkinsub()] argument can be \code{sink = FALSE}, effectively</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fixing the flux to sink to zero.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' In print.mkinmod, this argument is currently not used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param use_of_ff Specification of the use of formation fractions in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model equations and, if applicable, the coefficient matrix. If "max",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' formation fractions are always used (default). If "min", a minimum use of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' formation fractions is made, i.e. each first-order pathway to a metabolite</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' has its own rate constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param speclist The specification of the observed variables and their</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' submodel types and pathways can be given as a single list using this</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' argument. Default is NULL.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param quiet Should messages be suppressed?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param verbose If \code{TRUE}, passed to [inline::cfunction()] if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' applicable to give detailed information about the C function being built.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param name A name for the model. Should be a valid R object name.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param dll_dir Directory where an DLL object, if generated internally by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [inline::cfunction()], should be saved. The DLL will only be stored in a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' permanent location for use in future sessions, if 'dll_dir' and 'name'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' are specified. This is helpful if fit objects are cached e.g. by knitr,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' as the cache remains functional across sessions if the DLL is stored in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a user defined location.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param unload If a DLL from the target location in 'dll_dir' is already</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' loaded, should that be unloaded first?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param overwrite If a file exists at the target DLL location in 'dll_dir',</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' should this be overwritten?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom methods signature</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A list of class \code{mkinmod} for use with [mkinfit()],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' containing, among others,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{diffs}{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A vector of string representations of differential equations, one for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' each modelling variable.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{map}{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A list containing named character vectors for each observed variable,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' specifying the modelling variables by which it is represented.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{use_of_ff}{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The content of \code{use_of_ff} is passed on in this list component.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{deg_func}{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If generated, a function containing the solution of the degradation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{coefmat}{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The coefficient matrix, if the system of differential equations can be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' represented by one.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{cf}{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If generated, a compiled function calculating the derivatives as</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' returned by cfunction.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note The IORE submodel is not well tested for metabolites. When using this</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model for metabolites, you may want to read the note in the help</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' page to [mkinfit].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references FOCUS (2006) \dQuote{Guidance Document on Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' NAFTA Technical Working Group on Pesticides (not dated) Guidance for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Evaluating and Calculating Degradation Kinetics in Environmental Media</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Specify the SFO model (this is not needed any more, as we can now mkinfit("SFO", ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO <- mkinmod(parent = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # One parent compound, one metabolite, both single first order</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("SFO", "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(SFO_SFO)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_sfo_sfo <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE, solution_type = "deSolve")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Now supplying compound names used for plotting, and write to user defined location</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We need to choose a path outside the session tempdir because this gets removed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' DLL_dir <- "~/.local/share/mkin"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if (!dir.exists(DLL_dir)) dir.create(DLL_dir)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO.2 <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("SFO", "m1", full_name = "Test compound"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO", full_name = "Metabolite M1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' name = "SFO_SFO", dll_dir = DLL_dir, unload = TRUE, overwrite = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Now we can save the model and restore it in a new session</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' saveRDS(SFO_SFO.2, file = "~/SFO_SFO.rds")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Terminate the R session here if you would like to check, and then do</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(mkin)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO.3 <- readRDS("~/SFO_SFO.rds")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_sfo_sfo <- mkinfit(SFO_SFO.3, FOCUS_2006_D, quiet = TRUE, solution_type = "deSolve")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Show details of creating the C function</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("SFO", "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"), verbose = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The symbolic solution which is available in this case is not</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # made for human reading but for speed of computation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO$deg_func</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # If we have several parallel metabolites</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # (compare tests/testthat/test_synthetic_data_for_UBA_2014.R)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_synth_DFOP_par <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("DFOP", c("M1", "M2")),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M1 = mkinsub("SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M2 = mkinsub("SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_DFOP_par_c <- mkinfit(m_synth_DFOP_par,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' synthetic_data_for_UBA_2014[[12]]$data,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">142</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">144</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export mkinmod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinmod <- function(..., use_of_ff = "max", name = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> speclist = NULL, quiet = FALSE, verbose = FALSE, dll_dir = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> unload = FALSE, overwrite = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">4940<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(speclist)) spec <- list(...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">3905<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else spec <- speclist</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">8845<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars <- names(spec)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">153</td> + <td class="coverage">8845<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> save_msg <- "You need to specify both 'name' and 'dll_dir' to save a model DLL"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">154</td> + <td class="coverage">8845<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(dll_dir)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">155</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!dir.exists(dll_dir)) stop(dll_dir, " does not exist")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">156</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(name)) stop(save_msg)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check if any of the names of the observed variables contains any other</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">8845<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs_var in obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(grep(obs_var, obs_vars)) > 1) stop("Sorry, variable names can not contain each other")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (grepl("_to_", obs_var)) stop("Sorry, names of observed variables can not contain _to_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (obs_var == "sink") stop("Naming a compound 'sink' is not supported")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">8533<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!use_of_ff %in% c("min", "max"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("The use of formation fractions 'use_of_ff' can only be 'min' or 'max'")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">8429<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- vector()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # }}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">171</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">172</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Do not return a coefficient matrix mat when FOMC, IORE, DFOP, HS or logistic is used for the parent {{{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">8429<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[1]]$type %in% c("FOMC", "IORE", "DFOP", "HS", "logistic")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">2280<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mat = FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">6149<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> } else mat = TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">177</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">178</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Establish a list of differential equations as well as a map from observed {{{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # compartments to differential equations</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">180</td> + <td class="coverage">8429<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs <- vector()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">8429<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> map <- list()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">8429<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (varname in obs_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">183</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">184</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check the type component of the compartment specification {{{</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">185</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if(is.null(spec[[varname]]$type)) stop(</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">186</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> "Every part of the model specification must be a list containing a type component")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(!spec[[varname]]$type %in% c("SFO", "FOMC", "IORE", "DFOP", "HS", "SFORB", "logistic")) stop(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "Available types are SFO, FOMC, IORE, DFOP, HS, SFORB and logistic only")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">189</td> + <td class="coverage">13150<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type %in% c("FOMC", "DFOP", "HS", "logistic") & match(varname, obs_vars) != 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">190</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop(paste("Types FOMC, DFOP, HS and logistic are only implemented for the first compartment,",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">191</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "which is assumed to be the source compartment"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">192</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # New (sub)compartments (boxes) needed for the model type {{{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> new_boxes <- switch(spec[[varname]]$type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> SFO = varname,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">197</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> FOMC = varname,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> IORE = varname,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DFOP = varname,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> HS = varname,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">201</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> logistic = varname,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">202</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> SFORB = paste(varname, c("free", "bound"), sep = "_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> map[[varname]] <- new_boxes</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(map[[varname]]) <- rep(spec[[varname]]$type, length(new_boxes)) #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">206</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Start a new differential equation for each new box {{{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">207</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> new_diffs <- paste("d_", new_boxes, " =", sep = "")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(new_diffs) <- new_boxes</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">13046<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs <- c(diffs, new_diffs) #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">210</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">211</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">212</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Create content of differential equations and build parameter list {{{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">213</td> + <td class="coverage">8221<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (varname in obs_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">214</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get the name of the box(es) we are working on for the decline term(s)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">216</td> + <td class="coverage">12838<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> box_1 = map[[varname]][[1]] # This is the only box unless type is SFORB</pre> + </td> + </tr> + <tr class="never"> + <td class="num">217</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Turn on sink if this is not explicitly excluded by the user by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">218</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # specifying sink=FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">219</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(is.null(spec[[varname]]$sink)) spec[[varname]]$sink <- TRUE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">220</td> + <td class="coverage">12838<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type %in% c("SFO", "IORE", "SFORB")) { # {{{ Add decline term</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">221</td> + <td class="coverage">10838<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (use_of_ff == "min") { # Minimum use of formation fractions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">1304<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "IORE" && length(spec[[varname]]$to) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Transformation reactions from compounds modelled with IORE\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">224</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "are only supported with formation fractions (use_of_ff = 'max')")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">225</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">226</td> + <td class="coverage">1200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$sink) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # If sink is requested, add first-order/IORE sink term</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">952<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_compound_sink <- paste("k", box_1, "sink", sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">229</td> + <td class="coverage">952<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "IORE") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">230</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> k_compound_sink <- paste("k__iore", box_1, "sink", sep = "_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">231</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">232</td> + <td class="coverage">952<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, k_compound_sink)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">233</td> + <td class="coverage">952<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term <- paste(k_compound_sink, "*", box_1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">234</td> + <td class="coverage">952<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "IORE") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">235</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> N <- paste("N", box_1, sep = "_")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">236</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, N)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">237</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term <- paste0(decline_term, "^", N)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">239</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else { # otherwise no decline term needed here</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">240</td> + <td class="coverage">248<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term = "0"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">241</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">242</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else { # Maximum use of formation fractions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">9534<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_compound <- paste("k", box_1, sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">244</td> + <td class="coverage">9534<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "IORE") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">245</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_compound <- paste("k__iore", box_1, sep = "_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">246</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">247</td> + <td class="coverage">9534<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, k_compound)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">248</td> + <td class="coverage">9534<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term <- paste(k_compound, "*", box_1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">249</td> + <td class="coverage">9534<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "IORE") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">250</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> N <- paste("N", box_1, sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">251</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, N)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">252</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term <- paste0(decline_term, "^", N)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">253</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">254</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">255</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">256</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "FOMC") { # {{{ Add FOMC decline term</pre> + </td> + </tr> + <tr class="never"> + <td class="num">257</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # From p. 53 of the FOCUS kinetics report, without the power function so it works in C</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">258</td> + <td class="coverage">381<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term <- paste("(alpha/beta) * 1/((time/beta) + 1) *", box_1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">259</td> + <td class="coverage">381<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, "alpha", "beta")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">260</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">261</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "DFOP") { # {{{ Add DFOP decline term</pre> + </td> + </tr> + <tr class="never"> + <td class="num">262</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # From p. 57 of the FOCUS kinetics report</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">263</td> + <td class="coverage">1283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term <- paste("((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) *", box_1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">1283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, "k1", "k2", "g")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">265</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">266</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> HS_decline <- "ifelse(time <= tb, k1, k2)" # Used below for automatic translation to C</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">267</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "HS") { # {{{ Add HS decline term</pre> + </td> + </tr> + <tr class="never"> + <td class="num">268</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # From p. 55 of the FOCUS kinetics report</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">269</td> + <td class="coverage">30<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term <- paste(HS_decline, "*", box_1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">270</td> + <td class="coverage">30<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, "k1", "k2", "tb")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">271</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">272</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "logistic") { # {{{ Add logistic decline term</pre> + </td> + </tr> + <tr class="never"> + <td class="num">273</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # From p. 67 of the FOCUS kinetics report (2014)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">274</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term <- paste("(k0 * kmax)/(k0 + (kmax - k0) * exp(-r * time)) *", box_1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">275</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, "kmax", "k0", "r")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">276</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">277</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Add origin decline term to box 1 (usually the only box, unless type is SFORB)#{{{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">278</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs[[box_1]] <- paste(diffs[[box_1]], "-", decline_term)#}}}</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">279</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(spec[[varname]]$type == "SFORB") { # {{{ Add SFORB reversible binding terms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">280</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> box_2 = map[[varname]][[2]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">281</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_free_bound <- paste("k", varname, "free", "bound", sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">282</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_bound_free <- paste("k", varname, "bound", "free", sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">283</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, k_free_bound, k_bound_free)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">284</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> reversible_binding_term_1 <- paste("-", k_free_bound, "*", box_1, "+",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">285</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_bound_free, "*", box_2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">286</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> reversible_binding_term_2 <- paste("+", k_free_bound, "*", box_1, "-",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">287</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_bound_free, "*", box_2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">288</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs[[box_1]] <- paste(diffs[[box_1]], reversible_binding_term_1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">289</td> + <td class="coverage">25<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs[[box_2]] <- paste(diffs[[box_2]], reversible_binding_term_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">290</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">291</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">292</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transfer between compartments#{{{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">293</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> to <- spec[[varname]]$to</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">294</td> + <td class="coverage">12734<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(!is.null(to)) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">295</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Name of box from which transfer takes place</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">296</td> + <td class="coverage">4174<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> origin_box <- box_1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">297</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">298</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Number of targets</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">299</td> + <td class="coverage">4174<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_targets = length(to)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">300</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">301</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Add transfer terms to listed compartments</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">302</td> + <td class="coverage">4174<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (target in to) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">303</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!target %in% obs_vars) stop("You did not specify a submodel for target variable ", target)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">304</td> + <td class="coverage">4813<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> target_box <- switch(spec[[target]]$type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">305</td> + <td class="coverage">4813<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> SFO = target,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">306</td> + <td class="coverage">4813<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> IORE = target,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">307</td> + <td class="coverage">4813<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> SFORB = paste(target, "free", sep = "_"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">308</td> + <td class="coverage">4813<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (use_of_ff == "min" && spec[[varname]]$type %in% c("SFO", "SFORB"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">309</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">310</td> + <td class="coverage">601<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_from_to <- paste("k", origin_box, target_box, sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">311</td> + <td class="coverage">601<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, k_from_to)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">312</td> + <td class="coverage">601<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs[[origin_box]] <- paste(diffs[[origin_box]], "-",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">313</td> + <td class="coverage">601<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_from_to, "*", origin_box)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">314</td> + <td class="coverage">601<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs[[target_box]] <- paste(diffs[[target_box]], "+",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">315</td> + <td class="coverage">601<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_from_to, "*", origin_box)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">316</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">317</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Do not introduce a formation fraction if this is the only target</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">318</td> + <td class="coverage">4212<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (spec[[varname]]$sink == FALSE && n_targets == 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">319</td> + <td class="coverage">689<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs[[target_box]] <- paste(diffs[[target_box]], "+",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">320</td> + <td class="coverage">689<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> decline_term)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">321</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">322</td> + <td class="coverage">3523<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fraction_to_target = paste("f", origin_box, "to", target, sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">323</td> + <td class="coverage">3523<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(parms, fraction_to_target)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">324</td> + <td class="coverage">3523<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs[[target_box]] <- paste(diffs[[target_box]], "+",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">325</td> + <td class="coverage">3523<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fraction_to_target, "*", decline_term)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">326</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">327</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">328</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">329</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">330</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } #}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">331</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">332</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model <- list(diffs = diffs, parms = parms, map = map, spec = spec, use_of_ff = use_of_ff, name = name)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">333</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">334</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Create coefficient matrix if possible #{{{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">335</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (mat) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">336</td> + <td class="coverage">5941<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> boxes <- names(diffs)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">337</td> + <td class="coverage">5941<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n <- length(boxes)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">338</td> + <td class="coverage">5941<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m <- matrix(nrow=n, ncol=n, dimnames=list(boxes, boxes))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">339</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">340</td> + <td class="coverage">5941<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (use_of_ff == "min") { # {{{ Minimum use of formation fractions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">341</td> + <td class="coverage">600<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (from in boxes) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">342</td> + <td class="coverage">1201<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (to in boxes) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">343</td> + <td class="coverage">2405<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (from == to) { # diagonal elements</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">344</td> + <td class="coverage">1201<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = paste("k", from, c(boxes, "sink"), sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">345</td> + <td class="coverage">1201<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = sub("free.*bound", "free_bound", k.candidate)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">346</td> + <td class="coverage">1201<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = sub("bound.*free", "bound_free", k.candidate)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">347</td> + <td class="coverage">1201<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.effective = intersect(model$parms, k.candidate)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">348</td> + <td class="coverage">1201<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m[from,to] = ifelse(length(k.effective) > 0,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">349</td> + <td class="coverage">1201<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste("-", k.effective, collapse = " "), "0")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">350</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">351</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else { # off-diagonal elements</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">352</td> + <td class="coverage">1204<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = paste("k", from, to, sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">353</td> + <td class="coverage">1204<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (sub("_free$", "", from) == sub("_bound$", "", to)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">354</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = paste("k", sub("_free$", "_free_bound", from), sep = "_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">355</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">356</td> + <td class="coverage">1204<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (sub("_bound$", "", from) == sub("_free$", "", to)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">357</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = paste("k", sub("_bound$", "_bound_free", from), sep = "_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">358</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">359</td> + <td class="coverage">1204<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.effective = intersect(model$parms, k.candidate)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">360</td> + <td class="coverage">1204<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m[to, from] = ifelse(length(k.effective) > 0,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">361</td> + <td class="coverage">1204<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.effective, "0")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">362</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">363</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">364</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } # }}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">365</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else { # {{{ Use formation fractions where possible</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">366</td> + <td class="coverage">5341<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (from in boxes) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">367</td> + <td class="coverage">8074<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (to in boxes) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">368</td> + <td class="coverage">15220<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (from == to) { # diagonal elements</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">369</td> + <td class="coverage">8074<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = paste("k", from, sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">370</td> + <td class="coverage">8074<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m[from,to] = ifelse(k.candidate %in% model$parms,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">371</td> + <td class="coverage">8074<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste("-", k.candidate), "0")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">372</td> + <td class="coverage">8074<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(grepl("_free", from)) { # add transfer to bound compartment for SFORB</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">373</td> + <td class="coverage">24<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m[from,to] = paste(m[from,to], "-", paste("k", from, "bound", sep = "_"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">374</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">375</td> + <td class="coverage">8074<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(grepl("_bound", from)) { # add backtransfer to free compartment for SFORB</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">376</td> + <td class="coverage">24<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m[from,to] = paste("- k", from, "free", sep = "_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">377</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">378</td> + <td class="coverage">8074<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m[from,to] = m[from,to]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">379</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else { # off-diagonal elements</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">380</td> + <td class="coverage">7146<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f.candidate = paste("f", from, "to", to, sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">381</td> + <td class="coverage">7146<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = paste("k", from, to, sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">382</td> + <td class="coverage">7146<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = sub("free.*bound", "free_bound", k.candidate)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">383</td> + <td class="coverage">7146<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k.candidate = sub("bound.*free", "bound_free", k.candidate)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">384</td> + <td class="coverage">7146<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m[to, from] = ifelse(f.candidate %in% model$parms,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">385</td> + <td class="coverage">7146<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste(f.candidate, " * k_", from, sep = ""),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">386</td> + <td class="coverage">7146<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(k.candidate %in% model$parms, k.candidate, "0"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">387</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Special case: singular pathway and no sink</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">388</td> + <td class="coverage">7146<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (spec[[from]]$sink == FALSE && length(spec[[from]]$to) == 1 && to %in% spec[[from]]$to) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">389</td> + <td class="coverage">689<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> m[to, from] = paste("k", from, sep = "_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">390</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">391</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">392</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">393</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">394</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } # }}}</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">395</td> + <td class="coverage">5941<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model$coefmat <- m</pre> + </td> + </tr> + <tr class="never"> + <td class="num">396</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }#}}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">397</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">398</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Try to create a function compiled from C code if there is more than one observed variable {{{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">399</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # and a compiler is available</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">400</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(obs_vars) > 1 & pkgbuild::has_compiler()) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">401</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">402</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Translate the R code for the derivatives to C code</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">403</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C <- paste(diffs, collapse = ";\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">404</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C <- paste0(diffs.C, ";")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">405</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">406</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # HS</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">407</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C <- gsub(HS_decline, "(time <= tb ? k1 : k2)", diffs.C, fixed = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">408</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">409</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in seq_along(diffs)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">410</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state_var <- names(diffs)[i]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">411</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">412</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # IORE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">413</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (state_var %in% obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">414</td> + <td class="coverage">8343<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (spec[[state_var]]$type == "IORE") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">415</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C <- gsub(paste0(state_var, "^N_", state_var),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">416</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> paste0("pow(y[", i - 1, "], N_", state_var, ")"),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">417</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C, fixed = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">418</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">419</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">420</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">421</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Replace d_... terms by f[i-1]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">422</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # First line</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">423</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pattern <- paste0("^d_", state_var)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">424</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> replacement <- paste0("\nf[", i - 1, "]")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">425</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C <- gsub(pattern, replacement, diffs.C)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">426</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Other lines</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">427</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pattern <- paste0("\\nd_", state_var)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">428</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> replacement <- paste0("\nf[", i - 1, "]")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">429</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C <- gsub(pattern, replacement, diffs.C)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">430</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">431</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Replace names of observed variables by y[i],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">432</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # making the implicit assumption that the observed variables only occur after "* "</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">433</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pattern <- paste0("\\* ", state_var)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">434</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> replacement <- paste0("* y[", i - 1, "]")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">435</td> + <td class="coverage">8347<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C <- gsub(pattern, replacement, diffs.C)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">436</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">437</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">438</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> derivs_sig <- signature(n = "integer", t = "numeric", y = "numeric",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">439</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f = "numeric", rpar = "numeric", ipar = "integer")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">440</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">441</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Declare the time variable in the body of the function if it is used</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">442</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> derivs_code <- if (spec[[1]]$type %in% c("FOMC", "DFOP", "HS")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">443</td> + <td class="coverage">1060<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste0("double time = *t;\n", diffs.C)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">444</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">445</td> + <td class="coverage">2668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs.C</pre> + </td> + </tr> + <tr class="never"> + <td class="num">446</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">447</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">448</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define the function initializing the parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">449</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> npar <- length(parms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">450</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> initpar_code <- paste0(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">451</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "static double parms [", npar, "];\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">452</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste0("#define ", parms, " parms[", 0:(npar - 1), "]\n", collapse = ""),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">453</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">454</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "void initpar(void (* odeparms)(int *, double *)) {\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">455</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> " int N = ", npar, ";\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">456</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> " odeparms(&N, parms);\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">457</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "}\n\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">458</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">459</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Try to build a shared library</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">460</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model$cf <- try(inline::cfunction(derivs_sig, derivs_code,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">461</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> otherdefs = initpar_code,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">462</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> verbose = verbose, name = "diffs",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">463</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> convention = ".C", language = "C"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">464</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> silent = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">465</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">466</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!inherits(model$cf, "try-error")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">467</td> + <td class="coverage">495<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Temporary DLL for differentials generated and loaded")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">468</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(dll_dir)) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">469</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We suppress warnings, as we get a warning about a path "(embedding)" </pre> + </td> + </tr> + <tr class="never"> + <td class="num">470</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # under Windows, at least when using RStudio</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">471</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> suppressWarnings(inline::moveDLL(model$cf, name, dll_dir,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">472</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> unload = unload, overwrite = overwrite, verbose = !quiet))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">473</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">474</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model$dll_info <- inline::getDynLib(model$cf)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">475</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">476</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">477</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # }}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">478</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">479</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Attach a degradation function if an analytical solution is available</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">480</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model$deg_func <- create_deg_func(spec, use_of_ff)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">481</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">482</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(model) <- "mkinmod"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">483</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(model)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">484</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">485</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">486</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Print mkinmod objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">487</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">488</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Print mkinmod objects in a way that the user finds his way to get to its</pre> + </td> + </tr> + <tr class="never"> + <td class="num">489</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' components.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">490</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">491</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mkinmod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">492</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An \code{\link{mkinmod}} object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">493</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">494</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.mkinmod <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">495</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("<mkinmod> model generated with\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">496</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Use of formation fractions $use_of_ff:", x$use_of_ff, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">497</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Specification $spec:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">498</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs in names(x$spec)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">499</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("$", obs, "\n", sep = "")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">500</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spl <- x$spec[[obs]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">501</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("$type:", spl$type)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">502</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(spl$to) && length(spl$to)) cat("; $to: ", paste(spl$to, collapse = ", "), sep = "")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">503</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("; $sink: ", spl$sink, sep = "")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">504</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(spl$full_name)) if (!is.na(spl$full_name)) cat("; $full_name:", spl$full_name)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">505</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">506</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">507</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.matrix(x$coefmat)) cat("Coefficient matrix $coefmat available\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">508</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$cf)) cat("Compiled model $cf available\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">509</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Differential equations:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">510</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nice_diffs <- gsub("^(d.*) =", "\\1/dt =", x[["diffs"]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">511</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> writeLines(strwrap(nice_diffs, exdent = 11))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">512</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">513</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># vim: set foldmethod=marker ts=2 sw=2 expandtab:</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mhmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Fit nonlinear mixed-effects models built from one or more kinetic</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' degradation models and one or more error models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The name of the methods expresses that (**m**ultiple) **h**ierarchichal</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' (also known as multilevel) **m**ulticompartment **kin**etic models are</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fitted. Our kinetic models are nonlinear, so we can use various nonlinear</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mixed-effects model fitting functions.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param objects A list of [mmkin] objects containing fits of the same</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' degradation models to the same data, but using different error models.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Alternatively, a single [mmkin] object containing fits of several</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' degradation models to the same data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param backend The backend to be used for fitting. Currently, only saemix is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' supported</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param no_random_effect Default is NULL and will be passed to [saem]. If a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' character vector is supplied, it will be passed to all calls to [saem],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' which will exclude random effects for all matching parameters. Alternatively,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a list of character vectors or an object of class [illparms.mhmkin] can be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' specified. They have to have the same dimensions that the return object of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the current call will have, i.e. the number of rows must match the number</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of degradation models in the mmkin object(s), and the number of columns must</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' match the number of error models used in the mmkin object(s).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param algorithm The algorithm to be used for fitting (currently not used)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further arguments that will be passed to the nonlinear mixed-effects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model fitting function.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cores The number of cores to be used for multicore processing. This</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is only used when the \code{cluster} argument is \code{NULL}. On Windows</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' machines, cores > 1 is not supported, you need to use the \code{cluster}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' argument to use multiple logical processors. Per default, all cores detected</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' by [parallel::detectCores()] are used, except on Windows where the default</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is 1.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cluster A cluster as returned by [makeCluster] to be used for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parallel execution.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom parallel mclapply parLapply detectCores</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A two-dimensional [array] of fit objects and/or try-errors that can</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be indexed using the degradation model names for the first index (row index)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and the error model names for the second index (column index), with class</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' attribute 'mhmkin'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso \code{\link{[.mhmkin}} for subsetting [mhmkin] objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mhmkin <- function(objects, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("mhmkin")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mhmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mhmkin.mmkin <- function(objects, ...) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">49</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> mhmkin(list(objects), ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mhmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We start with separate evaluations of all the first six datasets with two</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # degradation models and two error models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_sep_const <- mmkin(c("SFO", "FOMC"), ds_fomc[1:6], cores = 2, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_sep_tc <- update(f_sep_const, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The mhmkin function sets up hierarchical degradation models aka</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # nonlinear mixed-effects models for all four combinations, specifying</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # uncorrelated random effects for all degradation parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_1 <- mhmkin(list(f_sep_const, f_sep_tc), cores = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' status(f_saem_1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The 'illparms' function shows that in all hierarchical fits, at least</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # one random effect is ill-defined (the confidence interval for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # random effect expressed as standard deviation includes zero)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(f_saem_1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Therefore we repeat the fits, excluding the ill-defined random effects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_2 <- update(f_saem_1, no_random_effect = illparms(f_saem_1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' status(f_saem_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(f_saem_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Model comparisons show that FOMC with two-component error is preferable,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # and confirms our reduction of the default parameter model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The convergence plot for the selected model looks fine</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' saemix::plot(f_saem_2[["FOMC", "tc"]]$so, plot.type = "convergence")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The plot of predictions versus data shows that we have a pretty data-rich</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # situation with homogeneous distribution of residuals, because we used the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # same degradation model, error model and parameter distribution model that</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # was used in the data generation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_saem_2[["FOMC", "tc"]])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We can specify the same parameter model reductions manually</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' no_ranef <- list("parent_0", "log_beta", "parent_0", c("parent_0", "log_beta"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dim(no_ranef) <- c(2, 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_2m <- update(f_saem_1, no_random_effect = no_ranef)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_2m)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mhmkin.list <- function(objects, backend = "saemix", algorithm = "saem",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> no_random_effect = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> cores = if (Sys.info()["sysname"] == "Windows") 1 else parallel::detectCores(), cluster = NULL)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- match.call()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dot_args <- list(...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> backend_function <- switch(backend,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saemix = "saem"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> deg_models <- lapply(objects[[1]][, 1], function(x) x$mkinmod)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(deg_models) <- dimnames(objects[[1]])$model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.deg <- length(deg_models)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds <- lapply(objects[[1]][1, ], function(x) x$data)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (other in objects[-1]) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check if the degradation models in all objects are the same</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (deg_model_name in names(deg_models)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">750<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!all.equal(other[[deg_model_name, 1]]$mkinmod$spec,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">750<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> deg_models[[deg_model_name]]$spec))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">113</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("The mmkin objects have to be based on the same degradation models")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check if they have been fitted to the same dataset</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> other_object_ds <- lapply(other[1, ], function(x) x$data)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 1:length(ds)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">2250<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!all.equal(ds[[i]][c("time", "variable", "observed")],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">2250<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> other_object_ds[[i]][c("time", "variable", "observed")]))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">122</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("The mmkin objects have to be fitted to the same datasets")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.o <- length(objects)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error_models = sapply(objects, function(x) x[[1]]$err_mod)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.e <- length(error_models)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.fits <- n.deg * n.e</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_indices <- matrix(1:n.fits, ncol = n.e)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(fit_indices) <- list(degradation = names(deg_models),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error = error_models)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(no_random_effect) || is.null(dim(no_random_effect))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> no_ranef <- rep(list(no_random_effect), n.fits)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(no_ranef) <- dim(fit_indices)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!identical(dim(no_random_effect), dim(fit_indices))) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">142</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Dimensions of argument 'no_random_effect' are not suitable")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is(no_random_effect, "illparms.mhmkin")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> no_ranef_dim <- dim(no_random_effect)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> no_ranef <- lapply(no_random_effect, function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> no_ranef_split <- strsplit(x, ", ")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ret <- sapply(no_ranef_split, function(y) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> gsub("sd\\((.*)\\)", "\\1", y)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ret)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">153</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(no_ranef) <- no_ranef_dim</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">155</td> + <td class="coverage">121<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> no_ranef <- no_random_effect</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_function <- function(fit_index) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> w <- which(fit_indices == fit_index, arr.ind = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> deg_index <- w[1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error_index <- w[2]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mmkin_row <- objects[[error_index]][deg_index, ]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">164</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- try(do.call(backend_function,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">165</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> args = c(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> list(mmkin_row),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dot_args,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> list(no_random_effect = no_ranef[[deg_index, error_index]]))))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">12<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">171</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">172</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_time <- system.time({</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(cluster)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> results <- parallel::mclapply(as.list(1:n.fits), fit_function,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">176</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mc.cores = cores, mc.preschedule = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">177</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">178</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> results <- parallel::parLapply(cluster, as.list(1:n.fits), fit_function)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">181</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">363<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attributes(results) <- attributes(fit_indices)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">363<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(results, "call") <- call</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">363<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(results, "time") <- fit_time</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">185</td> + <td class="coverage">363<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(results) <- switch(backend,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">186</td> + <td class="coverage">363<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saemix = c("mhmkin.saem.mmkin", "mhmkin")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">187</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">363<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(results)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Subsetting method for mhmkin objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">192</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An [mhmkin] object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param i Row index selecting the fits for specific models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">195</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param j Column index selecting the fits to specific datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">196</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param drop If FALSE, the method always returns an mhmkin object, otherwise</pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' either a list of fit objects or a single fit object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">198</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An object inheriting from \code{\link{mhmkin}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">199</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mhmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">200</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">`[.mhmkin` <- function(x, i, j, ..., drop = FALSE) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">202</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> original_class <- class(x)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">203</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> class(x) <- NULL</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">204</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> x_sub <- x[i, j, drop = drop]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">205</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">206</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!drop) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">207</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> class(x_sub) <- original_class</pre> + </td> + </tr> + <tr class="never"> + <td class="num">208</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">209</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return(x_sub)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">210</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">211</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">212</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Print method for mhmkin objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">214</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mhmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">216</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.mhmkin <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("<mhmkin> object\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">218</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Status of individual fits:\n\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">219</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(status(x))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">222</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Check if fit within an mhmkin object failed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">223</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x The object to be checked</pre> + </td> + </tr> + <tr class="never"> + <td class="num">224</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">check_failed <- function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">225</td> + <td class="coverage">1936<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(x, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">226</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return(TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">1936<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(x$so, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">229</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return(TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">230</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">231</td> + <td class="coverage">1936<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">233</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">234</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">235</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">236</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">237</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">AIC.mhmkin <- function(object, ..., k = 2) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">238</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- sapply(object, function(x) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">239</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (check_failed(x)) return(NA)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">240</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else return(AIC(x$so, k = k))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">241</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">242</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(res) <- dim(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(res) <- dimnames(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">244</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">245</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">246</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">247</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">248</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">BIC.mhmkin <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">249</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- sapply(object, function(x) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">250</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (check_failed(x)) return(NA)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">251</td> + <td class="coverage">500<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else return(BIC(x$so))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">252</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">253</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(res) <- dim(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">254</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(res) <- dimnames(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">255</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">256</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">257</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">258</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">259</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">update.mhmkin <- function(object, ..., evaluate = TRUE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">260</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- attr(object, "call")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">261</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # For some reason we get mhkin.list in call[[1]] when using mhmkin from the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">262</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # loaded package so we need to fix this so we do not have to export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">263</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # mhmkin.list in addition to the S3 method mhmkin</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call[[1]] <- mhmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">265</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">266</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments <- match.call(expand.dots = FALSE)$...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">267</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">268</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(update_arguments) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">269</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_in_call <- !is.na(match(names(update_arguments), names(call)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">270</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">271</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">272</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (a in names(update_arguments)[update_arguments_in_call]) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">273</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> call[[a]] <- update_arguments[[a]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">274</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">275</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">276</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_not_in_call <- !update_arguments_in_call</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">277</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(any(update_arguments_not_in_call)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">278</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- c(as.list(call), update_arguments[update_arguments_not_in_call])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">279</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- as.call(call)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">280</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">281</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(evaluate) eval(call, parent.frame())</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">282</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> else call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">283</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">284</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">285</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">286</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">anova.mhmkin <- function(object, ...,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">287</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> method = c("is", "lin", "gq"), test = FALSE, model.names = "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">288</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(model.names, "auto")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">289</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model.names <- outer(rownames(object), colnames(object), paste)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">290</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">291</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> failed_index <- which(sapply(object, check_failed), arr.ind = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">292</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(failed_index > 0)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">293</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> rlang::inject(anova(!!!(object[-failed_index]), method = method, test = test,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">294</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> model.names = model.names[-failed_index]))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">295</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">296</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rlang::inject(anova(!!!(object), method = method, test = test,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">297</td> + <td class="coverage">234<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model.names = model.names))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">298</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">299</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">300</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/nafta.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Evaluate parent kinetics using the NAFTA guidance</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The function fits the SFO, IORE and DFOP models using \code{\link{mmkin}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and returns an object of class \code{nafta} that has methods for printing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and plotting.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ds A dataframe that must contain one variable called "time" with the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' time values specified by the \code{time} argument, one column called</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "name" with the grouping of the observed values, and finally one column of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed values called "value".</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param title Optional title of the dataset</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param quiet Should the evaluation text be shown?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further arguments passed to \code{\link{mmkin}} (not for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' printing method).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats qf</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An list of class \code{nafta}. The list element named "mmkin" is the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{mmkin}} object containing the fits of the three models. The</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list element named "title" contains the title of the dataset used. The</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list element "data" contains the dataset used in the fits.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @source NAFTA (2011) Guidance for evaluating and calculating degradation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' kinetics in environmental media. NAFTA Technical Working Group on</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Pesticides</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/guidance-evaluating-and-calculating-degradation}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' accessed 2019-02-22</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' US EPA (2015) Standard Operating Procedure for Using the NAFTA Guidance to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Calculate Representative Half-life Values and Characterizing Pesticide</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Degradation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/standard-operating-procedure-using-nafta-guidance}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' nafta_evaluation <- nafta(NAFTA_SOP_Appendix_D, cores = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(nafta_evaluation)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(nafta_evaluation)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">nafta <- function(ds, title = NA, quiet = FALSE, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">264<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(levels(ds$name)) > 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("The NAFTA procedure is only defined for decline data for a single compound")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n <- nrow(subset(ds, !is.na(value)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> models <- c("SFO", "IORE", "DFOP")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- list(title = title, data = ds)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$mmkin <- mmkin(models, list(ds), quiet = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> distimes <- lapply(result$mmkin, function(x) as.numeric(endpoints(x)$distimes["parent", ]))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$distimes <- matrix(NA, nrow = 3, ncol = 3,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list(models, c("DT50", "DT90", "DT50_rep")))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$distimes["SFO", ] <- distimes[[1]][c(1, 2, 1)]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$distimes["IORE", ] <- distimes[[2]][c(1, 2, 3)]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$distimes["DFOP", ] <- distimes[[3]][c(1, 2, 5)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get parameters with statistics</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$parameters <- lapply(result$mmkin, function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">528<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> summary(x)$bpar[, c(1, 4:6)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(result$parameters) <- models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Compare the sum of squared residuals (SSR) to the upper bound of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # confidence region of the SSR for the IORE model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$S <- sapply(result$mmkin, function(x) sum(x$data$residual^2))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(result$S) <- c("SFO", "IORE", "DFOP")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Equation (3) on p. 3</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> p <- 3</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$S["IORE"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$S_c <- result$S[["IORE"]] * (1 + p/(n - p) * qf(0.5, p, n - p))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$t_rep <- .evaluate_nafta_results(result$S, result$S_c,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result$distimes, quiet = quiet)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(result) <- "nafta"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Plot the results of the three models used in the NAFTA scheme.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The plots are ordered with increasing complexity of the model in this</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' function (SFO, then IORE, then DFOP).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Calls \code{\link{plot.mmkin}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An object of class \code{\link{nafta}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param legend Should a legend be added?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param main Possibility to override the main title of the plot.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further arguments passed to \code{\link{plot.mmkin}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The function is called for its side effect.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">plot.nafta <- function(x, legend = FALSE, main = "auto", ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (main == "auto") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">94</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.na(x$title)) main = ""</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else main = x$title</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(x$mmkin, ..., legend = legend, main = main)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Print nafta objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Print nafta objects. The results for the three models are printed in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' order of increasing model complexity, i.e. SFO, then IORE, and finally DFOP.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An \code{\link{nafta}} object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits Number of digits to be used for printing parameters and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dissipation times.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname nafta</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.nafta <- function(x, quiet = TRUE, digits = 3, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Sums of squares:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$S)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nCritical sum of squares for checking the SFO model:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$S_c)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nParameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$parameters, digits = digits)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t_rep <- .evaluate_nafta_results(x$S, x$S_c, x$distimes, quiet = quiet)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nDTx values:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(signif(x$distimes, digits = digits))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nRepresentative half-life:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(round(t_rep, 2))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">.evaluate_nafta_results <- function(S, S_c, distimes, quiet = FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t_SFO <- distimes["IORE", "DT50"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">126</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t_IORE <- distimes["IORE", "DT50_rep"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t_DFOP2 <- distimes["DFOP", "DT50_rep"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (S["SFO"] < S_c) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">130</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">131</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> message("S_SFO is lower than the critical value S_c, use the SFO model")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">133</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> t_rep <- t_SFO</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> message("The SFO model is rejected as S_SFO is equal or higher than the critical value S_c")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (t_IORE < t_DFOP2) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> message("The half-life obtained from the IORE model may be used")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t_rep <- t_IORE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">145</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> message("The representative half-life of the IORE model is longer than the one corresponding")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">146</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> message("to the terminal degradation rate found with the DFOP model.")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">147</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> message("The representative half-life obtained from the DFOP model may be used")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t_rep <- t_DFOP2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">152</td> + <td class="coverage">352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(t_rep)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/summary.nlme.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Summary method for class "nlme.mmkin"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Lists model equations, initial parameter values, optimised parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for fixed effects (population), random effects (deviations from the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' population mean) and residual error model, as well as the resulting</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints such as formation fractions and DT50 values. Optionally</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' (default is FALSE), the data are listed in full.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object an object of class [nlme.mmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x an object of class [summary.nlme.mmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param data logical, indicating whether the full data should be included in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the summary.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param verbose Should the summary be verbose?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param distimes logical, indicating whether DT50 and DT90 values should be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' included.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param alpha error level for confidence interval estimation from the t</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' distribution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits Number of digits to use for printing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots optional arguments passed to methods like \code{print}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The summary function returns a list based on the [nlme] object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' obtained in the fit, with at least the following additional components</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{nlmeversion, mkinversion, Rversion}{The nlme, mkin and R versions used}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{date.fit, date.summary}{The dates where the fit and the summary were</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' produced}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{diffs}{The differential equations used in the degradation model}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{use_of_ff}{Was maximum or minimum use made of formation fractions}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{data}{The data}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{confint_trans}{Transformed parameters as used in the optimisation, with confidence intervals}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{confint_back}{Backtransformed parameters, with confidence intervals if available}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{ff}{The estimated formation fractions derived from the fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{distimes}{The DT50 and DT90 values for each observed variable.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{SFORB}{If applicable, eigenvalues of SFORB components of the model.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The print method is called for its side effect, i.e. printing the summary.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats predict</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke for the mkin specific parts</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' José Pinheiro and Douglas Bates for the components inherited from nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Generate five datasets following SFO kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dt50_sfo_in_pop <- 50</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k_in_pop <- log(2) / dt50_sfo_in_pop</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set.seed(1234)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k_in <- rlnorm(5, log(k_in_pop), 0.5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO <- mkinmod(parent = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' pred_sfo <- function(k) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = k),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_sfo_mean <- lapply(k_in, pred_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(ds_sfo_mean) <- paste("ds", 1:5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set.seed(12345)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_sfo_syn <- lapply(ds_sfo_mean, function(ds) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' add_err(ds,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sdfunc = function(value) sqrt(1^2 + value^2 * 0.07^2),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' n = 1)[[1]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Evaluate using mmkin and nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(nlme)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mmkin <- mmkin("SFO", ds_sfo_syn, quiet = TRUE, error_model = "tc", cores = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme <- nlme(f_mmkin)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(f_nlme, data = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">summary.nlme.mmkin <- function(object, data = FALSE, verbose = FALSE, distimes = TRUE, alpha = 0.05, ...) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mod_vars <- names(object$mkinmod$diffs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_trans <- intervals(object, which = "fixed", level = 1 - alpha)$fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(confint_trans, "label") <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pnames <- rownames(confint_trans)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bp <- backtransform_odeparms(confint_trans[, "est."], object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates, object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpnames <- names(bp)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # variance-covariance estimates for fixed effects (from summary.lme)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed <- fixef(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stdFixed <- sqrt(diag(as.matrix(object$varFix)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$corFixed <- array(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t(object$varFix/stdFixed)/stdFixed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(object$varFix),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> list(names(fixed), names(fixed)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transform boundaries of CI for one parameter at a time,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # with the exception of sets of formation fractions (single fractions are OK).</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names_skip <- character(0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (box in mod_vars) { # Figure out sets of fractions to skip</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">436<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names <- grep(paste("^f", box, sep = "_"), pnames, value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">436<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_paths <- length(f_names)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">100</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (n_paths > 1) f_names_skip <- c(f_names_skip, f_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back <- matrix(NA, nrow = length(bp), ncol = 3,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list(bpnames, colnames(confint_trans)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[, "est."] <- bp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (pname in pnames) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!pname %in% f_names_skip) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par.lower <- confint_trans[pname, "lower"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par.upper <- confint_trans[pname, "upper"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(par.lower) <- names(par.upper) <- pname</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpl <- backtransform_odeparms(par.lower, object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpu <- backtransform_odeparms(par.upper, object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[names(bpl), "lower"] <- bpl</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">1410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[names(bpu), "upper"] <- bpu</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$confint_trans <- confint_trans</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">124</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$confint_back <- confint_back</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">126</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$date.summary = date()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$use_of_ff = object$mkinmod$use_of_ff</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">128</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$error_model_algorithm = object$mmkin[[1]]$error_model_algorithm</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> err_mod = object$mmkin[[1]]$err_mod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$diffs <- object$mkinmod$diffs</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$print_data <- data</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$data[["observed"]] <- object$data[["value"]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$data[["value"]] <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$data[["predicted"]] <- predict(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$data[["residual"]] <- residuals(object, type = "response")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(object$modelStruct$varStruct)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">138</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object$data[["std"]] <- object$sigma</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$data[["std"]] <- 1/attr(object$modelStruct$varStruct, "weights")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$data[["standardized"]] <- residuals(object, type = "pearson")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$verbose <- verbose</pre> + </td> + </tr> + <tr class="never"> + <td class="num">144</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$fixed <- object$mmkin[[1]]$fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$AIC = AIC(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$BIC = BIC(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$logLik = logLik(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep <- endpoints(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ep$ff) != 0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">152</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$ff <- ep$ff</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">153</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (distimes) object$distimes <- ep$distimes</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">154</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ep$SFORB) != 0) object$SFORB <- ep$SFORB</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">155</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(object) <- c("summary.nlme.mmkin", "nlme.mmkin", "nlme", "lme")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">156</td> + <td class="coverage">319<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname summary.nlme.mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">160</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">161</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.summary.nlme.mmkin <- function(x, digits = max(3, getOption("digits") - 3), verbose = x$verbose, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("nlme version used for fitting: ", x$nlmeversion, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("mkin version used for pre-fitting: ", x$mkinversion, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">164</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("R version used for fitting: ", x$Rversion, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Date of fit: ", x$date.fit, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Date of summary:", x$date.summary, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEquations:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">170</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nice_diffs <- gsub("^(d.*) =", "\\1/dt =", x[["diffs"]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> writeLines(strwrap(nice_diffs, exdent = 11))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">172</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nData:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(nrow(x$data), "observations of",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$name)), "variable(s) grouped in",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">176</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$ds)), "datasets\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">177</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nModel predictions using solution type", x$solution_type, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">180</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFitted in", x$time[["elapsed"]], "s using", x$numIter, "iterations\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">181</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nVariance model: ")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(switch(x$err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> const = "Constant variance",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">185</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs = "Variance unique to each observed variable",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">186</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tc = "Two-component variance function"), "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">187</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nMean of starting values for individual parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">189</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$mean_dp_start, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">191</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFixed degradation parameter values:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(length(x$fixed$value) == 0) cat("None\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">193</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> else print(x$fixed, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nResults:\n\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(data.frame(AIC = x$AIC, BIC = x$BIC, logLik = x$logLik,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">197</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = " "), digits = digits, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">198</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nOptimised, transformed parameters with symmetric confidence intervals:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$confint_trans, digits = digits, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">202</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(x$confint_trans) > 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">203</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> corr <- x$corFixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(corr) <- "correlation"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(corr, title = "\nCorrelation:", rdig = digits, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">206</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">207</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n") # Random effects</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(summary(x$modelStruct), sigma = x$sigma,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">210</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> reEstimates = x$coef$random, digits = digits, verbose = verbose, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">211</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">212</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nBacktransformed parameters with asymmetric confidence intervals:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">213</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$confint_back, digits = digits, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">214</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">216</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printSFORB <- !is.null(x$SFORB)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printSFORB){</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">218</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEstimated Eigenvalues of SFORB model(s):\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">219</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$SFORB, digits = digits,...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printff <- !is.null(x$ff)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printff){</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">224</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nResulting formation fractions:\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">225</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(data.frame(ff = x$ff), digits = digits, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">226</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printdistimes <- !is.null(x$distimes)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">229</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printdistimes){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">230</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEstimated disappearance times:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">231</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$distimes, digits = digits, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">233</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">234</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (x$print_data){</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">235</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nData:\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">236</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(format(x$data, digits = digits, ...), row.names = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">237</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">239</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> invisible(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">240</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinerrplot.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables(c("variable", "residual"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function to plot squared residuals and the error model for an mkin object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function plots the squared residuals for the specified subset of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed variables from an mkinfit object. In addition, one or more dashed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' line(s) show the fitted error model. A combined plot of the fitted model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and this error model plot can be obtained with \code{\link{plot.mkinfit}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' using the argument \code{show_errplot = TRUE}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object A fit represented in an \code{\link{mkinfit}} object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param obs_vars A character vector of names of the observed variables for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' which residuals should be plotted. Defaults to all observed variables in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param xlim plot range in x direction.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param xlab Label for the x axis.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ylab Label for the y axis.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param maxy Maximum value of the residuals. This is used for the scaling of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the y axis and defaults to "auto".</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param legend Should a legend be plotted?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param lpos Where should the legend be placed? Default is "topright". Will</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be passed on to \code{\link{legend}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param col_obs Colors for the observed variables.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param pch_obs Symbols to be used for the observed variables.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param frame Should a frame be drawn around the plots?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots further arguments passed to \code{\link{plot}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return Nothing is returned by this function, as it is called for its side</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' effect, namely to produce a plot.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso \code{\link{mkinplot}}, for a way to plot the data and the fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lines of the mkinfit object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @keywords hplot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit(model, FOCUS_2006_D, error_model = "tc", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinerrplot(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinerrplot <- function (object,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars = names(object$mkinmod$map),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = c(0, 1.1 * max(object$data$predicted)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = "Predicted", ylab = "Squared residual",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> maxy = "auto", legend= TRUE, lpos = "topright",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> col_obs = "auto", pch_obs = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> frame = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars_all <- as.character(unique(object$data$variable))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(obs_vars) > 0){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars <- intersect(obs_vars_all, obs_vars)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">55</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> } else obs_vars <- obs_vars_all</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residuals <- subset(object$data, variable %in% obs_vars, residual)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (maxy == "auto") maxy = max(residuals^2, na.rm = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set colors and symbols</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (col_obs[1] == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col_obs <- 1:length(obs_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (pch_obs[1] == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pch_obs <- 1:length(obs_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(col_obs) <- names(pch_obs) <- obs_vars</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(0, type = "n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = xlab, ylab = ylab,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = xlim,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylim = c(0, 1.2 * maxy), frame = frame, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for(obs_var in obs_vars){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residuals_plot <- subset(object$data, variable == obs_var, c("predicted", "residual"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> points(residuals_plot[["predicted"]],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residuals_plot[["residual"]]^2,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pch = pch_obs[obs_var], col = col_obs[obs_var])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$err_mod == "const") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> abline(h = object$errparms^2, lty = 2, col = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$err_mod == "obs") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs_var in obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">130<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_name = paste0("sigma_", obs_var)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">130<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> abline(h = object$errparms[sigma_name]^2, lty = 2,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">130<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col = col_obs[obs_var])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$err_mod == "tc") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_plot <- function(predicted) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_twocomp(predicted,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_low = object$errparms[1],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rsd_high = object$errparms[2])^2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(sigma_plot, from = 0, to = max(object$data$predicted),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add = TRUE, lty = 2, col = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">275<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (legend == TRUE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend(lpos, inset = c(0.05, 0.05), legend = obs_vars,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col = col_obs[obs_vars], pch = pch_obs[obs_vars])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/parplot.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Plot parameter variability of multistart objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Produces a boxplot with all parameters from the multiple runs, scaled</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' either by the parameters of the run with the highest likelihood,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' or by their medians as proposed in the paper by Duchesne et al. (2021).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Starting values of degradation model parameters and error model parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' are shown as green circles. The results obtained in the original run</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' are shown as red circles.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object The [multistart] object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param llmin The minimum likelihood of objects to be shown</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param llquant Fractional value for selecting only the fits with higher</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' likelihoods. Overrides 'llmin'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param scale By default, scale parameters using the best</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' available fit.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If 'median', parameters are scaled using the median parameters from all fits.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param main Title of the plot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param lpos Positioning of the legend.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Passed to [boxplot]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references Duchesne R, Guillemin A, Gandrillon O, Crauste F. Practical</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' identifiability in the frame of nonlinear mixed effects models: the example</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the in vitro erythropoiesis. BMC Bioinformatics. 2021 Oct 4;22(1):478.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' doi: 10.1186/s12859-021-04373-4.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso [multistart]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats median quantile</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">parplot <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">29</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("parplot")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname parplot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">parplot.multistart.saem.mmkin <- function(object, llmin = -Inf, llquant = NA,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> scale = c("best", "median"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> lpos = "bottomleft", main = "", ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">38</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> oldpar <- par(no.readonly = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> on.exit(par(oldpar, no.readonly = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> orig <- attr(object, "orig")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> orig_parms <- parms(orig)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_degparms <- orig$mean_dp_start</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> all_parms <- parms(object, exclude_failed = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(object, "multistart.saem.mmkin")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llfunc <- function(object) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">48</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(object$so, "try-error")) return(NA)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">1408<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else return(logLik(object$so))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">52</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("parplot is only implemented for multistart.saem.mmkin objects")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ll <- sapply(object, llfunc)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(llquant[1])) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">56</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (llmin != -Inf) warning("Overriding 'llmin' because 'llquant' was specified")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llmin <- quantile(ll, 1 - llquant)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> selected <- which(ll > llmin)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> selected_parms <- all_parms[selected, ]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(las = 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (orig$transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparm_names_transformed <- names(start_degparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparm_index <- which(names(orig_parms) %in% degparm_names_transformed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> orig_parms[degparm_names_transformed] <- backtransform_odeparms(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> orig_parms[degparm_names_transformed],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> orig$mmkin[[1]]$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = orig$mmkin[[1]]$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = orig$mmkin[[1]]$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_degparms <- backtransform_odeparms(start_degparms,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> orig$mmkin[[1]]$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = orig$mmkin[[1]]$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = orig$mmkin[[1]]$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparm_names <- names(start_degparms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(orig_parms) <- c(degparm_names, names(orig_parms[-degparm_index]))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> selected_parms[, degparm_names_transformed] <-</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t(apply(selected_parms[, degparm_names_transformed], 1, backtransform_odeparms,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> orig$mmkin[[1]]$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = orig$mmkin[[1]]$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = orig$mmkin[[1]]$transform_fractions))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(selected_parms)[1:length(degparm_names)] <- degparm_names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_errparms <- orig$so@model@error.init</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(start_errparms) <- orig$so@model@name.sigma</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_omegaparms <- orig$so@model@omega.init</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_parms <- c(start_degparms, start_errparms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> scale <- match.arg(scale)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_scale <- switch(scale,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> best = selected_parms[which.best(object[selected]), ],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> median = apply(selected_parms, 2, median)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Boxplots of all scaled parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> selected_scaled_parms <- t(apply(selected_parms, 1, function(x) x / parm_scale))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> boxplot(selected_scaled_parms, log = "y", main = main, ,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylab = "Normalised parameters", ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Show starting parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_scaled_parms <- rep(NA_real_, length(orig_parms))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(start_scaled_parms) <- names(orig_parms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_scaled_parms[names(start_parms)] <-</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_parms / parm_scale[names(start_parms)]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> points(start_scaled_parms, col = 3, cex = 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Show parameters of original run</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> orig_scaled_parms <- orig_parms / parm_scale</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> points(orig_scaled_parms, col = 2, cex = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> abline(h = 1, lty = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend(lpos, inset = c(0.05, 0.05), bty = "n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pch = 1, col = 3:1, lty = c(NA, NA, 1),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend = c(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "Original start",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "Original results",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "Multistart runs"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/plot.mixed.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables("ds")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An object of class [mixed.mmkin], [saem.mmkin] or [nlme.mmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param i A numeric index to select datasets for which to plot the individual predictions,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in case plots get too large</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inheritParams plot.mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param standardized Should the residuals be standardized? Only takes effect if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' `resplot = "time"`.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param pop_curves Per default, one population curve is drawn in case</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' population parameters are fitted by the model, e.g. for saem objects.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' In case there is a covariate model, the behaviour depends on the value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of 'covariates'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param covariates Data frame with covariate values for all variables in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' any covariate models in the object. If given, it overrides 'covariate_quantiles'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Each line in the data frame will result in a line drawn for the population.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Rownames are used in the legend to label the lines.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param covariate_quantiles This argument only has an effect if the fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' object has covariate models. If so, the default is to show three population</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' curves, for the 5th percentile, the 50th percentile and the 95th percentile</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the covariate values used for fitting the model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note Covariate models are currently only supported for saem.mmkin objects.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param pred_over Named list of alternative predictions as obtained</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' from [mkinpredict] with a compatible [mkinmod].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param test_log_parms Passed to [mean_degparms] in the case of an</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [mixed.mmkin] object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param conf.level Passed to [mean_degparms] in the case of an</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [mixed.mmkin] object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param default_log_parms Passed to [mean_degparms] in the case of an</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [mixed.mmkin] object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param rel.height.legend The relative height of the legend shown on top</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param rel.height.bottom The relative height of the bottom plot row</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ymax Vector of maximum y axis values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ncol.legend Number of columns to use in the legend</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param nrow.legend Number of rows to use in the legend</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param resplot Should the residuals plotted against time or against</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' predicted values?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param col_ds Colors used for plotting the observed data and the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' corresponding model prediction lines for the different datasets.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param pch_ds Symbols to be used for plotting the data.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param lty_ds Line types to be used for the model predictions.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats coefficients</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The function is called for its side effect.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds <- lapply(experimental_data_for_UBA_2019[6:10],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' function(x) x$data[c("name", "time", "value")])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(ds) <- paste0("ds ", 6:10)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "A1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A1 = mkinsub("SFO"), quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mmkin(list("DFOP-SFO" = dfop_sfo), ds, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f[, 3:4], standardized = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # For this fit we need to increase pnlsMaxiter, and we increase the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # tolerance in order to speed up the fit for this example evaluation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # It still takes 20 seconds to run</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme <- nlme(f, control = list(pnlsMaxIter = 120, tolerance = 1e-3))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_nlme)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem <- saem(f, transformations = "saemix")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_saem)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_obs <- mmkin(list("DFOP-SFO" = dfop_sfo), ds, quiet = TRUE, error_model = "obs")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlmix <- nlmix(f_obs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_nlmix)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We can overlay the two variants if we generate predictions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' pred_nlme <- mkinpredict(dfop_sfo,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme$bparms.optim[-1],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = f_nlme$bparms.optim[[1]], A1 = 0),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' seq(0, 180, by = 0.2))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_saem, pred_over = list(nlme = pred_nlme))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">plot.mixed.mmkin <- function(x,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> i = 1:ncol(x$mmkin),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars = names(x$mkinmod$map),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> standardized = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_quantiles = c(0.5, 0.05, 0.95),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = "Time",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = range(x$data$time),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> resplot = c("predicted", "time"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> pop_curves = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> pred_over = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> test_log_parms = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.level = 0.6,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> default_log_parms = NA,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ymax = "auto", maxabs = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ncol.legend = ifelse(length(i) <= 3, length(i) + 1, ifelse(length(i) <= 8, 3, 4)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> nrow.legend = ceiling((length(i) + 1) / ncol.legend),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> rel.height.legend = 0.02 + 0.07 * nrow.legend,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> rel.height.bottom = 1.1,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> pch_ds = 1:length(i),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> col_ds = pch_ds + 1,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> lty_ds = col_ds,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> frame = TRUE, ...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Prepare parameters and data</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_1 <- x$mmkin[[1]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_names <- colnames(x$mmkin)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> backtransform = TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(class(x), "mixed.mmkin")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(pop_curves, "auto")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">110</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> pop_curves <- FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pop_curves <- TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (pop_curves) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_pop <- mean_degparms(x$mmkin, test_log_parms = test_log_parms,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.level = conf.level, default_log_parms = default_log_parms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_tmp <- parms(x$mmkin, transformed = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_i <- as.data.frame(t(degparms_tmp[setdiff(rownames(degparms_tmp), names(fit_1$errparms)), ]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residual_type = ifelse(standardized, "standardized", "residual")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residuals <- x$data[[residual_type]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(x, "nlme.mmkin")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">126</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(pop_curves, "auto")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pop_curves <- TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">129</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> pop_curves <- FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_i <- coefficients(x)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_pop <- nlme::fixef(x)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residuals <- residuals(x,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> type = ifelse(standardized, "pearson", "response"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(x, "saem.mmkin")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (x$transformations == "saemix") backtransform = FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> psi <- saemix::psi(x$so)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(psi) <- x$saemix_ds_order</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_i <- psi[ds_names, ]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_i_names <- colnames(degparms_i)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residual_type = ifelse(standardized, "standardized", "residual")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residuals <- x$data[[residual_type]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(pop_curves, "auto")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(x$covariate_models) == 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_pop <- x$so@results@fixed.effects</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(degparms_pop) <- degparms_i_names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pop_curves <- TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">152</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(covariates)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">153</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = as.data.frame(</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">154</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> apply(x$covariates, 2, quantile,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">155</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> covariate_quantiles, simplify = FALSE))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">156</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(covariates) <- paste(</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">157</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(length(x$covariate_models) == 1,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">158</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> "Covariate", "Covariates"),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">159</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(covariates))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">160</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">161</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_pop <- parms(x, covariates = covariates)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">162</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> pop_curves <- TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">165</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> pop_curves <- FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">167</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (pop_curves) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Make sure degparms_pop is a matrix, columns corresponding to population curve(s)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(dim(degparms_pop))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_pop <- matrix(degparms_pop, ncol = 1,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list(names(degparms_pop), "Population"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">174</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">175</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_fixed <- fit_1$fixed$value</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(degparms_fixed) <- rownames(fit_1$fixed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">179</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_all <- cbind(as.matrix(degparms_i),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">180</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> matrix(rep(degparms_fixed, nrow(degparms_i)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ncol = length(degparms_fixed),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nrow = nrow(degparms_i), byrow = TRUE))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_all_names <- c(names(degparms_i), names(degparms_fixed))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(degparms_all) <- degparms_all_names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">186</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_names <- grep("_0$", degparms_all_names, value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_names <- setdiff(degparms_all_names, odeini_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">188</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">189</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed <- cbind(x$data[c("ds", "name", "time", "value")],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">190</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residual = residuals)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = fit_1$solution_type</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">194</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes <- sort(unique(c(x$data$time,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> seq(xlim[1], xlim[2], length.out = 50))))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">196</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">197</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pred_list <- lapply(i, function(ds_i) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">2945<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_trans <- degparms_all[ds_i, odeparms_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">2945<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeparms_trans) <- odeparms_names # needed if only one odeparm</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">2945<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (backtransform) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">201</td> + <td class="coverage">2620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms <- backtransform_odeparms(odeparms_trans,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">202</td> + <td class="coverage">2620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> x$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">203</td> + <td class="coverage">2620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = fit_1$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">2620<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = fit_1$transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">205</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">206</td> + <td class="coverage">325<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms <- odeparms_trans</pre> + </td> + </tr> + <tr class="never"> + <td class="num">207</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">208</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">2945<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- degparms_all[ds_i, odeini_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">210</td> + <td class="coverage">2945<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini) <- gsub("_0", "", odeini_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">211</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">212</td> + <td class="coverage">2945<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out <- mkinpredict(x$mkinmod, odeparms, odeini,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">213</td> + <td class="coverage">2945<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes, solution_type = solution_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">214</td> + <td class="coverage">2945<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> atol = fit_1$atol, rtol = fit_1$rtol)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">216</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(pred_list) <- ds_names[i]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pred_ds <- vctrs::vec_rbind(!!!pred_list, .names_to = "ds")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">218</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">219</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (pop_curves) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">220</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pred_list_pop <- lapply(1:ncol(degparms_pop), function(cov_i) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">221</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_all_pop_i <- c(degparms_pop[, cov_i], degparms_fixed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_pop_trans_i <- degparms_all_pop_i[odeparms_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeparms_pop_trans_i) <- odeparms_names # needed if only one odeparm</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">224</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (backtransform) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">225</td> + <td class="coverage">218<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_pop_i <- backtransform_odeparms(odeparms_pop_trans_i,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">226</td> + <td class="coverage">218<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> x$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">227</td> + <td class="coverage">218<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = fit_1$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">218<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = fit_1$transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">229</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">230</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_pop_i <- odeparms_pop_trans_i</pre> + </td> + </tr> + <tr class="never"> + <td class="num">231</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">233</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- degparms_all_pop_i[odeini_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">234</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini) <- gsub("_0", "", odeini_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">235</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">236</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out <- mkinpredict(x$mkinmod, odeparms_pop_i, odeini,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes, solution_type = solution_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">238</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> atol = fit_1$atol, rtol = fit_1$rtol)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">239</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">240</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(pred_list_pop) <- colnames(degparms_pop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">241</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">242</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">243</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> pred_list_pop <- NULL</pre> + </td> + </tr> + <tr class="never"> + <td class="num">244</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">245</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">246</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Start of graphical section</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">247</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> oldpar <- par(no.readonly = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">248</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> on.exit(par(oldpar, no.readonly = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">249</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">250</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_plot_rows = length(obs_vars)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">251</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_plots = n_plot_rows * 2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">252</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">253</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set relative plot heights, so the first plot row is the norm</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">254</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rel.heights <- if (n_plot_rows > 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">255</td> + <td class="coverage">218<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> c(rel.height.legend, c(rep(1, n_plot_rows - 1), rel.height.bottom))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">256</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">257</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> c(rel.height.legend, 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">258</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">259</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">260</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> layout_matrix = matrix(c(1, 1, 2:(n_plots + 1)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">261</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_plot_rows + 1, 2, byrow = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">262</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> layout(layout_matrix, heights = rel.heights)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">263</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(0.1, 2.1, 0.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">265</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">266</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Empty plot with legend</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">267</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(pred_over)) lty_over <- seq(2, length.out = length(pred_over))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">268</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else lty_over <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">269</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (pop_curves) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">270</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(covariates)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">271</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lty_pop <- 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">272</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(lty_pop) <- "Population"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">273</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">274</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> lty_pop <- 1:nrow(covariates)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">275</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> names(lty_pop) <- rownames(covariates)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">276</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">277</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">278</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> lty_pop <- NULL</pre> + </td> + </tr> + <tr class="never"> + <td class="num">279</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">280</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_pop_over <- length(lty_pop) + length(lty_over)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">281</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">282</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(0, type = "n", axes = FALSE, ann = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">283</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend("center", bty = "n", ncol = ncol.legend,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">284</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend = c(names(lty_pop), names(pred_over), ds_names[i]),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">285</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lty = c(lty_pop, lty_over, lty_ds),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">286</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lwd = c(rep(2, n_pop_over), rep(1, length(i))),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">287</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col = c(rep(1, n_pop_over), col_ds),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">288</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pch = c(rep(NA, n_pop_over), pch_ds))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">289</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">290</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> resplot <- match.arg(resplot)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">291</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">292</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Loop plot rows</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">293</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (plot_row in 1:n_plot_rows) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">294</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">295</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_var <- obs_vars[plot_row]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">296</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed_row <- subset(observed, name == obs_var)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">297</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">298</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set ylim to sensible default, or use ymax</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">299</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(ymax, "auto")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">300</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylim_row = c(0,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">301</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> max(c(observed_row$value, pred_ds[[obs_var]]), na.rm = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">302</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">303</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ylim_row = c(0, ymax[plot_row])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">304</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">305</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">306</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Margins for bottom row of plots when we have more than one row</pre> + </td> + </tr> + <tr class="never"> + <td class="num">307</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # This is the only row that needs to show the x axis legend</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">308</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (plot_row == n_plot_rows) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">309</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(5.1, 4.1, 1.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">310</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">311</td> + <td class="coverage">218<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(3.0, 4.1, 1.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">312</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">313</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">314</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(0, type = "n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">315</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = xlim, ylim = ylim_row,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">316</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = xlab, ylab = paste("Residues", obs_var), frame = frame)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">317</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">318</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(pred_over)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">319</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> for (i_over in seq_along(pred_over)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">320</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> pred_frame <- as.data.frame(pred_over[[i_over]])</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">321</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> lines(pred_frame$time, pred_frame[[obs_var]],</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">322</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> lwd = 2, lty = lty_over[i_over])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">323</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">324</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">325</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">326</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (ds_i in seq_along(i)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">327</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> points(subset(observed_row, ds == ds_names[ds_i], c("time", "value")),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">328</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col = col_ds[ds_i], pch = pch_ds[ds_i])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">329</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lines(subset(pred_ds, ds == ds_names[ds_i], c("time", obs_var)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">330</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col = col_ds[ds_i], lty = lty_ds[ds_i])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">331</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">332</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">333</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (pop_curves) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">334</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (cov_i in seq_along(pred_list_pop)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">335</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cov_name <- names(pred_list_pop)[cov_i]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">336</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lines(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">337</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pred_list_pop[[cov_i]][, "time"],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">338</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pred_list_pop[[cov_i]][, obs_var],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">339</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> type = "l", lwd = 2, lty = lty_pop[cov_i])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">340</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">341</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">342</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">343</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(maxabs, "auto")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">344</td> + <td class="coverage">283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> maxabs = max(abs(observed_row$residual), na.rm = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">345</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">346</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">347</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(resplot, "time")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">348</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> plot(0, type = "n", xlim = xlim, xlab = "Time",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">349</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ylim = c(-1.2 * maxabs, 1.2 * maxabs),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">350</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ylab = if (standardized) "Standardized residual" else "Residual",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">351</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> frame = frame)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">352</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">353</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> abline(h = 0, lty = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">354</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">355</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> for (ds_i in seq_along(i)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">356</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> points(subset(observed_row, ds == ds_names[ds_i], c("time", "residual")),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">357</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> col = col_ds[ds_i], pch = pch_ds[ds_i])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">358</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">359</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">360</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">361</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(resplot, "predicted")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">362</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(0, type = "n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">363</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = c(0, max(pred_ds[[obs_var]])),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">364</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = "Predicted",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">365</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylim = c(-1.2 * maxabs, 1.2 * maxabs),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">366</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylab = if (standardized) "Standardized residual" else "Residual",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">367</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> frame = frame)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">368</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">369</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> abline(h = 0, lty = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">370</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">371</td> + <td class="coverage">501<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (ds_i in seq_along(i)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">372</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed_row_ds <- merge(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">373</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> subset(observed_row, ds == ds_names[ds_i], c("time", "residual")),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">374</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> subset(pred_ds, ds == ds_names[ds_i], c("time", obs_var)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">375</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> points(observed_row_ds[c(3, 2)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">376</td> + <td class="coverage">4915<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col = col_ds[ds_i], pch = pch_ds[ds_i])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">377</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">378</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">379</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">380</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/summary.mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Summary method for class "mkinfit"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Lists model equations, initial parameter values, optimised parameters with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' some uncertainty statistics, the chi2 error levels calculated according to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS guidance (2006) as defined therein, formation fractions, DT50 values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and optionally the data, consisting of observed, predicted and residual</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' values.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object an object of class [mkinfit].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x an object of class \code{summary.mkinfit}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param data logical, indicating whether the data should be included in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param distimes logical, indicating whether DT50 and DT90 values should be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' included.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param alpha error level for confidence interval estimation from t</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' distribution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits Number of digits to use for printing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots optional arguments passed to methods like \code{print}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats qt pt cov2cor</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The summary function returns a list with components, among others</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{version, Rversion}{The mkin and R versions used}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{date.fit, date.summary}{The dates where the fit and the summary were</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' produced}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{diffs}{The differential equations used in the model}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{use_of_ff}{Was maximum or minimum use made of formation fractions}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{bpar}{Optimised and backtransformed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{data}{The data (see Description above).}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{start}{The starting values and bounds, if applicable, for optimised</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{fixed}{The values of fixed parameters.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{errmin }{The chi2 error levels for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' each observed variable.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{bparms.ode}{All backtransformed ODE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters, for use as starting parameters for related models.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{errparms}{Error model parameters.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{ff}{The estimated formation fractions derived from the fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{distimes}{The DT50 and DT90 values for each observed variable.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{SFORB}{If applicable, eigenvalues and fractional eigenvector component</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' g of SFORB systems in the model.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The print method is called for its side effect, i.e. printing the summary.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references FOCUS (2006) \dQuote{Guidance Document on Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(mkinfit("SFO", FOCUS_2006_A, quiet = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">summary.mkinfit <- function(object, data = TRUE, distimes = TRUE, alpha = 0.05, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> param <- object$par</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pnames <- names(param)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpnames <- names(object$bparms.optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> epnames <- names(object$errparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> p <- length(param)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mod_vars <- names(object$mkinmod$diffs)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar <- try(solve(object$hessian), silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar_notrans <- try(solve(object$hessian_notrans), silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rdf <- object$df.residual</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.numeric(covar) | is.na(covar[1])) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">66</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> covar <- NULL</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">67</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> se <- lci <- uci <- rep(NA, p)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(covar) <- colnames(covar) <- pnames</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> se <- sqrt(diag(covar))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lci <- param + qt(alpha/2, rdf) * se</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> uci <- param + qt(1-alpha/2, rdf) * se</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> beparms.optim <- c(object$bparms.optim, object$par[epnames])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.numeric(covar_notrans) | is.na(covar_notrans[1])) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar_notrans <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> se_notrans <- tval <- pval <- rep(NA, p)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">52070<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(covar_notrans) <- colnames(covar_notrans) <- c(bpnames, epnames)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">52070<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> se_notrans <- sqrt(diag(covar_notrans))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">52070<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tval <- beparms.optim / se_notrans</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">52070<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pval <- pt(abs(tval), rdf, lower.tail = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(se) <- pnames</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> param <- cbind(param, se, lci, uci)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(param) <- list(pnames, c("Estimate", "Std. Error", "Lower", "Upper"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparam <- cbind(Estimate = beparms.optim, se_notrans,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "t value" = tval, "Pr(>t)" = pval, Lower = NA, Upper = NA)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transform boundaries of CI for one parameter at a time,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # with the exception of sets of formation fractions (single fractions are OK).</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names_skip <- character(0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (box in mod_vars) { # Figure out sets of fractions to skip</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">70671<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names <- grep(paste("^f", box, sep = "_"), pnames, value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">70671<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_paths <- length(f_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">1135<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (n_paths > 1) f_names_skip <- c(f_names_skip, f_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (pname in pnames) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">293621<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!pname %in% f_names_skip) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par.lower <- param[pname, "Lower"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par.upper <- param[pname, "Upper"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(par.lower) <- names(par.upper) <- pname</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpl <- backtransform_odeparms(par.lower, object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpu <- backtransform_odeparms(par.upper, object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparam[names(bpl), "Lower"] <- bpl</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">290217<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparam[names(bpu), "Upper"] <- bpu</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparam[epnames, c("Lower", "Upper")] <- param[epnames, c("Lower", "Upper")]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans <- list(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> version = as.character(utils::packageVersion("mkin")),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> Rversion = paste(R.version$major, R.version$minor, sep="."),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> date.fit = object$date,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">124</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> date.summary = date(),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = object$solution_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">126</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> warnings = object$summary_warnings,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_of_ff = object$mkinmod$use_of_ff,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">128</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model_algorithm = object$error_model_algorithm,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> df = c(p, rdf),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar = covar,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar_notrans = covar_notrans,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> err_mod = object$err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> niter = object$iterations,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> calls = object$calls,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> time = object$time,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par = param,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpar = bparam)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(object$version)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$fit_version <- object$version</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$fit_Rversion <- object$Rversion</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ans$fit_version >= "0.9.49.6") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">52156<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$AIC = AIC(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">52156<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$BIC = BIC(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">52156<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$logLik = logLik(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$diffs <- object$mkinmod$diffs</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(data) ans$data <- object$data</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$start <- object$start</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">152</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$start_transformed <- object$start_transformed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">154</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$fixed <- object$fixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">156</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$errmin <- mkinerrmin(object, alpha = 0.05)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">158</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$calls > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(ans$covar)){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> Corr <- cov2cor(ans$covar)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(Corr) <- colnames(Corr) <- rownames(ans$par)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$Corr <- Corr</pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">164</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> warning("Could not calculate correlation; no covariance matrix")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">167</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$bparms.ode <- object$bparms.ode</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$shapiro.p <- object$shapiro.p</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">170</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep <- endpoints(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ep$ff) != 0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">15612<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans$ff <- ep$ff</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (distimes) ans$distimes <- ep$distimes</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">2442<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ep$SFORB) != 0) ans$SFORB <- ep$SFORB</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">43972<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(object$d_3_message)) ans$d_3_message <- object$d_3_message</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">176</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(ans) <- "summary.mkinfit"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">52158<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ans)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">178</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname summary.mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">181</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">182</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.summary.mkinfit <- function(x, digits = max(3, getOption("digits") - 3), ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(x$fit_version)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">184</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("mkin version: ", x$version, "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">185</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("R version: ", x$Rversion, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">186</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("mkin version used for fitting: ", x$fit_version, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("R version used for fitting: ", x$fit_Rversion, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">191</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Date of fit: ", x$date.fit, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Date of summary:", x$date.summary, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">194</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEquations:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nice_diffs <- gsub("^(d.*) =", "\\1/dt =", x[["diffs"]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> writeLines(strwrap(nice_diffs, exdent = 11))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">197</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> df <- x$df</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rdf <- df[2]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">199</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nModel predictions using solution type", x$solution_type, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">202</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFitted using", x$calls, "model solutions performed in", x$time[["elapsed"]], "s\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$err_mod)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nError model: ")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">206</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(switch(x$err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">207</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> const = "Constant variance",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs = "Variance unique to each observed variable",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tc = "Two-component variance function"), "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">210</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">211</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nError model algorithm:", x$error_model_algorithm, "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">212</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$d_3_message)) cat(x$d_3_message, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">214</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">215</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStarting values for parameters to be optimised:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">216</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$start)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">217</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">218</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStarting values for the transformed parameters actually optimised:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">219</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$start_transformed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">221</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFixed parameter values:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(length(x$fixed$value) == 0) cat("None\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else print(x$fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">224</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">225</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We used to only have one warning - show this for summarising old objects</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">226</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x[["warning"]])) cat("\n\nWarning:", x$warning, "\n\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(x$warnings) > 0) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">229</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n\nWarning(s):", "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">230</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat(x$warnings, sep = "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">231</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">233</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$AIC)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">234</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nResults:\n\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(data.frame(AIC = x$AIC, BIC = x$BIC, logLik = x$logLik,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">236</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = " "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">237</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">239</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nOptimised, transformed parameters with symmetric confidence intervals:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">240</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(signif(x$par, digits = digits))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">241</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">242</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (x$calls > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nParameter correlation:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">244</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$covar)){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">245</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$Corr, digits = digits, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">246</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">247</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("No covariance matrix")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">248</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">249</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">250</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">251</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nBacktransformed parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">252</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Confidence intervals for internally transformed parameters are asymmetric.\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">253</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if ((x$version) < "0.9-36") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">254</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("To get the usual (questionable) t-test, upgrade mkin and repeat the fit.\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">255</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(signif(x$bpar, digits = digits))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">256</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">257</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("t-test (unrealistically) based on the assumption of normal distribution\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">258</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("for estimators of untransformed parameters.\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">259</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(signif(x$bpar[, c(1, 3, 4, 5, 6)], digits = digits))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">260</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">261</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">262</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFOCUS Chi2 error levels in percent:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">263</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> x$errmin$err.min <- 100 * x$errmin$err.min</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$errmin, digits=digits,...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">265</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">266</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printSFORB <- !is.null(x$SFORB)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">267</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printSFORB){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">268</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEstimated Eigenvalues and DFOP g parameter of SFORB model(s):\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">269</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$SFORB, digits=digits,...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">270</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">271</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">272</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printff <- !is.null(x$ff)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">273</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printff){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">274</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nResulting formation fractions:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">275</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(data.frame(ff = x$ff), digits=digits,...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">276</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">277</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">278</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printdistimes <- !is.null(x$distimes)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">279</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printdistimes){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">280</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEstimated disappearance times:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">281</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$distimes, digits=digits,...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">282</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">283</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">284</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printdata <- !is.null(x$data)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">285</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (printdata){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">286</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nData:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">287</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(format(x$data, digits = digits, ...), row.names = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">288</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">289</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">290</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> invisible(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">291</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables(c("name", "time", "value"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Fit a kinetic model to data with one or more state variables</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function maximises the likelihood of the observed data using the Port</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' algorithm [stats::nlminb()], and the specified initial or fixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters and starting values. In each step of the optimisation, the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' kinetic model is solved using the function [mkinpredict()], except</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if an analytical solution is implemented, in which case the model is solved</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' using the degradation function in the [mkinmod] object. The</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters of the selected error model are fitted simultaneously with the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' degradation model parameters, as both of them are arguments of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' likelihood function.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Per default, parameters in the kinetic models are internally transformed in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' order to better satisfy the assumption of a normal distribution of their</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' estimators.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param mkinmod A list of class [mkinmod], containing the kinetic</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model to be fitted to the data, or one of the shorthand names ("SFO",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "FOMC", "DFOP", "HS", "SFORB", "IORE"). If a shorthand name is given, a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent only degradation model is generated for the variable with the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' highest value in \code{observed}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param observed A dataframe with the observed data. The first column called</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "name" must contain the name of the observed variable for each data point.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The second column must contain the times of observation, named "time".</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The third column must be named "value" and contain the observed values.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Zero values in the "value" column will be removed, with a warning, in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' order to avoid problems with fitting the two-component error model. This</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is not expected to be a problem, because in general, values of zero are</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' not observed in degradation data, because there is a lower limit of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' detection.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param parms.ini A named vector of initial values for the parameters,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' including parameters to be optimised and potentially also fixed parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' as indicated by \code{fixed_parms}. If set to "auto", initial values for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rate constants are set to default values. Using parameter names that are</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' not in the model gives an error.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' It is possible to only specify a subset of the parameters that the model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' needs. You can use the parameter lists "bparms.ode" from a previously</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fitted model, which contains the differential equation parameters from</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' this model. This works nicely if the models are nested. An example is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' given below.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param state.ini A named vector of initial values for the state variables of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the model. In case the observed variables are represented by more than one</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model variable, the names will differ from the names of the observed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variables (see \code{map} component of [mkinmod]). The default</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is to set the initial value of the first model variable to the mean of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' time zero values for the variable with the maximum observed value, and all</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' others to 0. If this variable has no time zero observations, its initial</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' value is set to 100.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param err.ini A named vector of initial values for the error model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters to be optimised. If set to "auto", initial values are set to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' default values. Otherwise, inital values for all error model parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' must be given.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param fixed_parms The names of parameters that should not be optimised but</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rather kept at the values specified in \code{parms.ini}. Alternatively,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a named numeric vector of parameters to be fixed, regardless of the values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in parms.ini.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param fixed_initials The names of model variables for which the initial</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' state at time 0 should be excluded from the optimisation. Defaults to all</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' state variables except for the first one.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param from_max_mean If this is set to TRUE, and the model has only one</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed variable, then data before the time of the maximum observed value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' (after averaging for each sampling time) are discarded, and this time is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' subtracted from all remaining time values, so the time of the maximum</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed mean value is the new time zero.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param solution_type If set to "eigen", the solution of the system of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' differential equations is based on the spectral decomposition of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' coefficient matrix in cases that this is possible. If set to "deSolve", a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' numerical [ode solver from package deSolve][deSolve::ode()] is used. If</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set to "analytical", an analytical solution of the model is used. This is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' only implemented for relatively simple degradation models. The default is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "auto", which uses "analytical" if possible, otherwise "deSolve" if a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' compiler is present, and "eigen" if no compiler is present and the model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' can be expressed using eigenvalues and eigenvectors.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param method.ode The solution method passed via [mkinpredict()]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to [deSolve::ode()] in case the solution type is "deSolve". The default</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "lsoda" is performant, but sometimes fails to converge.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param use_compiled If set to \code{FALSE}, no compiled version of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [mkinmod] model is used in the calls to [mkinpredict()] even if a compiled</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' version is present.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param control A list of control arguments passed to [stats::nlminb()].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param transform_rates Boolean specifying if kinetic rate constants should</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be transformed in the model specification used in the fitting for better</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' compliance with the assumption of normal distribution of the estimator. If</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' TRUE, also alpha and beta parameters of the FOMC model are</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' log-transformed, as well as k1 and k2 rate constants for the DFOP and HS</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' models and the break point tb of the HS model. If FALSE, zero is used as</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a lower bound for the rates in the optimisation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param transform_fractions Boolean specifying if formation fractions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' should be transformed in the model specification used in the fitting for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' better compliance with the assumption of normal distribution of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' estimator. The default (TRUE) is to do transformations. If TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the g parameter of the DFOP model is also transformed. Transformations</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' are described in [transform_odeparms].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param quiet Suppress printing out the current value of the negative</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' log-likelihood after each improvement?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param atol Absolute error tolerance, passed to [deSolve::ode()]. Default</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is 1e-8, which is lower than the default in the [deSolve::lsoda()]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' function which is used per default.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param rtol Absolute error tolerance, passed to [deSolve::ode()]. Default</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is 1e-10, much lower than in [deSolve::lsoda()].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param error_model If the error model is "const", a constant standard</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' deviation is assumed.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If the error model is "obs", each observed variable is assumed to have its</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' own variance.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If the error model is "tc" (two-component error model), a two component</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' error model similar to the one described by Rocke and Lorenzato (1995) is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' used for setting up the likelihood function. Note that this model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' deviates from the model by Rocke and Lorenzato, as their model implies</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' that the errors follow a lognormal distribution for large values, not a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' normal distribution as assumed by this method.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param error_model_algorithm If "auto", the selected algorithm depends on</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the error model. If the error model is "const", unweighted nonlinear</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' least squares fitting ("OLS") is selected. If the error model is "obs", or</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "tc", the "d_3" algorithm is selected.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The algorithm "d_3" will directly minimize the negative log-likelihood</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and independently also use the three step algorithm described below.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The fit with the higher likelihood is returned.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The algorithm "direct" will directly minimize the negative log-likelihood.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The algorithm "twostep" will minimize the negative log-likelihood after an</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' initial unweighted least squares optimisation step.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The algorithm "threestep" starts with unweighted least squares, then</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' optimizes only the error model using the degradation model parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' found, and then minimizes the negative log-likelihood with free</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' degradation and error model parameters.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The algorithm "fourstep" starts with unweighted least squares, then</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' optimizes only the error model using the degradation model parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' found, then optimizes the degradation model again with fixed error model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters, and finally minimizes the negative log-likelihood with free</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' degradation and error model parameters.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The algorithm "IRLS" (Iteratively Reweighted Least Squares) starts with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">142</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' unweighted least squares, and then iterates optimization of the error</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model parameters and subsequent optimization of the degradation model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">144</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' using those error model parameters, until the error model parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' converge.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param reweight.tol Tolerance for the convergence criterion calculated from</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the error model parameters in IRLS fits.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param reweight.max.iter Maximum number of iterations in IRLS fits.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param trace_parms Should a trace of the parameter values be listed?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param test_residuals Should the residuals be tested for normal distribution?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further arguments that will be passed on to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [deSolve::ode()].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats nlminb aggregate dist shapiro.test</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A list with "mkinfit" in the class attribute.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note When using the "IORE" submodel for metabolites, fitting with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "transform_rates = TRUE" (the default) often leads to failures of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' numerical ODE solver. In this situation it may help to switch off the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' internal rate transformation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">160</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso [summary.mkinfit], [plot.mkinfit], [parms] and [lrtest].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">161</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">162</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Comparisons of models fitted to the same data can be made using</pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{AIC}} by virtue of the method \code{\link{logLik.mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Fitting of several models to several datasets in a single call to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{mmkin}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">167</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references Rocke DM and Lorenzato S (1995) A two-component model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for measurement error in analytical chemistry. *Technometrics* 37(2), 176-184.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">169</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Ranke J and Meinecke S (2019) Error Models for the Kinetic Evaluation of Chemical</pre> + </td> + </tr> + <tr class="never"> + <td class="num">171</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Degradation Data. *Environments* 6(12) 124</pre> + </td> + </tr> + <tr class="never"> + <td class="num">172</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \doi{10.3390/environments6120124}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">173</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">174</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">175</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Use shorthand notation for parent only degradation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit("FOMC", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">177</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">178</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # One parent compound, one metabolite, both single first order.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We remove zero values from FOCUS dataset D in order to avoid warnings</pre> + </td> + </tr> + <tr class="never"> + <td class="num">181</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS_D <- subset(FOCUS_2006_D, value != 0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">182</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Use mkinsub for convenience in model formulation. Pathway to sink included per default.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">183</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">184</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("SFO", "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">186</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">187</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Fit the model quietly to the FOCUS example dataset D using defaults</pre> + </td> + </tr> + <tr class="never"> + <td class="num">188</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_sep(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # As lower parent values appear to have lower variance, we try an alternative error model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.tc <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">192</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # This avoids the warning, and the likelihood ratio test confirms it is preferable</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lrtest(fit.tc, fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We can also allow for different variances of parent and metabolite as error model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">195</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.obs <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "obs")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">196</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The two-component error model has significantly higher likelihood</pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lrtest(fit.obs, fit.tc)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">198</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fit.tc)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">199</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(fit.tc)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">200</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We can show a quick (only one replication) benchmark for this case, as we</pre> + </td> + </tr> + <tr class="never"> + <td class="num">202</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # have several alternative solution methods for the model. We skip</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # uncompiled deSolve, as it is so slow. More benchmarks are found in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">204</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # benchmark vignette</pre> + </td> + </tr> + <tr class="never"> + <td class="num">205</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">206</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if(require(rbenchmark)) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">207</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' benchmark(replications = 1, order = "relative", columns = c("test", "relative", "elapsed"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">208</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' deSolve_compiled = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "tc",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">209</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "deSolve", use_compiled = TRUE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">210</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' eigen = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "tc",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">211</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "eigen"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">212</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' analytical = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "tc",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "analytical"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">214</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">216</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">217</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Use stepwise fitting, using optimised parameters from parent only fit, FOMC-SFO</pre> + </td> + </tr> + <tr class="never"> + <td class="num">218</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">219</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOMC_SFO <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("FOMC", "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">222</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.FOMC_SFO <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">223</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Again, we get a warning and try a more sophisticated error model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">224</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.FOMC_SFO.tc <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">225</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # This model has a higher likelihood, but not significantly so</pre> + </td> + </tr> + <tr class="never"> + <td class="num">226</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lrtest(fit.tc, fit.FOMC_SFO.tc)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Also, the missing standard error for log_beta and the t-tests for alpha</pre> + </td> + </tr> + <tr class="never"> + <td class="num">228</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # and beta indicate overparameterisation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">229</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(fit.FOMC_SFO.tc, data = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">230</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">231</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We can easily use starting parameters from the parent only fit (only for illustration)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.FOMC = mkinfit("FOMC", FOCUS_2006_D, quiet = TRUE, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">233</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.FOMC_SFO <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">234</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms.ini = fit.FOMC$bparms.ode, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">235</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">236</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">237</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinfit <- function(mkinmod, observed,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.ini = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">239</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">240</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> err.ini = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">241</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_parms = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">242</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_initials = names(mkinmod$diffs)[-1],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">243</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> from_max_mean = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">244</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = c("auto", "analytical", "eigen", "deSolve"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">245</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> method.ode = "lsoda",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">246</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> use_compiled = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">247</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> control = list(eval.max = 300, iter.max = 200),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">248</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">249</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">250</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> quiet = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">251</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> atol = 1e-8, rtol = 1e-10,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">252</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model = c("const", "obs", "tc"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">253</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model_algorithm = c("auto", "d_3", "direct", "twostep", "threestep", "fourstep", "IRLS", "OLS"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">254</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> reweight.tol = 1e-8, reweight.max.iter = 10,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">255</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> trace_parms = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">256</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> test_residuals = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">257</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">258</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">259</td> + <td class="coverage">9202<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- match.call()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">260</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">261</td> + <td class="coverage">9202<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> summary_warnings <- character()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">262</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">263</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Derive the name used for the model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">9202<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.character(mkinmod)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">265</td> + <td class="coverage">4009<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinmod_name <- mkinmod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">266</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">267</td> + <td class="coverage">5193<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(mkinmod$name)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">268</td> + <td class="coverage">5071<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinmod_name <- deparse(substitute(mkinmod))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">269</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">270</td> + <td class="coverage">18<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinmod_name <- mkinmod$name</pre> + </td> + </tr> + <tr class="never"> + <td class="num">271</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">272</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">273</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">274</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check mkinmod and generate a model for the variable whith the highest value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">275</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # if a suitable string is given</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">276</td> + <td class="coverage">9098<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_models_available = c("SFO", "FOMC", "DFOP", "HS", "SFORB", "IORE", "logistic")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">277</td> + <td class="coverage">9098<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!inherits(mkinmod, "mkinmod")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">278</td> + <td class="coverage">4009<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> presumed_parent_name = observed[which.max(observed$value), "name"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">279</td> + <td class="coverage">4009<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (mkinmod[[1]] %in% parent_models_available) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">280</td> + <td class="coverage">3905<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> speclist <- list(list(type = mkinmod, sink = TRUE))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">281</td> + <td class="coverage">3905<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(speclist) <- presumed_parent_name</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">282</td> + <td class="coverage">3905<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinmod <- mkinmod(speclist = speclist, use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">283</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">284</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Argument mkinmod must be of class mkinmod or a string containing one of\n ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">285</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste(parent_models_available, collapse = ", "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">286</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">287</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">288</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">289</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get the names of the state variables in the model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">290</td> + <td class="coverage">8994<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mod_vars <- names(mkinmod$diffs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">291</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">292</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get the names of observed variables</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">293</td> + <td class="coverage">8994<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars <- names(mkinmod$spec)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">294</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">295</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Subset observed data with names of observed data in the model and remove NA values</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">296</td> + <td class="coverage">8994<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed <- subset(observed, name %in% obs_vars)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">297</td> + <td class="coverage">8994<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed <- subset(observed, !is.na(value))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">298</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">299</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Also remove zero values to avoid instabilities (e.g. of the 'tc' error model)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">300</td> + <td class="coverage">8994<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(observed$value == 0)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">301</td> + <td class="coverage">529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> zero_warning <- "Observations with value of zero were removed from the data"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">302</td> + <td class="coverage">529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> summary_warnings <- c(summary_warnings, Z = zero_warning)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">303</td> + <td class="coverage">529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> warning(zero_warning)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">304</td> + <td class="coverage">529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed <- subset(observed, value != 0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">305</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">306</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">307</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Sort observed values for efficient analytical predictions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">308</td> + <td class="coverage">8994<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed$name <- ordered(observed$name, levels = obs_vars)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">309</td> + <td class="coverage">8994<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed <- observed[order(observed$name, observed$time), ]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">310</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">311</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Obtain data for decline from maximum mean value if requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">312</td> + <td class="coverage">8994<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (from_max_mean) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">313</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # This is only used for simple decline models</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">314</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(obs_vars) > 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">315</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Decline from maximum is only implemented for models with a single observed variable")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">316</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed$name <- as.character(observed$name)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">317</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">318</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> means <- aggregate(value ~ time, data = observed, mean, na.rm=TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">319</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t_of_max <- means[which.max(means$value), "time"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">320</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed <- subset(observed, time >= t_of_max)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">321</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed$time <- observed$time - t_of_max</pre> + </td> + </tr> + <tr class="never"> + <td class="num">322</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">323</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">324</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Number observations used for fitting</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">325</td> + <td class="coverage">8841<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_observed <- nrow(observed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">326</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">327</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define starting values for parameters where not specified by the user</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">328</td> + <td class="coverage">8371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parms.ini[[1]] == "auto") parms.ini = vector()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">329</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">330</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Override parms.ini for parameters given as a numeric vector in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">331</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # fixed_parms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">332</td> + <td class="coverage">8841<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.numeric(fixed_parms)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">333</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_parm_names <- names(fixed_parms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">334</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.ini[fixed_parm_names] <- fixed_parms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">335</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_parms <- fixed_parm_names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">336</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">337</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">338</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Warn for inital parameter specifications that are not in the model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">339</td> + <td class="coverage">8841<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> wrongpar.names <- setdiff(names(parms.ini), mkinmod$parms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">340</td> + <td class="coverage">8841<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(wrongpar.names) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">341</td> + <td class="coverage">257<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> warning("Initial parameter(s) ", paste(wrongpar.names, collapse = ", "),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">342</td> + <td class="coverage">257<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> " not used in the model")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">343</td> + <td class="coverage">257<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.ini <- parms.ini[setdiff(names(parms.ini), wrongpar.names)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">344</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">345</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">346</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Warn that the sum of formation fractions may exceed one if they are not</pre> + </td> + </tr> + <tr class="never"> + <td class="num">347</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # fitted in the transformed way</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">348</td> + <td class="coverage">8841<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (mkinmod$use_of_ff == "max" & transform_fractions == FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">349</td> + <td class="coverage">410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> warning("The sum of formation fractions may exceed one if you do not use ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">350</td> + <td class="coverage">410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "transform_fractions = TRUE." )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">351</td> + <td class="coverage">410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (box in mod_vars) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">352</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Stop if formation fractions are not transformed and we have no sink</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">353</td> + <td class="coverage">716<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (mkinmod$spec[[box]]$sink == FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">354</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("If formation fractions are not transformed during the fitting, ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">355</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "it is not supported to turn off pathways to sink.\n ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">356</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "Consider turning on the transformation of formation fractions or ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">357</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "setting up a model with use_of_ff = 'min'.\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">358</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">359</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">360</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">361</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">362</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Do not allow fixing formation fractions if we are using the ilr transformation,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">363</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # this is not supported</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">364</td> + <td class="coverage">8737<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transform_fractions == TRUE && length(fixed_parms) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">365</td> + <td class="coverage">107<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(grepl("^f_", fixed_parms))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">366</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Fixing formation fractions is not supported when using the ilr ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">367</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "transformation.")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">368</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">369</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">370</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">371</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set initial parameter values, including a small increment (salt)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">372</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # to avoid linear dependencies (singular matrix) in Eigenvalue based solutions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">373</td> + <td class="coverage">8633<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_salt = 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">374</td> + <td class="coverage">8633<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> defaultpar.names <- setdiff(mkinmod$parms, names(parms.ini))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">375</td> + <td class="coverage">8633<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (parmname in defaultpar.names) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">376</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Default values for rate constants, depending on the parameterisation</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">377</td> + <td class="coverage">20999<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (grepl("^k", parmname)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">378</td> + <td class="coverage">15908<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.ini[parmname] = 0.1 + k_salt</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">379</td> + <td class="coverage">15908<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_salt = k_salt + 1e-4</pre> + </td> + </tr> + <tr class="never"> + <td class="num">380</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">381</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Default values for rate constants for reversible binding</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">382</td> + <td class="coverage">26<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (grepl("free_bound$", parmname)) parms.ini[parmname] = 0.1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">383</td> + <td class="coverage">26<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (grepl("bound_free$", parmname)) parms.ini[parmname] = 0.02</pre> + </td> + </tr> + <tr class="never"> + <td class="num">384</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Default values for IORE exponents</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">385</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (grepl("^N", parmname)) parms.ini[parmname] = 1.1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">386</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Default values for the FOMC, DFOP and HS models</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">387</td> + <td class="coverage">238<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "alpha") parms.ini[parmname] = 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">388</td> + <td class="coverage">238<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "beta") parms.ini[parmname] = 10</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">389</td> + <td class="coverage">1014<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "k1") parms.ini[parmname] = 0.1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">390</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "k2") parms.ini[parmname] = 0.01</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">391</td> + <td class="coverage">30<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "tb") parms.ini[parmname] = 5</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">392</td> + <td class="coverage">984<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "g") parms.ini[parmname] = 0.5</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">393</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "kmax") parms.ini[parmname] = 0.1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">394</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "k0") parms.ini[parmname] = 0.0001</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">395</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parmname == "r") parms.ini[parmname] = 0.2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">396</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">397</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Default values for formation fractions in case they are present</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">398</td> + <td class="coverage">8633<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs_var in obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">399</td> + <td class="coverage">13865<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> origin <- mkinmod$map[[obs_var]][[1]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">400</td> + <td class="coverage">13865<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names <- mkinmod$parms[grep(paste0("^f_", origin), mkinmod$parms)]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">401</td> + <td class="coverage">13865<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(f_names) > 0) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">402</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We need to differentiate between default and specified fractions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">403</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # and set the unspecified to 1 - sum(specified)/n_unspecified</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">404</td> + <td class="coverage">3365<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_default_names <- intersect(f_names, defaultpar.names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">405</td> + <td class="coverage">3365<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_specified_names <- setdiff(f_names, defaultpar.names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">406</td> + <td class="coverage">3365<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sum_f_specified = sum(parms.ini[f_specified_names])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">407</td> + <td class="coverage">3365<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (sum_f_specified > 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">408</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Starting values for the formation fractions originating from ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">409</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> origin, " sum up to more than 1.")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">410</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">411</td> + <td class="coverage">3260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (mkinmod$spec[[obs_var]]$sink) n_unspecified = length(f_default_names) + 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">412</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">413</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_unspecified = length(f_default_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">414</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">415</td> + <td class="coverage">3261<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.ini[f_default_names] <- (1 - sum_f_specified) / n_unspecified</pre> + </td> + </tr> + <tr class="never"> + <td class="num">416</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">417</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">418</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">419</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set default for state.ini if appropriate</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">420</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_name = names(mkinmod$spec)[[1]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">421</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_time_0 = subset(observed, time == 0 & name == parent_name)$value</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">422</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_time_0_mean = mean(parent_time_0, na.rm = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">423</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.na(parent_time_0_mean)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">424</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini_auto = c(100, rep(0, length(mkinmod$diffs) - 1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">425</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">426</td> + <td class="coverage">8527<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini_auto = c(parent_time_0_mean, rep(0, length(mkinmod$diffs) - 1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">427</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">428</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(state.ini_auto) <- mod_vars</pre> + </td> + </tr> + <tr class="never"> + <td class="num">429</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">430</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (state.ini[1] == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">431</td> + <td class="coverage">8316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini_used <- state.ini_auto</pre> + </td> + </tr> + <tr class="never"> + <td class="num">432</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">433</td> + <td class="coverage">213<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini_used <- state.ini_auto</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">434</td> + <td class="coverage">213<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini_good <- intersect(names(mkinmod$diffs), names(state.ini))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">435</td> + <td class="coverage">213<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini_used[state.ini_good] <- state.ini[state.ini_good]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">436</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">437</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini <- state.ini_used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">438</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">439</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Name the inital state variable values if they are not named yet</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">440</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if(is.null(names(state.ini))) names(state.ini) <- mod_vars</pre> + </td> + </tr> + <tr class="never"> + <td class="num">441</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">442</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transform initial parameter values for fitting</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">443</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms.ini <- transform_odeparms(parms.ini, mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">444</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">445</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">446</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">447</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Parameters to be optimised:</pre> + </td> + </tr> + <tr class="never"> + <td class="num">448</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Kinetic parameters in parms.ini whose names are not in fixed_parms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">449</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.fixed <- parms.ini[fixed_parms]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">450</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.optim <- parms.ini[setdiff(names(parms.ini), fixed_parms)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">451</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">452</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms.fixed <- transform_odeparms(parms.fixed, mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">453</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">454</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">455</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms.optim <- transform_odeparms(parms.optim, mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">456</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">457</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">458</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">459</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Inital state variables in state.ini whose names are not in fixed_initials</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">460</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini.fixed <- state.ini[fixed_initials]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">461</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini.optim <- state.ini[setdiff(names(state.ini), fixed_initials)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">462</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">463</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Preserve names of state variables before renaming initial state variable</pre> + </td> + </tr> + <tr class="never"> + <td class="num">464</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">465</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini.optim.boxnames <- names(state.ini.optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">466</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini.fixed.boxnames <- names(state.ini.fixed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">467</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(length(state.ini.optim) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">468</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(state.ini.optim) <- paste(names(state.ini.optim), "0", sep="_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">469</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">470</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(length(state.ini.fixed) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">471</td> + <td class="coverage">4509<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(state.ini.fixed) <- paste(names(state.ini.fixed), "0", sep="_")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">472</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">473</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">474</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Decide if the solution of the model can be based on a simple analytical</pre> + </td> + </tr> + <tr class="never"> + <td class="num">475</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # formula, the spectral decomposition of the matrix (fundamental system)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">476</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # or a numeric ode solver from the deSolve package</pre> + </td> + </tr> + <tr class="never"> + <td class="num">477</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Prefer deSolve over eigen if a compiled model is present and use_compiled</pre> + </td> + </tr> + <tr class="never"> + <td class="num">478</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # is not set to FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">479</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = match.arg(solution_type)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">480</td> + <td class="coverage">8529<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "analytical" && !is.function(mkinmod$deg_func))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">481</td> + <td class="coverage">105<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Analytical solution not implemented for this model.")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">482</td> + <td class="coverage">8424<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "eigen" && !is.matrix(mkinmod$coefmat))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">483</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Eigenvalue based solution not possible, coefficient matrix not present.")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">484</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">485</td> + <td class="coverage">6190<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(mkinmod$spec) == 1 || is.function(mkinmod$deg_func)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">486</td> + <td class="coverage">5434<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = "analytical"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">487</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">488</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(mkinmod$cf) & use_compiled[1] != FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">489</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = "deSolve"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">490</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">491</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.matrix(mkinmod$coefmat)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">492</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = "eigen"</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">493</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (max(observed$value, na.rm = TRUE) < 0.1) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">494</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("The combination of small observed values (all < 0.1) and solution_type = eigen is error-prone")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">495</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">496</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">497</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = "deSolve"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">498</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">499</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">500</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">501</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">502</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">503</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get native symbol before iterations info for speed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">504</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_symbols = FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">505</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "deSolve" & use_compiled[1] != FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">506</td> + <td class="coverage">2144<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinmod[["symbols"]] <- try(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">507</td> + <td class="coverage">2144<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> deSolve::checkDLL(dllname = mkinmod$dll_info[["name"]],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">508</td> + <td class="coverage">2144<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> func = "diffs", initfunc = "initpar",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">509</td> + <td class="coverage">2144<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> jacfunc = NULL, nout = 0, outnames = NULL))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">510</td> + <td class="coverage">2144<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!inherits(mkinmod[["symbols"]], "try-error")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">511</td> + <td class="coverage">2144<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_symbols = TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">512</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">513</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">514</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">515</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get the error model and the algorithm for fitting</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">516</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> err_mod <- match.arg(error_model)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">517</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model_algorithm = match.arg(error_model_algorithm)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">518</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm == "OLS") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">519</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod != "const") stop("OLS is only appropriate for constant variance")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">520</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">521</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">522</td> + <td class="coverage">6692<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model_algorithm = switch(err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">523</td> + <td class="coverage">6692<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> const = "OLS", obs = "d_3", tc = "d_3")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">524</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">525</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparm_names <- switch(err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">526</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "const" = "sigma",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">527</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "obs" = paste0("sigma_", obs_vars),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">528</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "tc" = c("sigma_low", "rsd_high"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">529</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparm_names_optim <- if (error_model_algorithm == "OLS") NULL else errparm_names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">530</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">531</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define starting values for the error model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">532</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err.ini[1] != "auto") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">533</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!identical(names(err.ini), errparm_names)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">534</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Please supply initial values for error model components ", paste(errparm_names, collapse = ", "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">535</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">536</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> errparms = err.ini</pre> + </td> + </tr> + <tr class="never"> + <td class="num">537</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">538</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">539</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "const") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">540</td> + <td class="coverage">6410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms = 3</pre> + </td> + </tr> + <tr class="never"> + <td class="num">541</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">542</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "obs") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">543</td> + <td class="coverage">317<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms = rep(3, length(obs_vars))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">544</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">545</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "tc") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">546</td> + <td class="coverage">1593<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms <- c(sigma_low = 0.1, rsd_high = 0.1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">547</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">548</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(errparms) <- errparm_names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">549</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">550</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm == "OLS") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">551</td> + <td class="coverage">6410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms_optim <- NULL</pre> + </td> + </tr> + <tr class="never"> + <td class="num">552</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">553</td> + <td class="coverage">1910<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms_optim <- errparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">554</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">555</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">556</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Unique outtimes for model solution.</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">557</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes <- sort(unique(observed$time))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">558</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">559</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define the objective function for optimisation, including (back)transformations</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">560</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_function <- function(P, trans = TRUE, OLS = FALSE, fixed_degparms = FALSE, fixed_errparms = FALSE, update_data = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">561</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">562</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> assign("calls", calls + 1, inherits = TRUE) # Increase the model solution counter</pre> + </td> + </tr> + <tr class="never"> + <td class="num">563</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">564</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #browser()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">565</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">566</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Trace parameter values if requested and if we are actually optimising</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">567</td> + <td class="coverage">3224<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(trace_parms & update_data) cat(format(P, width = 10, digits = 6), "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">568</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">569</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Determine local parameter values for the cost estimation</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">570</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.numeric(fixed_degparms)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">571</td> + <td class="coverage">94746<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_degparms <- fixed_degparms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">572</td> + <td class="coverage">94746<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_errparms <- P</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">573</td> + <td class="coverage">94746<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_fixed = TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">574</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">575</td> + <td class="coverage">3991822<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_fixed = FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">576</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">577</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">578</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.numeric(fixed_errparms)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">579</td> + <td class="coverage">4725<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_degparms <- P</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">580</td> + <td class="coverage">4725<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_errparms <- fixed_errparms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">581</td> + <td class="coverage">4725<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms_fixed = TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">582</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">583</td> + <td class="coverage">4081843<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms_fixed = FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">584</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">585</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">586</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (OLS) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">587</td> + <td class="coverage">1063145<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_degparms <- P</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">588</td> + <td class="coverage">1063145<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_errparms <- numeric(0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">589</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">590</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">591</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!OLS & !degparms_fixed & !errparms_fixed) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">592</td> + <td class="coverage">2923952<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_degparms <- P[1:(length(P) - length(errparms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">593</td> + <td class="coverage">2923952<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost_errparms <- P[(length(cost_degparms) + 1):length(P)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">594</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">595</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">596</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Initial states for t0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">597</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(length(state.ini.optim) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">598</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- c(cost_degparms[1:length(state.ini.optim)], state.ini.fixed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">599</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini) <- c(state.ini.optim.boxnames, state.ini.fixed.boxnames)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">600</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">601</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- state.ini.fixed</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">602</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini) <- state.ini.fixed.boxnames</pre> + </td> + </tr> + <tr class="never"> + <td class="num">603</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">604</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">605</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms.optim <- cost_degparms[(length(state.ini.optim) + 1):length(cost_degparms)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">606</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">607</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (trans == TRUE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">608</td> + <td class="coverage">2580794<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms <- c(odeparms.optim, transparms.fixed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">609</td> + <td class="coverage">2580794<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- backtransform_odeparms(odeparms, mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">610</td> + <td class="coverage">2580794<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">611</td> + <td class="coverage">2580794<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">612</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">613</td> + <td class="coverage">1505774<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- c(odeparms.optim, parms.fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">614</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">615</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">616</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Solve the system with current parameter values</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">617</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "analytical") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">618</td> + <td class="coverage">2562380<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed$predicted <- mkinmod$deg_func(observed, odeini, parms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">619</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">620</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out <- mkinpredict(mkinmod, parms,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">621</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini, outtimes,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">622</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = solution_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">623</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_compiled = use_compiled,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">624</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_symbols = use_symbols,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">625</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> method.ode = method.ode,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">626</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> atol = atol, rtol = rtol,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">627</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">628</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">629</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed_index <- cbind(as.character(observed$time), as.character(observed$name))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">630</td> + <td class="coverage">1524188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed$predicted <- out[observed_index]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">631</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">632</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">633</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define standard deviation for each observation</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">634</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "const") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">635</td> + <td class="coverage">2789021<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed$std <- if (OLS) NA else cost_errparms["sigma"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">636</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">637</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "obs") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">638</td> + <td class="coverage">366137<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> std_names <- paste0("sigma_", observed$name)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">639</td> + <td class="coverage">366137<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed$std <- cost_errparms[std_names]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">640</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">641</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "tc") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">642</td> + <td class="coverage">931410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed$std <- sqrt(cost_errparms["sigma_low"]^2 + observed$predicted^2 * cost_errparms["rsd_high"]^2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">643</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">644</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">645</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Calculate model cost</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">646</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (OLS) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">647</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Cost is the sum of squared residuals</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">648</td> + <td class="coverage">1063145<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost <- with(observed, sum((value - predicted)^2))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">649</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">650</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Cost is the negative log-likelihood</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">651</td> + <td class="coverage">3023423<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost <- - with(observed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">652</td> + <td class="coverage">3023423<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sum(dnorm(x = value, mean = predicted, sd = std, log = TRUE)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">653</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">654</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">655</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We update the current cost and data during the optimisation, not</pre> + </td> + </tr> + <tr class="never"> + <td class="num">656</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # during hessian calculations</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">657</td> + <td class="coverage">4086568<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (update_data) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">658</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">659</td> + <td class="coverage">1622188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> assign("current_data", observed, inherits = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">660</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">661</td> + <td class="coverage">1622188<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (cost < cost.current) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">662</td> + <td class="coverage">594930<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> assign("cost.current", cost, inherits = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">663</td> + <td class="coverage">1768<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message(ifelse(OLS, "Sum of squared residuals", "Negative log-likelihood"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">664</td> + <td class="coverage">1768<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> " at call ", calls, ": ", signif(cost.current, 6), "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">665</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">666</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">667</td> + <td class="coverage">4086415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(cost)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">668</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">669</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">670</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names_optim <- c(names(state.ini.optim),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">671</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(transparms.optim),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">672</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparm_names_optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">673</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_optim <- length(names_optim)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">674</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">675</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define lower and upper bounds other than -Inf and Inf for parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">676</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # for which no internal transformation is requested in the call to mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">677</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # and for optimised error model parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">678</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower <- rep(-Inf, n_optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">679</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper <- rep(Inf, n_optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">680</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(lower) <- names(upper) <- names_optim</pre> + </td> + </tr> + <tr class="never"> + <td class="num">681</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">682</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # IORE exponents are not transformed, but need a lower bound</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">683</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> index_N <- grep("^N", names(lower))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">684</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower[index_N] <- 0</pre> + </td> + </tr> + <tr class="never"> + <td class="num">685</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">686</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!transform_rates) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">687</td> + <td class="coverage">553<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> index_k <- grep("^k_", names(lower))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">688</td> + <td class="coverage">553<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower[index_k] <- 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">689</td> + <td class="coverage">553<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> index_k__iore <- grep("^k__iore_", names(lower))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">690</td> + <td class="coverage">553<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower[index_k__iore] <- 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">691</td> + <td class="coverage">553<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> other_rate_parms <- intersect(c("alpha", "beta", "k1", "k2", "tb", "r"), names(lower))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">692</td> + <td class="coverage">553<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower[other_rate_parms] <- 0</pre> + </td> + </tr> + <tr class="never"> + <td class="num">693</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">694</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">695</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!transform_fractions) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">696</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> index_f <- grep("^f_", names(upper))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">697</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower[index_f] <- 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">698</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper[index_f] <- 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">699</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> other_fraction_parms <- intersect(c("g"), names(upper))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">700</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower[other_fraction_parms] <- 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">701</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper[other_fraction_parms] <- 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">702</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">703</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">704</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "const") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">705</td> + <td class="coverage">6410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm != "OLS") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">706</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> lower["sigma"] <- 0</pre> + </td> + </tr> + <tr class="never"> + <td class="num">707</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">708</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">709</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "obs") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">710</td> + <td class="coverage">317<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> index_sigma <- grep("^sigma_", names(lower))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">711</td> + <td class="coverage">317<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower[index_sigma] <- 0</pre> + </td> + </tr> + <tr class="never"> + <td class="num">712</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">713</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod == "tc") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">714</td> + <td class="coverage">1593<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower["sigma_low"] <- 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">715</td> + <td class="coverage">1593<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower["rsd_high"] <- 0</pre> + </td> + </tr> + <tr class="never"> + <td class="num">716</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">717</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">718</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Counter for cost function evaluations</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">719</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> calls = 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">720</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost.current <- Inf</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">721</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_predicted <- NA</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">722</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> current_data <- NA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">723</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">724</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Show parameter names if tracing is requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">725</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(trace_parms) cat(format(names_optim, width = 10), "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">726</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">727</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #browser()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">728</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">729</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Do the fit and take the time until the hessians are calculated</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">730</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_time <- system.time({</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">731</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- c(state.ini.optim, transparms.optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">732</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_degparms <- length(degparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">733</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms_index <- seq(1, n_degparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">734</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms_index <- seq(n_degparms + 1, length.out = length(errparms))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">735</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">736</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm == "d_3") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">737</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Directly optimising the complete model")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">738</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.start <- c(degparms, errparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">739</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_direct <- try(nlminb(parms.start, cost_function,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">740</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower = lower[names(parms.start)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">741</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = upper[names(parms.start)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">742</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> control = control, ...))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">743</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!inherits(fit_direct, "try-error")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">744</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_direct$logLik <- - cost.current</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">745</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost.current <- Inf # reset to avoid conflict with the OLS step</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">746</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data_direct <- current_data # We need this later if it was better</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">747</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> direct_failed = FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">748</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">749</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> direct_failed = TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">750</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">751</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">752</td> + <td class="coverage">8320<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm != "direct") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">753</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Ordinary least squares optimisation")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">754</td> + <td class="coverage">7884<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit <- nlminb(degparms, cost_function, control = control,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">755</td> + <td class="coverage">7884<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower = lower[names(degparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">756</td> + <td class="coverage">7884<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = upper[names(degparms)], OLS = TRUE, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">757</td> + <td class="coverage">7731<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- fit$par</pre> + </td> + </tr> + <tr class="never"> + <td class="num">758</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">759</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get the maximum likelihood estimate for sigma at the optimum parameter values</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">760</td> + <td class="coverage">7731<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> current_data$residual <- current_data$value - current_data$predicted</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">761</td> + <td class="coverage">7731<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_mle <- sqrt(sum(current_data$residual^2)/nrow(current_data))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">762</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">763</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Use that estimate for the constant variance, or as first guess if err_mod = "obs"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">764</td> + <td class="coverage">7731<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod != "tc") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">765</td> + <td class="coverage">6327<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms[names(errparms)] <- sigma_mle</pre> + </td> + </tr> + <tr class="never"> + <td class="num">766</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">767</td> + <td class="coverage">7731<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$par <- c(fit$par, errparms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">768</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">769</td> + <td class="coverage">7731<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost.current <- cost_function(c(degparms, errparms), OLS = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">770</td> + <td class="coverage">7731<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$logLik <- - cost.current</pre> + </td> + </tr> + <tr class="never"> + <td class="num">771</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">772</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm %in% c("threestep", "fourstep", "d_3")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">773</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Optimising the error model")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">774</td> + <td class="coverage">1096<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit <- nlminb(errparms, cost_function, control = control,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">775</td> + <td class="coverage">1096<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower = lower[names(errparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">776</td> + <td class="coverage">1096<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = upper[names(errparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">777</td> + <td class="coverage">1096<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_degparms = degparms, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">778</td> + <td class="coverage">1096<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms <- fit$par</pre> + </td> + </tr> + <tr class="never"> + <td class="num">779</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">780</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm == "fourstep") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">781</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Optimising the degradation model")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">782</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit <- nlminb(degparms, cost_function, control = control,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">783</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower = lower[names(degparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">784</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = upper[names(degparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">785</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_errparms = errparms, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">786</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- fit$par</pre> + </td> + </tr> + <tr class="never"> + <td class="num">787</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">788</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm %in%</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">789</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> c("direct", "twostep", "threestep", "fourstep", "d_3")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">790</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Optimising the complete model")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">791</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.start <- c(degparms, errparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">792</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit <- nlminb(parms.start, cost_function,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">793</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower = lower[names(parms.start)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">794</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = upper[names(parms.start)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">795</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> control = control, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">796</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- fit$par[degparms_index]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">797</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms <- fit$par[errparms_index]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">798</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$logLik <- - cost.current</pre> + </td> + </tr> + <tr class="never"> + <td class="num">799</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">800</td> + <td class="coverage">1721<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model_algorithm == "d_3") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">801</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_3_messages = c(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">802</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> direct_failed = "Direct fitting failed, results of three-step fitting are returned",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">803</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> same = "Direct fitting and three-step fitting yield approximately the same likelihood",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">804</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> threestep = "Three-step fitting yielded a higher likelihood than direct fitting",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">805</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> direct = "Direct fitting yielded a higher likelihood than three-step fitting")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">806</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (direct_failed) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">807</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message(d_3_messages["direct_failed"])</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">808</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> fit$d_3_message <- d_3_messages["direct_failed"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">809</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">810</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rel_diff <- abs((fit_direct$logLik - fit$logLik))/-mean(c(fit_direct$logLik, fit$logLik))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">811</td> + <td class="coverage">471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (rel_diff < 0.0001) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">812</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message(d_3_messages["same"])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">813</td> + <td class="coverage">240<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$d_3_message <- d_3_messages["same"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">814</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">815</td> + <td class="coverage">231<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (fit$logLik > fit_direct$logLik) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">816</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message(d_3_messages["threestep"])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">817</td> + <td class="coverage">15<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$d_3_message <- d_3_messages["threestep"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">818</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">819</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message(d_3_messages["direct"])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">820</td> + <td class="coverage">216<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit <- fit_direct</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">821</td> + <td class="coverage">216<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$d_3_message <- d_3_messages["direct"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">822</td> + <td class="coverage">216<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- fit$par[degparms_index]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">823</td> + <td class="coverage">216<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms <- fit$par[errparms_index]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">824</td> + <td class="coverage">216<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> current_data <- data_direct</pre> + </td> + </tr> + <tr class="never"> + <td class="num">825</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">826</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">827</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">828</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">829</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">830</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (err_mod != "const" & error_model_algorithm == "IRLS") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">831</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> reweight.diff <- 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">832</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.iter <- 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">833</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms_last <- errparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">834</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">835</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> while (reweight.diff > reweight.tol &</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">836</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.iter < reweight.max.iter) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">837</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">838</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Optimising the error model")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">839</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit <- nlminb(errparms, cost_function, control = control,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">840</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower = lower[names(errparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">841</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = upper[names(errparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">842</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_degparms = degparms, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">843</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms <- fit$par</pre> + </td> + </tr> + <tr class="never"> + <td class="num">844</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">845</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Optimising the degradation model")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">846</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit <- nlminb(degparms, cost_function, control = control,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">847</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower = lower[names(degparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">848</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = upper[names(degparms)],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">849</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_errparms = errparms, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">850</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparms <- fit$par</pre> + </td> + </tr> + <tr class="never"> + <td class="num">851</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">852</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> reweight.diff <- dist(rbind(errparms, errparms_last))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">853</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms_last <- errparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">854</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">855</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$par <- c(fit$par, errparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">856</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost.current <- cost_function(c(degparms, errparms), OLS = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">857</td> + <td class="coverage">756<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$logLik <- - cost.current</pre> + </td> + </tr> + <tr class="never"> + <td class="num">858</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">859</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">860</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">861</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim_hessian <- length(c(degparms, errparms))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">862</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">863</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$hessian <- try(numDeriv::hessian(cost_function, c(degparms, errparms), OLS = FALSE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">864</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_data = FALSE), silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">865</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit$hessian, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">866</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> fit$hessian <- matrix(NA, nrow = dim_hessian, ncol = dim_hessian)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">867</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">868</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(fit$hessian) <- list(names(c(degparms, errparms)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">869</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(c(degparms, errparms)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">870</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">871</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Backtransform parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">872</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparms.optim = backtransform_odeparms(degparms, mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">873</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">874</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">875</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparms.fixed = c(state.ini.fixed, parms.fixed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">876</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparms.all = c(bparms.optim, parms.fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">877</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">878</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$hessian_notrans <- try(numDeriv::hessian(cost_function, c(bparms.optim, errparms),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">879</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> OLS = FALSE, trans = FALSE, update_data = FALSE), silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">880</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit$hessian_notrans, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">881</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> fit$hessian_notrans <- matrix(NA, nrow = dim_hessian, ncol = dim_hessian)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">882</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">883</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(fit$hessian_notrans) <- list(names(c(bparms.optim, errparms)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">884</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(c(bparms.optim, errparms)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">885</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">886</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">887</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$call <- call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">888</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">889</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$error_model_algorithm <- error_model_algorithm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">890</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">891</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (fit$convergence != 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">892</td> + <td class="coverage">108<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> convergence_warning = paste0("Optimisation did not converge:\n", fit$message)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">893</td> + <td class="coverage">108<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> summary_warnings <- c(summary_warnings, C = convergence_warning)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">894</td> + <td class="coverage">108<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> warning(convergence_warning)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">895</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">896</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(!quiet) message("Optimisation successfully terminated.\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">897</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">898</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">899</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We need to return some more data for summary and plotting</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">900</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$solution_type <- solution_type</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">901</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$transform_rates <- transform_rates</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">902</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$transform_fractions <- transform_fractions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">903</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$reweight.tol <- reweight.tol</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">904</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$reweight.max.iter <- reweight.max.iter</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">905</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$control <- control</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">906</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$calls <- calls</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">907</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$time <- fit_time</pre> + </td> + </tr> + <tr class="never"> + <td class="num">908</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">909</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We also need the model and a model name for summary and plotting,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">910</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # but without symbols because they could become invalid</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">911</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$symbols <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">912</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$mkinmod <- mkinmod</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">913</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$mkinmod$name <- mkinmod_name</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">914</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$obs_vars <- obs_vars</pre> + </td> + </tr> + <tr class="never"> + <td class="num">915</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">916</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Residual sum of squares as a function of the fitted parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">917</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$rss <- function(P) cost_function(P, OLS = TRUE, update_data = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">918</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">919</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Log-likelihood with possibility to fix degparms or errparms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">920</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$ll <- function(P, fixed_degparms = FALSE, fixed_errparms = FALSE, trans = FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">921</td> + <td class="coverage">547080<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> - cost_function(P, trans = trans, fixed_degparms = fixed_degparms,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">922</td> + <td class="coverage">547080<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_errparms = fixed_errparms, OLS = FALSE, update_data = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">923</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">924</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">925</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Collect initial parameter values in three dataframes</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">926</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$start <- data.frame(value = c(state.ini.optim,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">927</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.optim, errparms_optim))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">928</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$start$type = c(rep("state", length(state.ini.optim)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">929</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rep("deparm", length(parms.optim)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">930</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rep("error", length(errparms_optim)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">931</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">932</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$start_transformed = data.frame(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">933</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> value = c(state.ini.optim, transparms.optim, errparms_optim),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">934</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower = lower,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">935</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = upper)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">936</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">937</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$fixed <- data.frame(value = c(state.ini.fixed, parms.fixed))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">938</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$fixed$type = c(rep("state", length(state.ini.fixed)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">939</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rep("deparm", length(parms.fixed)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">940</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">941</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$data <- data.frame(time = current_data$time,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">942</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> variable = current_data$name,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">943</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed = current_data$value,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">944</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> predicted = current_data$predicted)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">945</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">946</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$data$residual <- fit$data$observed - fit$data$predicted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">947</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">948</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$atol <- atol</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">949</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$rtol <- rtol</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">950</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$err_mod <- err_mod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">951</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">952</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Return different sets of backtransformed parameters for summary and plotting</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">953</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$bparms.optim <- bparms.optim</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">954</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$bparms.fixed <- bparms.fixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">955</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">956</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Return ode and state parameters for further fitting</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">957</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$bparms.ode <- bparms.all[mkinmod$parms]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">958</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$bparms.state <- c(bparms.all[setdiff(names(bparms.all), names(fit$bparms.ode))],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">959</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini.fixed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">960</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(fit$bparms.state) <- gsub("_0$", "", names(fit$bparms.state))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">961</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">962</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$errparms <- errparms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">963</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$df.residual <- n_observed - length(c(degparms, errparms))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">964</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">965</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Assign the class here so method dispatch works for residuals</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">966</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(fit) <- c("mkinfit")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">967</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">968</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (test_residuals) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">969</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check for normal distribution of residuals</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">970</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$shapiro.p <- shapiro.test(residuals(fit, standardized = TRUE))$p.value</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">971</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (fit$shapiro.p < 0.05) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">972</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> shapiro_warning <- paste("Shapiro-Wilk test for standardized residuals: p = ", signif(fit$shapiro.p, 3))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">973</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> warning(shapiro_warning)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">974</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> summary_warnings <- c(summary_warnings, S = shapiro_warning)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">975</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">976</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">977</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">978</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$summary_warnings <- summary_warnings</pre> + </td> + </tr> + <tr class="never"> + <td class="num">979</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">980</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$date <- date()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">981</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$version <- as.character(utils::packageVersion("mkin"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">982</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$Rversion <- paste(R.version$major, R.version$minor, sep=".")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">983</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">984</td> + <td class="coverage">8167<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">985</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/illparms.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Method to get the names of ill-defined parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The method for generalised nonlinear regression fits as obtained</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' with [mkinfit] and [mmkin] checks if the degradation parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' pass the Wald test (in degradation kinetics often simply called t-test) for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' significant difference from zero. For this test, the parameterisation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' without parameter transformations is used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The method for hierarchical model fits, also known as nonlinear</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mixed-effects model fits as obtained with [saem] and [mhmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' checks if any of the confidence intervals for the random</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' effects expressed as standard deviations include zero, and if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the confidence intervals for the error model parameters include</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' zero.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object The object to investigate</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x The object to be printed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param conf.level The confidence level for checking p values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots For potential future extensions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param random For hierarchical fits, should random effects be tested?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param errmod For hierarchical fits, should error model parameters be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' tested?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param slopes For hierarchical [saem] fits using saemix as backend,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' should slope parameters in the covariate model(starting with 'beta_') be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' tested?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return For [mkinfit] or [saem] objects, a character vector of parameter</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names. For [mmkin] or [mhmkin] objects, a matrix like object of class</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 'illparms.mmkin' or 'illparms.mhmkin'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note All return objects have printing methods. For the single fits, printing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' does not output anything in the case no ill-defined parameters are found.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">illparms <- function(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">34</td> + <td class="coverage">2471<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("illparms", object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname illparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit("FOMC", FOCUS_2006_A, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">illparms.mkinfit <- function(object, conf.level = 0.95, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> p_values <- suppressWarnings(summary(object)$bpar[, "Pr(>t)"])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> na <- is.na(p_values)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> failed <- p_values > 1 - conf.level</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ret <- names(parms(object))[na | failed]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(ret) <- "illparms.mkinfit"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ret)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname illparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.illparms.mkinfit <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">190<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(x) <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">190<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(x) > 0) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">56</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(as.character(x))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname illparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits <- mmkin(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c("SFO", "FOMC"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list("FOCUS A" = FOCUS_2006_A,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "FOCUS C" = FOCUS_2006_C),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(fits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">illparms.mmkin <- function(object, conf.level = 0.95, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- lapply(object,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> function(fit) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">74</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit, "try-error")) return("E")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill <- illparms(fit, conf.level = conf.level)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ill) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(paste(ill, collapse = ", "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return("")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- unlist(result)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(result) <- dim(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(result) <- dimnames(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(result) <- "illparms.mmkin"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname illparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.illparms.mmkin <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(x) <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x, quote = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname illparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">illparms.saem.mmkin <- function(object, conf.level = 0.95, random = TRUE, errmod = TRUE, slopes = TRUE, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(object$so, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">100</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms <- NA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ints <- intervals(object, conf.level = conf.level)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms <- character(0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (random) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms_random_i <- which(ints$random[, "lower"] < 0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms_random <- rownames(ints$random)[ill_parms_random_i]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms <- c(ill_parms, ill_parms_random)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (errmod) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms_errmod_i <- which(ints$errmod[, "lower"] < 0 & ints$errmod[, "upper"] > 0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms_errmod <- rownames(ints$errmod)[ill_parms_errmod_i]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms <- c(ill_parms, ill_parms_errmod)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (slopes) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">115</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(object$so)) stop("Slope testing is only implemented for the saemix backend")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> slope_names <- grep("^beta_", object$so@model@name.fixed, value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ci <- object$so@results@conf.int</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(ci) <- ci$name</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> slope_ci <- ci[slope_names, ]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms_slopes <- slope_ci[, "lower"] < 0 & slope_ci[, "upper"] > 0</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill_parms <- c(ill_parms, slope_names[ill_parms_slopes])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">124</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(ill_parms) <- "illparms.saem.mmkin"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">2091<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ill_parms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname illparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.illparms.saem.mmkin <- print.illparms.mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname illparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">illparms.mhmkin <- function(object, conf.level = 0.95, random = TRUE, errmod = TRUE, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(object[[1]], "saem.mmkin")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> check_failed <- function(x) if (inherits(x$so, "try-error")) TRUE else FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- lapply(object,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> function(fit) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">1484<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (check_failed(fit)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">141</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return("E")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">142</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">1484<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(fit$FIM_failed) &&</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">1484<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "random effects and error model parameters" %in% fit$FIM_failed) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">145</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return("NA")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">1484<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ill <- illparms(fit, conf.level = conf.level, random = random, errmod = errmod)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">1484<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ill) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">1000<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(paste(ill, collapse = ", "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">484<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return("")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">156</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- unlist(result)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">157</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(result) <- dim(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">158</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(result) <- dimnames(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(result) <- "illparms.mhmkin"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">371<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">161</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">162</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname illparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.illparms.mhmkin <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(x) <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x, quote = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/plot.mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables(c("type", "variable", "observed"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Plot the observed data and the fitted model of an mkinfit object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Solves the differential equations with the optimised and fixed parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' from a previous successful call to \code{\link{mkinfit}} and plots the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed data together with the solution of the fitted model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If the current plot device is a \code{\link[tikzDevice]{tikz}} device, then</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' latex is being used for the formatting of the chi2 error level, if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{show_errmin = TRUE}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @aliases plot.mkinfit plot_sep plot_res plot_err</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x Alias for fit introduced for compatibility with the generic S3</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' method.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param fit An object of class \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param obs_vars A character vector of names of the observed variables for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' which the data and the model should be plotted. Defauls to all observed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variables in the model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param xlab Label for the x axis.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ylab Label for the y axis.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param xlim Plot range in x direction.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ylim Plot range in y direction. If given as a list, plot ranges</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for the different plot rows can be given for row layout.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param col_obs Colors used for plotting the observed data and the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' corresponding model prediction lines.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param pch_obs Symbols to be used for plotting the data.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param lty_obs Line types to be used for the model predictions.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param add Should the plot be added to an existing plot?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param legend Should a legend be added to the plot?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param show_residuals Should residuals be shown? If only one plot of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits is shown, the residual plot is in the lower third of the plot.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Otherwise, i.e. if "sep_obs" is given, the residual plots will be located</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to the right of the plots of the fitted curves. If this is set to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 'standardized', a plot of the residuals divided by the standard deviation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' given by the fitted error model will be shown.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param standardized When calling 'plot_res', should the residuals be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' standardized in the residual plot?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param show_errplot Should squared residuals and the error model be shown?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If only one plot of the fits is shown, this plot is in the lower third of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the plot. Otherwise, i.e. if "sep_obs" is given, the residual plots will</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be located to the right of the plots of the fitted curves.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param maxabs Maximum absolute value of the residuals. This is used for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' scaling of the y axis and defaults to "auto".</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param sep_obs Should the observed variables be shown in separate subplots?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If yes, residual plots requested by "show_residuals" will be shown next</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to, not below the plot of the fits.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param rel.height.middle The relative height of the middle plot, if more</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' than two rows of plots are shown.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param row_layout Should we use a row layout where the residual plot or the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' error model plot is shown to the right?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param lpos Position(s) of the legend(s). Passed to \code{\link{legend}} as</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the first argument. If not length one, this should be of the same length</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' as the obs_var argument.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param inset Passed to \code{\link{legend}} if applicable.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param show_errmin Should the FOCUS chi2 error value be shown in the upper</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' margin of the plot?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param errmin_digits The number of significant digits for rounding the FOCUS</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' chi2 error percentage.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param frame Should a frame be drawn around the plots?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further arguments passed to \code{\link{plot}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @import graphics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom grDevices dev.cur</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The function is called for its side effect.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # One parent compound, one metabolite, both single first order, path from</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # parent to sink included</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO <- mkinmod(parent = mkinsub("SFO", "m1", full = "Parent"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO", full = "Metabolite M1" ))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_res(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_res(fit, standardized = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_err(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Show the observed variables separately, with residuals</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fit, sep_obs = TRUE, show_residuals = TRUE, lpos = c("topright", "bottomright"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' show_errmin = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The same can be obtained with less typing, using the convenience function plot_sep</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_sep(fit, lpos = c("topright", "bottomright"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Show the observed variables separately, with the error model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fit, sep_obs = TRUE, show_errplot = TRUE, lpos = c("topright", "bottomright"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' show_errmin = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">plot.mkinfit <- function(x, fit = x,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars = names(fit$mkinmod$map),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = "Time", ylab = "Residue",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = range(fit$data$time),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ylim = "default",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> col_obs = 1:length(obs_vars),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> pch_obs = col_obs,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> lty_obs = rep(1, length(obs_vars)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> add = FALSE, legend = !add,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> show_residuals = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> show_errplot = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> maxabs = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> sep_obs = FALSE, rel.height.middle = 0.9,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> row_layout = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> lpos = "topright", inset = c(0.05, 0.05),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> show_errmin = FALSE, errmin_digits = 3,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> frame = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(show_residuals, "standardized")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">112</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> show_residuals <- TRUE</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">113</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> standardized <- TRUE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> standardized <- FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">118</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (add && show_residuals) stop("If adding to an existing plot we can not show residuals")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">119</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (add && show_errplot) stop("If adding to an existing plot we can not show the error model plot")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">120</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (show_residuals && show_errplot) stop("We can either show residuals over time or the error model plot, not both")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">121</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (add && sep_obs) stop("If adding to an existing plot we can not show observed variables separately")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">124</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = fit$solution_type</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.all <- c(fit$bparms.optim, fit$bparms.fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ininames <- c(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">128</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(subset(fit$start, type == "state")),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(subset(fit$fixed, type == "state")))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- parms.all[ininames]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Order initial state variables</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini) <- sub("_0", "", names(odeini))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- odeini[names(fit$mkinmod$diffs)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes <- seq(xlim[1], xlim[2], length.out=100)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odenames <- c(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(subset(fit$start, type == "deparm")),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(subset(fit$fixed, type == "deparm")))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms <- parms.all[odenames]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">142</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "deSolve" & !is.null(fit$mkinmod$cf)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit$mkinmod[["symbols"]] <- deSolve::checkDLL(dllname = fit$mkinmod$dll_info[["name"]],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> func = "diffs", initfunc = "initpar",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> jacfunc = NULL, nout = 0, outnames = NULL)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out <- mkinpredict(fit$mkinmod, odeparms, odeini, outtimes,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = solution_type, atol = fit$atol, rtol = fit$rtol)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">152</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out <- as.data.frame(out)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">154</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(col_obs) <- names(pch_obs) <- names(lty_obs) <- obs_vars</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Create a plot layout only if not to be added to an existing plot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # or only a single plot is requested (e.g. by plot.mmkin)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">158</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> do_layout = FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">485<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (show_residuals | sep_obs | show_errplot) do_layout = TRUE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_plot_rows = if (sep_obs) length(obs_vars) else 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">161</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (do_layout) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Layout should be restored afterwards</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">164</td> + <td class="coverage">485<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> oldpar <- par(no.readonly = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">165</td> + <td class="coverage">485<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> on.exit(par(oldpar, no.readonly = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">167</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # If the observed variables are shown separately, or if requested, do row layout</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">485<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (sep_obs | row_layout) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row_layout <- TRUE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">170</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_plot_cols = if (show_residuals | show_errplot) 2 else 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_plots = n_plot_rows * n_plot_cols</pre> + </td> + </tr> + <tr class="never"> + <td class="num">172</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">173</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set relative plot heights, so the first and the last plot are the norm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">174</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # and the middle plots (if n_plot_rows >2) are smaller by rel.height.middle</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rel.heights <- if (n_plot_rows > 2) c(1, rep(rel.height.middle, n_plot_rows - 2), 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">176</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else rep(1, n_plot_rows)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> layout_matrix = matrix(1:n_plots,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_plot_rows, n_plot_cols, byrow = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">179</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> layout(layout_matrix, heights = rel.heights)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else { # else show residuals in the lower third to keep compatibility</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> layout(matrix(c(1, 2), 2, 1), heights = c(2, 1.3))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(3, 4, 4, 2) + 0.1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">183</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">184</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">186</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Replicate legend position argument if necessary</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(lpos) == 1) lpos = rep(lpos, n_plot_rows)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">188</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Loop over plot rows</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">190</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (plot_row in 1:n_plot_rows) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row_obs_vars = if (sep_obs) obs_vars[plot_row] else obs_vars</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set ylim to sensible default, or to the specified value</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.list(ylim)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">196</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ylim_row <- ylim[[plot_row]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ylim[[1]] == "default") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylim_row = c(0, max(c(subset(fit$data, variable %in% row_obs_vars)$observed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> unlist(out[row_obs_vars])), na.rm = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">202</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ylim_row = ylim</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">204</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">205</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">206</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (row_layout) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">207</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Margins for top row of plots when we have more than one row</pre> + </td> + </tr> + <tr class="never"> + <td class="num">208</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Reduce bottom margin by 2.1 - hides x axis legend</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (plot_row == 1 & n_plot_rows > 1) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">210</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(3.0, 4.1, 4.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">211</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">212</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Margins for middle rows of plots, if any</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">214</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (plot_row > 1 & plot_row < n_plot_rows) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Reduce top margin by 2 after the first plot as we have no main title,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">216</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # reduced plot height, therefore we need rel.height.middle in the layout</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">217</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(3.0, 4.1, 2.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">218</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">219</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Margins for bottom row of plots when we have more than one row</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">221</td> + <td class="coverage">415<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (plot_row == n_plot_rows & n_plot_rows > 1) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">222</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Restore bottom margin for last plot to show x axis legend</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">223</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(5.1, 4.1, 2.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">224</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">225</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">226</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set up the main plot if not to be added to an existing plot</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (add == FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">229</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(0, type="n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">230</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = xlim, ylim = ylim_row,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">231</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = xlab, ylab = ylab, frame = frame, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">233</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">234</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Plot the data</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs_var in row_obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">236</td> + <td class="coverage">1708<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> points(subset(fit$data, variable == obs_var, c(time, observed)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">1708<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pch = pch_obs[obs_var], col = col_obs[obs_var])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">239</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">240</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Plot the model output</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">241</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> matlines(out$time, out[row_obs_vars], col = col_obs[row_obs_vars], lty = lty_obs[row_obs_vars])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">242</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (legend == TRUE) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">244</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get full names from model definition if they are available</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">245</td> + <td class="coverage">695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend_names = lapply(row_obs_vars, function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">246</td> + <td class="coverage">900<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(fit$mkinmod$spec[[x]]$full_name))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">247</td> + <td class="coverage">410<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.na(fit$mkinmod$spec[[x]]$full_name)) x</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">248</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> else fit$mkinmod$spec[[x]]$full_name</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">249</td> + <td class="coverage">490<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else x</pre> + </td> + </tr> + <tr class="never"> + <td class="num">250</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">251</td> + <td class="coverage">695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend(lpos[plot_row], inset= inset, legend = legend_names,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">252</td> + <td class="coverage">695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col = col_obs[row_obs_vars], pch = pch_obs[row_obs_vars], lty = lty_obs[row_obs_vars])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">253</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">254</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">255</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Show chi2 error value if requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">256</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (show_errmin) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">257</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(row_obs_vars) == 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">258</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errmin_var = row_obs_vars</pre> + </td> + </tr> + <tr class="never"> + <td class="num">259</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">260</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> errmin_var = "All data"</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">261</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(row_obs_vars) != length(fit$mkinmod$map)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">262</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> warning("Showing chi2 error level for all data, but only ",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">263</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> row_obs_vars, " were selected for plotting")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">264</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">265</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">266</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">267</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> chi2 <- signif(100 * mkinerrmin(fit)[errmin_var, "err.min"], errmin_digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">268</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Use LateX if the current plotting device is tikz</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">269</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (names(dev.cur()) == "tikz output") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">270</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> chi2_text <- paste0("$\\chi^2$ error level = ", chi2, "\\%")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">271</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">272</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> chi2_perc <- paste0(chi2, "%")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">273</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> chi2_text <- bquote(chi^2 ~ "error level" == .(chi2_perc))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">274</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">275</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mtext(chi2_text, cex = 0.7, line = 0.4)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">276</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">277</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">278</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (do_layout & !row_layout) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">279</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(5, 4, 0, 2) + 0.1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">280</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">281</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">282</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Show residuals if requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">283</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (show_residuals) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">284</td> + <td class="coverage">280<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinresplot(fit, obs_vars = row_obs_vars, standardized = standardized,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">285</td> + <td class="coverage">280<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pch_obs = pch_obs[row_obs_vars], col_obs = col_obs[row_obs_vars],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">286</td> + <td class="coverage">280<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend = FALSE, frame = frame, xlab = xlab, xlim = xlim, maxabs = maxabs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">287</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">288</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">289</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Show error model plot if requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">290</td> + <td class="coverage">1503<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (show_errplot) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">291</td> + <td class="coverage">205<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinerrplot(fit, obs_vars = row_obs_vars,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">292</td> + <td class="coverage">205<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pch_obs = pch_obs[row_obs_vars], col_obs = col_obs[row_obs_vars],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">293</td> + <td class="coverage">205<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend = FALSE, frame = frame)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">294</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">295</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">296</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">297</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">298</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname plot.mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">299</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">300</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">plot_sep <- function(fit, show_errmin = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">301</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> show_residuals = ifelse(identical(fit$err_mod, "const"), TRUE, "standardized"), ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">302</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot.mkinfit(fit, sep_obs = TRUE, show_residuals = show_residuals,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">303</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> show_errmin = show_errmin, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">304</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">305</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">306</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname plot.mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">307</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">308</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">plot_res <- function(fit, sep_obs = FALSE, show_errmin = sep_obs,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">309</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> standardized = ifelse(identical(fit$err_mod, "const"), FALSE, TRUE), ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">310</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">311</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot.mkinfit(fit, sep_obs = sep_obs, show_errmin = show_errmin,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">312</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> show_residuals = ifelse(standardized, "standardized", TRUE),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">313</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row_layout = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">314</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">315</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">316</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname plot.mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">317</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">318</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">plot_err <- function(fit, sep_obs = FALSE, show_errmin = sep_obs, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">319</td> + <td class="coverage">205<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot.mkinfit(fit, sep_obs = sep_obs, show_errmin = show_errmin,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">320</td> + <td class="coverage">205<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> show_errplot = TRUE, row_layout = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">321</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">322</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">323</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Plot the observed data and the fitted model of an mkinfit object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">324</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">325</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Deprecated function. It now only calls the plot method</pre> + </td> + </tr> + <tr class="never"> + <td class="num">326</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{plot.mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">327</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">328</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param fit an object of class \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">329</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots further arguments passed to \code{\link{plot.mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">330</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The function is called for its side effect.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">331</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">332</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">333</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinplot <- function(fit, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">334</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">335</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> plot(fit, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">336</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mixed.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Create a mixed effects model from an mmkin row object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom rlang !!!</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An [mmkin] row object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param method The method to be used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Currently not used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An object of class 'mixed.mmkin' which has the observed data in a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' single dataframe which is convenient for plotting</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' n_biphasic <- 8</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' err_1 = list(const = 1, prop = 0.07)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' DFOP_SFO <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("DFOP", "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set.seed(123456)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' log_sd <- 0.3</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' syn_biphasic_parms <- as.matrix(data.frame(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k1 = rlnorm(n_biphasic, log(0.05), log_sd),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k2 = rlnorm(n_biphasic, log(0.01), log_sd),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' g = plogis(rnorm(n_biphasic, 0, log_sd)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_parent_to_m1 = plogis(rnorm(n_biphasic, 0, log_sd)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k_m1 = rlnorm(n_biphasic, log(0.002), log_sd)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_biphasic_mean <- lapply(1:n_biphasic,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' function(i) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(DFOP_SFO, syn_biphasic_parms[i, ],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100, m1 = 0), sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set.seed(123456L)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_biphasic <- lapply(ds_biphasic_mean, function(ds) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' add_err(ds,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sdfunc = function(value) sqrt(err_1$const^2 + value^2 * err_1$prop^2),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' n = 1, secondary = "m1")[[1]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mmkin <- mmkin(list("DFOP-SFO" = DFOP_SFO), ds_biphasic, error_model = "tc", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mixed <- mixed(f_mmkin)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(f_mixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_mixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mixed <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("mixed")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mixed.mmkin <- function(object, method = c("none"), ...) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">57</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(object) > 1) stop("Only row objects allowed")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> method <- match.arg(method)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_names <- colnames(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- list(mmkin = object, mkinmod = object[[1]]$mkinmod)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (method[1] == "none") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_list <- lapply(object,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> function(x) x$data[c("variable", "time", "observed", "predicted", "residual")])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(ds_list) <- ds_names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res$data <- vctrs::vec_rbind(!!!ds_list, .names_to = "ds")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(res$data)[1:4] <- c("ds", "name", "time", "value")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res$data$name <- as.character(res$data$name)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res$data$ds <- ordered(res$data$ds, levels = unique(res$data$ds))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> standardized <- unlist(lapply(object, residuals, standardized = TRUE))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res$data$std <- res$data$residual / standardized</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res$data$standardized <- standardized</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(res) <- c("mixed.mmkin")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x A mixed.mmkin object to print</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits Number of digits to use for printing.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.mixed.mmkin <- function(x, digits = max(3, getOption("digits") - 3), ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Kinetic model fitted by nonlinear regression to each dataset" )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStructural model:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs <- x$mmkin[[1]]$mkinmod$diffs</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nice_diffs <- gsub("^(d.*) =", "\\1/dt =", diffs)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> writeLines(strwrap(nice_diffs, exdent = 11))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nData:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(nrow(x$data), "observations of",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$name)), "variable(s) grouped in",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$ds)), "datasets\n\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$mmkin, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nMean fitted parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(mean_degparms(x$mmkin), digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> invisible(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/parms.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Extract model parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function returns degradation model parameters as well as error</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model parameters per default, in order to avoid working with a fitted model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' without considering the error structure that was assumed for the fit.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object A fitted model object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Not used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return Depending on the object, a numeric vector of fitted model parameters,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a matrix (e.g. for mmkin row objects), or a list of matrices (e.g. for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mmkin objects with more than one row).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso [saem], [multistart]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # mkinfit objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit("SFO", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fit, transformed = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # mmkin objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds <- lapply(experimental_data_for_UBA_2019[6:10],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' function(x) subset(x$data[c("name", "time", "value")]))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(ds) <- paste("Dataset", 6:10)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits <- mmkin(c("SFO", "FOMC", "DFOP"), ds, quiet = TRUE, cores = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fits["SFO", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fits[, 2])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fits, transformed = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">parms <- function(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">91384<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("parms", object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param transformed Should the parameters be returned as used internally</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' during the optimisation?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param errparms Should the error model parameters be returned</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in addition to the degradation parameters?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname parms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">parms.mkinfit <- function(object, transformed = FALSE, errparms = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">88039<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- if (transformed) object$par</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">88039<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else c(object$bparms.optim, object$errparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">88039<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!errparms) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">3000<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res[setdiff(names(res), names(object$errparms))]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">85039<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname parms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">parms.mmkin <- function(object, transformed = FALSE, errparms = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">265<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(object) == 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">265<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- sapply(object, parms, transformed = transformed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">265<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms = errparms, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">265<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(res) <- colnames(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">61</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> res <- list()</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">62</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 1:nrow(object)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">63</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> res[[i]] <- parms(object[i, ], transformed = transformed,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">64</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> errparms = errparms, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">66</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> names(res) <- rownames(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">265<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param exclude_failed For [multistart] objects, should rows for failed fits</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be removed from the returned parameter matrix?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname parms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">parms.multistart <- function(object, exclude_failed = TRUE, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- t(sapply(object, parms))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> successful <- which(!is.na(res[, 1]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> first_success <- successful[1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(res) <- names(parms(object[[first_success]]))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">80</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (exclude_failed[1]) res <- res[successful, ]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Fit one or more kinetic models with one or more state variables to one or</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' more datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function calls \code{\link{mkinfit}} on all combinations of models and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' datasets specified in its first two arguments.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param models Either a character vector of shorthand names like</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{c("SFO", "FOMC", "DFOP", "HS", "SFORB")}, or an optionally named</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list of \code{\link{mkinmod}} objects.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param datasets An optionally named list of datasets suitable as observed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' data for \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cores The number of cores to be used for multicore processing. This</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is only used when the \code{cluster} argument is \code{NULL}. On Windows</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' machines, cores > 1 is not supported, you need to use the \code{cluster}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' argument to use multiple logical processors. Per default, all cores</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' detected by [parallel::detectCores()] are used, except on Windows where</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the default is 1.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cluster A cluster as returned by \code{\link{makeCluster}} to be used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for parallel execution.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further arguments that will be passed to \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom parallel mclapply parLapply detectCores</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A two-dimensional \code{\link{array}} of \code{\link{mkinfit}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' objects and/or try-errors that can be indexed using the model names for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' first index (row index) and the dataset names for the second index (column</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' index).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso \code{\link{[.mmkin}} for subsetting, \code{\link{plot.mmkin}} for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plotting.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @keywords optimize</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_synth_SFO_lin <- mkinmod(parent = mkinsub("SFO", "M1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M1 = mkinsub("SFO", "M2"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M2 = mkinsub("SFO"), use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_synth_FOMC_lin <- mkinmod(parent = mkinsub("FOMC", "M1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M1 = mkinsub("SFO", "M2"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M2 = mkinsub("SFO"), use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' models <- list(SFO_lin = m_synth_SFO_lin, FOMC_lin = m_synth_FOMC_lin)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' datasets <- lapply(synthetic_data_for_UBA_2014[1:3], function(x) x$data)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(datasets) <- paste("Dataset", 1:3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' time_default <- system.time(fits.0 <- mmkin(models, datasets, quiet = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' time_1 <- system.time(fits.4 <- mmkin(models, datasets, cores = 1, quiet = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' time_default</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' time_1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(fits.0[["SFO_lin", 2]])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # plot.mkinfit handles rows or columns of mmkin result objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits.0[1, ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits.0[1, ], obs_var = c("M1", "M2"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits.0[, 1])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Use double brackets to extract a single mkinfit object, which will be plotted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # by plot.mkinfit and can be plotted using plot_sep</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits.0[[1, 1]], sep_obs = TRUE, show_residuals = TRUE, show_errmin = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_sep(fits.0[[1, 1]])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Plotting with mmkin (single brackets, extracting an mmkin object) does not</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # allow to plot the observed variables separately</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits.0[1, 1])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # On Windows, we can use multiple cores by making a cluster first</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cl <- parallel::makePSOCKcluster(12)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mmkin(c("SFO", "FOMC", "DFOP"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list(A = FOCUS_2006_A, B = FOCUS_2006_B, C = FOCUS_2006_C, D = FOCUS_2006_D),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cluster = cl, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(f)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We get false convergence for the FOMC fit to FOCUS_2006_A because this</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # dataset is really SFO, and the FOMC fit is overparameterised</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parallel::stopCluster(cl)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mmkin <- function(models = c("SFO", "FOMC", "DFOP"), datasets,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> cores = if (Sys.info()["sysname"] == "Windows") 1 else parallel::detectCores(), cluster = NULL, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">4032<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- match.call()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">4032<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_models_available = c("SFO", "FOMC", "DFOP", "HS", "SFORB", "IORE", "logistic")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">4032<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.m <- length(models)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">4032<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.d <- length(datasets)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">4032<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.fits <- n.m * n.d</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">4032<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_indices <- matrix(1:n.fits, ncol = n.d)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check models and define their names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">4032<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!all(sapply(models, function(x) inherits(x, "mkinmod")))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">2323<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!all(models %in% parent_models_available)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">50<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Please supply models as a list of mkinmod objects or a vector combined of\n ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">50<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste(parent_models_available, collapse = ", "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">2273<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(models) <- models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">1087<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(names(models))) names(models) <- as.character(1:n.m)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check datasets and define their names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">1575<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(names(datasets))) names(datasets) <- as.character(1:n.d)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Define names for fit index</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">3982<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(fit_indices) <- list(model = names(models),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">3982<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dataset = names(datasets))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">3982<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_function <- function(fit_index) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">793<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> w <- which(fit_indices == fit_index, arr.ind = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">793<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_index <- w[1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">793<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dataset_index <- w[2]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">793<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- try(mkinfit(models[[model_index]], datasets[[dataset_index]], ...))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">793<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!inherits(res, "try-error")) res$mkinmod$name <- names(models)[model_index]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">793<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">3982<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_time <- system.time({</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">3982<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(cluster)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">2154<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> results <- parallel::mclapply(as.list(1:n.fits), fit_function,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">2154<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mc.cores = cores, mc.preschedule = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">1828<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> results <- parallel::parLapply(cluster, as.list(1:n.fits), fit_function)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">3798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attributes(results) <- attributes(fit_indices)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">126</td> + <td class="coverage">3798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(results, "call") <- call</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">3798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(results, "time") <- fit_time</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">128</td> + <td class="coverage">3798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(results) <- "mmkin"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">3798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(results)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Subsetting method for mmkin objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An \code{\link{mmkin} object}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param i Row index selecting the fits for specific models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param j Column index selecting the fits to specific datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ... Not used, only there to satisfy the generic method definition</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param drop If FALSE, the method always returns an mmkin object, otherwise</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' either a list of mkinfit objects or a single mkinfit object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An object of class \code{\link{mmkin}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">142</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname Extract.mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">144</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Only use one core, to pass R CMD check --as-cran</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits <- mmkin(c("SFO", "FOMC"), list(B = FOCUS_2006_B, C = FOCUS_2006_C),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cores = 1, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits["FOMC", ]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits[, "B"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits["SFO", "B"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' head(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # This extracts an mkinfit object with lots of components</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits[["FOMC", "B"]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">`[.mmkin` <- function(x, i, j, ..., drop = FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">158</td> + <td class="coverage">2760<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(x) <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">2760<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> x_sub <- x[i, j, drop = drop]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">2760<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!drop) class(x_sub) <- "mmkin"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">2760<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(x_sub)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">162</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Print method for mmkin objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An [mmkin] object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">167</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Not used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">169</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.mmkin <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("<mmkin> object\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Status of individual fits:\n\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">375<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(status(x))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">174</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">175</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">177</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">update.mmkin <- function(object, ..., evaluate = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">178</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">179</td> + <td class="coverage">256<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- attr(object, "call")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">256<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments <- match.call(expand.dots = FALSE)$...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">182</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">256<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(update_arguments) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">256<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_in_call <- !is.na(match(names(update_arguments), names(call)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">186</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">256<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (a in names(update_arguments)[update_arguments_in_call]) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">115<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call[[a]] <- update_arguments[[a]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">191</td> + <td class="coverage">256<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_not_in_call <- !update_arguments_in_call</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">256<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(any(update_arguments_not_in_call)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">193</td> + <td class="coverage">206<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- c(as.list(call), update_arguments[update_arguments_not_in_call])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">194</td> + <td class="coverage">206<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- as.call(call)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">195</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">196</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">197</td> + <td class="coverage">256<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(evaluate) eval(call, parent.frame())</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">198</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> else call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">199</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinpredict.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Produce predictions from a kinetic model using specific parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function produces a time series for all the observed variables in a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' kinetic model as specified by [mkinmod], using a specific set of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' kinetic parameters and initial values for the state variables.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @aliases mkinpredict mkinpredict.mkinmod mkinpredict.mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x A kinetic model as produced by [mkinmod], or a kinetic fit as</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fitted by [mkinfit]. In the latter case, the fitted parameters are used for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the prediction.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param odeparms A numeric vector specifying the parameters used in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' kinetic model, which is generally defined as a set of ordinary differential</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' equations.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param odeini A numeric vector containing the initial values of the state</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variables of the model. Note that the state variables can differ from the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed variables, for example in the case of the SFORB model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param outtimes A numeric vector specifying the time points for which model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' predictions should be generated.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param solution_type The method that should be used for producing the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' predictions. This should generally be "analytical" if there is only one</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed variable, and usually "deSolve" in the case of several observed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variables. The third possibility "eigen" is fast in comparison to uncompiled</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ODE models, but not applicable to some models, e.g. using FOMC for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent compound.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param method.ode The solution method passed via [mkinpredict] to [ode]] in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' case the solution type is "deSolve" and we are not using compiled code.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' When using compiled code, only lsoda is supported.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param use_compiled If set to \code{FALSE}, no compiled version of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [mkinmod] model is used, even if is present.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param use_symbols If set to \code{TRUE} (default), symbol info present in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the [mkinmod] object is used if available for accessing compiled code</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param atol Absolute error tolerance, passed to the ode solver.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param rtol Absolute error tolerance, passed to the ode solver.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param maxsteps Maximum number of steps, passed to the ode solver.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param map_output Boolean to specify if the output should list values for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the observed variables (default) or for all state variables (if set to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FALSE). Setting this to FALSE has no effect for analytical solutions,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' as these always return mapped output.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param na_stop Should it be an error if [ode] returns NaN values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further arguments passed to the ode solver in case such a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solver is used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A matrix with the numeric solution in wide format</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO <- mkinmod(degradinol = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Compare solution types</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "analytical")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "deSolve")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "deSolve", use_compiled = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "eigen")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Compare integration methods to analytical solution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "analytical")[21,]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' method = "lsoda", use_compiled = FALSE)[21,]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' method = "ode45", use_compiled = FALSE)[21,]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' method = "rk4", use_compiled = FALSE)[21,]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # rk4 is not as precise here</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The number of output times used to make a lot of difference until the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # default for atol was adjusted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' seq(0, 20, by = 0.1))[201,]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' seq(0, 20, by = 0.01))[2001,]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Comparison of the performance of solution types</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO = mkinmod(parent = list(type = "SFO", to = "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = list(type = "SFO"), use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if(require(rbenchmark)) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' benchmark(replications = 10, order = "relative", columns = c("test", "relative", "elapsed"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' eigen = mkinpredict(SFO_SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100, m1 = 0), seq(0, 20, by = 0.1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "eigen")[201,],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' deSolve_compiled = mkinpredict(SFO_SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100, m1 = 0), seq(0, 20, by = 0.1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "deSolve")[201,],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' deSolve = mkinpredict(SFO_SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100, m1 = 0), seq(0, 20, by = 0.1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "deSolve", use_compiled = FALSE)[201,],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' analytical = mkinpredict(SFO_SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100, m1 = 0), seq(0, 20, by = 0.1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "analytical", use_compiled = FALSE)[201,])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Predict from a fitted model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mkinfit(SFO_SFO, FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mkinfit(SFO_SFO, FOCUS_2006_C, quiet = TRUE, solution_type = "deSolve")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' head(mkinpredict(f))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinpredict <- function(x, odeparms, odeini, outtimes, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("mkinpredict", x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mkinpredict</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinpredict.mkinmod <- function(x,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms = c(k_parent_sink = 0.1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini = c(parent = 100),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes = seq(0, 120, by = 0.1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = "deSolve",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> use_compiled = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> use_symbols = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> method.ode = "lsoda", atol = 1e-8, rtol = 1e-10, maxsteps = 20000L,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> map_output = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> na_stop = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Names of state variables and observed variables</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mod_vars <- names(x$diffs)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">128</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars <- names(x$spec)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Order the inital values for state variables if they are named</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(names(odeini))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- odeini[mod_vars]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_obs <- matrix(NA, nrow = length(outtimes), ncol = 1 + length(obs_vars),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list(as.character(outtimes), c("time", obs_vars)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_obs[, "time"] <- outtimes</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_out_na <- 0 # to check if we get NA values with deSolve</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">47544878<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "analytical") {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">142</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # This is clumsy, as we wanted fast analytical predictions for mkinfit,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # which bypasses mkinpredict in the case of analytical solutions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">1843695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pseudo_observed <-</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">1843695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data.frame(name = rep(obs_vars, each = length(outtimes)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">1843695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> time = rep(outtimes, length(obs_vars)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">1843695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pseudo_observed$predicted <- x$deg_func(pseudo_observed, odeini, odeparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">1843695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs_var in obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">2431585<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_obs[, obs_var] <- pseudo_observed[pseudo_observed$name == obs_var, "predicted"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We don't have solutions for unobserved state variables, the output of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # analytical solutions is always mapped to observed variables</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">153</td> + <td class="coverage">1843695<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(out_obs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">156</td> + <td class="coverage">45701183<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "eigen") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">157</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> evalparse <- function(string) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">158</td> + <td class="coverage">392283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> eval(parse(text=string), as.list(c(odeparms, odeini)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">160</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> coefmat.num <- matrix(sapply(as.vector(x$coefmat), evalparse),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nrow = length(mod_vars))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> e <- eigen(coefmat.num)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">164</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> c <- solve(e$vectors, odeini)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">165</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f.out <- function(t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">1085040<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> e$vectors %*% diag(exp(e$values * t), nrow=length(mod_vars)) %*% c</pre> + </td> + </tr> + <tr class="never"> + <td class="num">167</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> o <- matrix(mapply(f.out, outtimes),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nrow = length(mod_vars), ncol = length(outtimes))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">170</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out <- cbind(outtimes, t(o))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">97082<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(out) <- c("time", mod_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">172</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">173</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">45701183<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (solution_type == "deSolve") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">45604101<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$cf) & use_compiled[1] != FALSE) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$symbols) & use_symbols) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">1427314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lsoda_func <- x$symbols</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">180</td> + <td class="coverage">44175921<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lsoda_func <- "diffs"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">181</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">182</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out <- deSolve::lsoda(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> y = odeini,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">185</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> times = outtimes,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">186</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> func = lsoda_func,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> initfunc = "initpar",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dllname = x$dll_info[["name"]],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">189</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms = odeparms[x$parms], # Order matters when using compiled models</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">190</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> atol = atol,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">191</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rtol = rtol,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> maxsteps = maxsteps,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">195</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">45603235<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(out) <- c("time", mod_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkindiff <- function(t, state, parms) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">199</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">145229<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> time <- t</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">201</td> + <td class="coverage">145229<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs <- vector()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">202</td> + <td class="coverage">145229<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (box in names(x$diffs))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">145229<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffname <- paste("d", box, sep="_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">145229<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs[diffname] <- with(as.list(c(time, state, parms)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">206</td> + <td class="coverage">145229<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> eval(parse(text=x$diffs[[box]])))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">207</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">145229<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(list(c(diffs)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">209</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">210</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out <- deSolve::ode(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">211</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> y = odeini,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">212</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> times = outtimes,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">213</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> func = mkindiff,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">214</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms = odeparms,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">215</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> method = method.ode,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">216</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> atol = atol,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rtol = rtol,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">218</td> + <td class="coverage">866<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> maxsteps = maxsteps,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">219</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">45604101<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_out_na <- sum(is.na(out))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">45604101<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (n_out_na > 0 & na_stop) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">224</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("odeini:\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">225</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(odeini)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">226</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("odeparms:\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">227</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(odeparms)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">228</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("out:\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">229</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(out)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">230</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Differential equations were not integrated for all output times because\n",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">231</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> n_out_na, " NaN values occurred in output from ode()")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">233</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">234</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">45701183<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (map_output) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">236</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Output transformation for models with unobserved compartments like SFORB</pre> + </td> + </tr> + <tr class="never"> + <td class="num">237</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # if not already mapped in analytical solution</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">238</td> + <td class="coverage">45701183<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (n_out_na > 0 & !na_stop) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">239</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> available <- c(TRUE, rep(FALSE, length(outtimes) - 1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">240</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">241</td> + <td class="coverage">45701183<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> available <- rep(TRUE, length(outtimes))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">242</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">45701183<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (var in names(x$map)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">244</td> + <td class="coverage">93237433<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if((length(x$map[[var]]) == 1)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">245</td> + <td class="coverage">93235081<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_obs[available, var] <- out[available, var]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">246</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">247</td> + <td class="coverage">2352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_obs[available, var] <- out[available, x$map[[var]][1]] +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">248</td> + <td class="coverage">2352<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out[available, x$map[[var]][2]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">249</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">250</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">251</td> + <td class="coverage">45701183<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(out_obs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">252</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">253</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(out) <- list(time = as.character(outtimes), c("time", mod_vars))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">254</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return(out)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">255</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">256</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">257</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">258</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mkinpredict</pre> + </td> + </tr> + <tr class="never"> + <td class="num">259</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">260</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinpredict.mkinfit <- function(x,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">261</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms = x$bparms.ode,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">262</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini = x$bparms.state,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">263</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes = seq(0, 120, by = 0.1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">264</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = "deSolve",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">265</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> use_compiled = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">266</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> method.ode = "lsoda", atol = 1e-8, rtol = 1e-10,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">267</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> map_output = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">268</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">269</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> mkinpredict(x$mkinmod, odeparms, odeini, outtimes, solution_type, use_compiled,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">270</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> method.ode, atol, rtol, map_output, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">271</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/anova.saem.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Anova method for saem.mmkin objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Generate an anova object. The method to calculate the BIC is that from the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' saemix package. As in other prominent anova methods, models are sorted by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' number of parameters, and the tests (if requested) are always relative to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the model on the previous line.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An [saem.mmkin] object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ... further such objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param method Method for likelihood calculation: "is" (importance sampling),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "lin" (linear approximation), or "gq" (Gaussian quadrature). Passed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to [saemix::logLik.SaemixObject]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param test Should a likelihood ratio test be performed? If TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the alternative models are tested against the first model. Should</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' only be done for nested models.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param model.names Optional character vector of model names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats anova logLik update pchisq terms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom methods is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom utils capture.output</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return an "anova" data frame; the traditional (S3) result of anova()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">anova.saem.mmkin <- function(object, ...,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> method = c("is", "lin", "gq"), test = FALSE, model.names = NULL)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # The following code is heavily inspired by anova.lmer in the lme4 package</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">26</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mCall <- match.call(expand.dots = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">27</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dots <- list(...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">28</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> method <- match.arg(method)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">30</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> is_model <- sapply(dots, is, "saem.mmkin")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(is_model)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mods <- c(list(object), dots[is_model])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> successful <- sapply(mods, function(x) !inherits(x$so, "try-error"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">35</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(model.names))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">36</td> + <td class="coverage">284<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model.names <- vapply(as.list(mCall)[c(FALSE, TRUE, is_model)], deparse1, "")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Sanitize model names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(model.names) != length(mods))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">40</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Model names vector and model list have different lengths")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(duplicated(model.names)))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">43</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Duplicate model names are not allowed")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (max(nchar(model.names)) > 200) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">46</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> warning("Model names longer than 200 characters, assigning generic names")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">47</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> model.names <- paste0("MODEL",seq_along(model.names))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(mods) <- model.names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mods <- mods[successful]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Ensure same data, ignoring covariates</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> same_data <- sapply(mods[-1], function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">1182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> identical(mods[[1]]$data[c("ds", "name", "time", "value")],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">1182<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> x$data[c("ds", "name", "time", "value")])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!all(same_data)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">58</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop(sum(!same_data), " objects have not been fitted to the same data")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llks <- lapply(names(mods), function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">1700<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llk <- try(logLik(mods[[x]], method = method), silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">1700<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(llk, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">64</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> warning("Could not obtain log likelihood with '", method, "' method for ", x)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">65</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> llk <- NA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">1700<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(llk)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> available <- !sapply(llks, is.na)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llks <- llks[available]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mods <- mods[available]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Order models by increasing degrees of freedom:</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> npar <- vapply(llks, attr, FUN.VALUE=numeric(1), "df")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ii <- order(npar)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mods <- mods[ii]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llks <- llks[ii]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> npar <- npar[ii]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Describe data for the header, as in summary.saem.mmkin</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> header <- paste("Data:", nrow(object$data), "observations of",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(object$data$name)), "variable(s) grouped in",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(object$data$ds)), "datasets\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Calculate statistics</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llk <- unlist(llks)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> chisq <- 2 * pmax(0, c(NA, diff(llk)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dfChisq <- c(NA, diff(npar))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bic <- function(x, method) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">1700<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> BIC(x$so, method = method)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val <- data.frame(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> npar = npar,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> AIC = sapply(llks, AIC),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> BIC = sapply(mods, bic, method = method), # We use the saemix method here</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> Lik = llk,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = names(mods), check.names = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (test) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">196<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> testval <- data.frame(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">196<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> Chisq = chisq,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">196<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> Df = dfChisq,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">196<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "Pr(>Chisq)" = ifelse(dfChisq == 0, NA,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">196<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pchisq(chisq, dfChisq, lower.tail = FALSE)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">196<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = names(mods), check.names = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">196<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val <- cbind(val, testval)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(val) <- c("anova", class(val))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">518<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> structure(val, heading = c(header))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">112</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Currently, no anova method is implemented for the case of a single saem.mmkin object")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/create_deg_func.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Create degradation functions for known analytical solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param spec List of model specifications as contained in mkinmod objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param use_of_ff Minimum or maximum use of formation fractions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return Degradation function to be attached to mkinmod objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("SFO", "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS_D <- subset(FOCUS_2006_D, value != 0) # to avoid warnings</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_1 <- mkinfit(SFO_SFO, FOCUS_D, solution_type = "analytical", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_2 <- mkinfit(SFO_SFO, FOCUS_D, solution_type = "deSolve", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if (require(rbenchmark))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' benchmark(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' analytical = mkinfit(SFO_SFO, FOCUS_D, solution_type = "analytical", quiet = TRUE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' deSolve = mkinfit(SFO_SFO, FOCUS_D, solution_type = "deSolve", quiet = TRUE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' replications = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' DFOP_SFO <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("DFOP", "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' benchmark(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' analytical = mkinfit(DFOP_SFO, FOCUS_D, solution_type = "analytical", quiet = TRUE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' deSolve = mkinfit(DFOP_SFO, FOCUS_D, solution_type = "deSolve", quiet = TRUE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' replications = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">create_deg_func <- function(spec, use_of_ff = c("min", "max")) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_of_ff <- match.arg(use_of_ff)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> min_ff <- use_of_ff == "min"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars <- names(spec)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">35</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent <- obs_vars[1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">36</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_type <- spec[[1]]$type</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">38</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> supported <- TRUE # This may be modified below</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> predicted_text <- character(0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "SFO") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">5916<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (min_ff) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">599<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> targets <- c(spec[[1]]$to, if (spec[[1]]$sink) "sink" else NULL)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">599<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_parent <- paste(paste0("k_", parent, "_", targets), collapse = " + ")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">5317<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_parent <- paste0("k_", parent)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> predicted_text[parent] <- paste0(parent_type, ".solution(t, odeini['", parent,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_type == "SFORB") "_free", "'], ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> switch(parent_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> SFO = k_parent,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> FOMC = "alpha, beta",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> IORE = paste0("k__iore_", parent, if (min_ff) "_sink" else "", ", N_", parent),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> DFOP = "k1, k2, g",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> SFORB = paste0("k_", parent, "_free_bound, k_", parent, "_bound_free, k_", parent, "_free", if (min_ff) "_sink" else ""),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> HS = "k1, k2, tb",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> logistic = "kmax, k0, r"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ")")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">3728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(obs_vars) >= 2) supported <- FALSE</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Except for the following cases:</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(obs_vars) == 2) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n1 <- obs_vars[1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n2 <- obs_vars[2]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n10 <- paste0("odeini['", parent, "']")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n20 <- paste0("odeini['", n2, "']")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # sfo_sfo</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (all(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[1]]$sink == FALSE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[1]]$type == "SFO",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[2]]$type == "SFO",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> is.null(spec[[2]]$to))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">741<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> supported <- TRUE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">741<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1 <- k_parent</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">741<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- paste0("k_", n2, if(min_ff) "_sink" else "")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">741<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> predicted_text[n2] <- paste0(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">741<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "(((", k2, "-", k1, ")*", n20, "-", k1, "*", n10, ")*exp(-", k2, "*t)+",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">741<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1, "*", n10, "*exp(-", k1, "*t))/(", k2, "-", k1, ")")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # sfo_f12_sfo</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (all(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_of_ff == "max",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[1]]$sink == TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[1]]$type == "SFO",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[2]]$type == "SFO",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> is.null(spec[[2]]$to))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">1129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> supported <- TRUE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">1129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1 <- k_parent</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">1129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- paste0("k_", n2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">1129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f12 <- paste0("f_", n1, "_to_", n2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">1129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> predicted_text[n2] <- paste0(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">1129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "(((", k2, "-", k1, ")*", n20, "-", f12, "*", k1, "*", n10, ")*exp(-", k2, "*t)+",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">1129<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f12, "*", k1, "*", n10, "*exp(-", k1, "*t))/(", k2, "-", k1, ")")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # sfo_k120_sfo</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (all(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_of_ff == "min",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[1]]$sink == TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[1]]$type == "SFO",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[2]]$type == "SFO",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> is.null(spec[[2]]$to))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">351<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> supported <- TRUE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">351<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k12 <- paste0("k_", n1, "_", n2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">351<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k10 <- paste0("k_", n1, "_sink")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">351<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- paste0("k_", n2, "_sink")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">351<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> predicted_text[n2] <- paste0(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">351<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "(((", k2, "-", k12, "-", k10, ")*", n20, "-", k12, "*", n10, ")*exp(-", k2, "*t)+",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">351<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k12, "*", n10, "*exp(-(", k_parent, ")*t))/(", k2, "-(", k_parent, "))")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # dfop_f12_sfo</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (all(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> use_of_ff == "max",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[1]]$sink == TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[1]]$type == "DFOP",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">124</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec[[2]]$type == "SFO",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">3036<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> is.null(spec[[2]]$to))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">126</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> supported <- TRUE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f12 <- paste0("f_", n1, "_to_", n2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">128</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- paste0("k_", n2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> predicted_text[n2] <- paste0(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "((", f12, "* g - ", f12, ") * k2 * ", n10, " * exp(- k2 * t))/(k2 - ", k2, ") - ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "((", f12, "* g) * k1 * ", n10, " * exp(- k1 * t))/(k1 - ", k2, ") + ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "(((k1 - ", k2, ") * k2 - ", k2, "* k1 + ", k2, "^2) * ", n20, "+",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "((", f12, "* k1 + (", f12, "*g - ", f12, ") * ", k2, ") * k2 - ", f12, " * g * ", k2, " * k1) * ", n10, ") * ",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">565<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "exp( - ", k2, " * t)/((k1 - ", k2, ") * k2 - ", k2, " * k1 + ", k2, "^2)")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">8117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (supported) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> deg_func <- function(observed, odeini, odeparms) {}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_body <- paste0("{\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "predicted <- numeric(0)\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "with(as.list(odeparms), {\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs_var in obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">9961<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_body <- paste0(f_body,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">9961<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "t <- observed[observed$name == '", obs_var, "', 'time']\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">9961<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "predicted <<- c(predicted, ", predicted_text[obs_var], ")\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_body <- paste0(f_body,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "})\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">152</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "return(predicted)\n}\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">154</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> body(deg_func) <- parse(text = f_body)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">155</td> + <td class="coverage">7175<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(deg_func)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">157</td> + <td class="coverage">942<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(NULL)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/nlme.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Helper functions to create nlme models from mmkin row objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' These functions facilitate setting up a nonlinear mixed effects model for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' an mmkin row object. An mmkin row object is essentially a list of mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' objects that have been obtained by fitting the same model to a list of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' datasets. They are used internally by the [nlme.mmkin()] method.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An mmkin row object containing several fits of the same model to different datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @import nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso \code{\link{nlme.mmkin}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_SFO <- mkinmod(parent = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_1 <- mkinpredict(m_SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = 0.1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 98), sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_1_long <- mkin_wide_to_long(d_SFO_1, time = "time")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_2 <- mkinpredict(m_SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = 0.05),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 102), sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_2_long <- mkin_wide_to_long(d_SFO_2, time = "time")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_3 <- mkinpredict(m_SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = 0.02),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 103), sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_3_long <- mkin_wide_to_long(d_SFO_3, time = "time")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d1 <- add_err(d_SFO_1, function(value) 3, n = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d2 <- add_err(d_SFO_2, function(value) 2, n = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d3 <- add_err(d_SFO_3, function(value) 4, n = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds <- c(d1 = d1, d2 = d2, d3 = d3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mmkin("SFO", ds, cores = 1, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mean_dp <- mean_degparms(f)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' grouped_data <- nlme_data(f)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' nlme_f <- nlme_function(f)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # These assignments are necessary for these objects to be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # visible to nlme and augPred when evaluation is done by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # pkgdown to generate the html docs.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' assign("nlme_f", nlme_f, globalenv())</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' assign("grouped_data", grouped_data, globalenv())</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(nlme)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_nlme <- nlme(value ~ nlme_f(name, time, parent_0, log_k_parent_sink),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' data = grouped_data,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fixed = parent_0 + log_k_parent_sink ~ 1,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' random = pdDiag(parent_0 + log_k_parent_sink ~ 1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' start = mean_dp)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(m_nlme)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(augPred(m_nlme, level = 0:1), layout = c(3, 1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # augPred does not work on fits with more than one state</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # variable</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The procedure is greatly simplified by the nlme.mmkin function</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme <- nlme(f)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_nlme)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A function that can be used with nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">nlme_function <- function(object) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">60</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(object) > 1) stop("Only row objects allowed")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">1168<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkin_model <- object[[1]]$mkinmod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">1168<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparm_names <- names(mean_degparms(object))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Inspired by https://stackoverflow.com/a/12983961/3805440</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # and https://stackoverflow.com/a/26280789/3805440</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">1168<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function_alist <- replicate(length(degparm_names) + 2, substitute())</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">1168<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(model_function_alist) <- c("name", "time", degparm_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">1168<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function_body <- quote({</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> arg_frame <- as.data.frame(as.list((environment())), stringsAsFactors = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_frame <- arg_frame[1:2]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_frame <- arg_frame[-(1:2)]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms_unique <- unique(parm_frame)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_unique <- nrow(parms_unique)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> times_ds <- list()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names_ds <- list()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 1:n_unique) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> times_ds[[i]] <-</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> arg_frame[which(arg_frame[[3]] == parms_unique[i, 1]), "time"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names_ds[[i]] <-</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> arg_frame[which(arg_frame[[3]] == parms_unique[i, 1]), "name"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_list <- lapply(1:n_unique, function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms_optim <- unlist(parms_unique[x, , drop = TRUE])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms_fixed <- object[[1]]$bparms.fixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_optim_parm_names <- grep('_0$', names(transparms_optim), value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_optim <- transparms_optim[odeini_optim_parm_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini_optim) <- gsub('_0$', '', odeini_optim_parm_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_fixed_parm_names <- grep('_0$', names(parms_fixed), value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini_fixed <- parms_fixed[odeini_fixed_parm_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(odeini_fixed) <- gsub('_0$', '', odeini_fixed_parm_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeini <- c(odeini_optim, odeini_fixed)[names(mkin_model$diffs)]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ode_transparms_optim_names <- setdiff(names(transparms_optim), odeini_optim_parm_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_optim <- backtransform_odeparms(transparms_optim[ode_transparms_optim_names], mkin_model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = object[[1]]$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = object[[1]]$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_fixed_names <- setdiff(names(parms_fixed), odeini_fixed_parm_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms_fixed <- parms_fixed[odeparms_fixed_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms <- c(odeparms_optim, odeparms_fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_wide <- mkinpredict(mkin_model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> odeparms = odeparms, odeini = odeini,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> solution_type = object[[1]]$solution_type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> outtimes = sort(unique(times_ds[[x]])))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_array <- out_wide[, -1, drop = FALSE]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(out_array) <- as.character(unique(times_ds[[x]]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_times <- as.character(times_ds[[x]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_names <- as.character(names_ds[[x]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_values <- mapply(function(times, names) out_array[times, names],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> out_times, out_names)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">2342789<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(as.numeric(out_values))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- unlist(res_list)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">252739<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">1168<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_function <- as.function(c(model_function_alist, model_function_body))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">124</td> + <td class="coverage">1168<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(model_function)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom rlang !!!</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A \code{\link{groupedData}} object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">nlme_data <- function(object) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">132</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(object) > 1) stop("Only row objects allowed")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_names <- colnames(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_list <- lapply(object, function(x) x$data[c("time", "variable", "observed")])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(ds_list) <- ds_names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_nlme <- vctrs::vec_rbind(!!!ds_list, .names_to = "ds")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_nlme$variable <- as.character(ds_nlme$variable)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_nlme$ds <- ordered(ds_nlme$ds, levels = unique(ds_nlme$ds))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_nlme_renamed <- data.frame(ds = ds_nlme$ds, name = ds_nlme$variable,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> time = ds_nlme$time, value = ds_nlme$observed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stringsAsFactors = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_nlme_grouped <- groupedData(value ~ time | ds, ds_nlme_renamed, order.groups = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">5677<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ds_nlme_grouped)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/transform_odeparms.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Functions to transform and backtransform kinetic parameters for fitting</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The transformations are intended to map parameters that should only take on</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' restricted values to the full scale of real numbers. For kinetic rate</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' constants and other parameters that can only take on positive values, a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' simple log transformation is used. For compositional parameters, such as the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' formations fractions that should always sum up to 1 and can not be negative,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the [ilr] transformation is used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The transformation of sets of formation fractions is fragile, as it supposes</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the same ordering of the components in forward and backward transformation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This is no problem for the internal use in [mkinfit].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param parms Parameters of kinetic models as used in the differential</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' equations.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param transparms Transformed parameters of kinetic models as used in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fitting procedure.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param mkinmod The kinetic model of class [mkinmod], containing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the names of the model variables that are needed for grouping the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' formation fractions before [ilr] transformation, the parameter</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names and the information if the pathway to sink is included in the model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param transform_rates Boolean specifying if kinetic rate constants should</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be transformed in the model specification used in the fitting for better</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' compliance with the assumption of normal distribution of the estimator. If</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' TRUE, also alpha and beta parameters of the FOMC model are</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' log-transformed, as well as k1 and k2 rate constants for the DFOP and HS</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' models and the break point tb of the HS model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param transform_fractions Boolean specifying if formation fractions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' constants should be transformed in the model specification used in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fitting for better compliance with the assumption of normal distribution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the estimator. The default (TRUE) is to do transformations.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The g parameter of the DFOP model is also seen as a fraction.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If a single fraction is transformed (g parameter of DFOP or only a single</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' target variable e.g. a single metabolite plus a pathway to sink), a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' logistic transformation is used [stats::qlogis()]. In other cases, i.e. if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' two or more formation fractions need to be transformed whose sum cannot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' exceed one, the [ilr] transformation is used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A vector of transformed or backtransformed parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats plogis qlogis</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = list(type = "SFO", to = "m1", sink = TRUE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = list(type = "SFO"), use_of_ff = "min")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Fit the model to the FOCUS example dataset D using defaults</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS_D <- subset(FOCUS_2006_D, value != 0) # remove zero values to avoid warning</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.s <- summary(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Transformed and backtransformed parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(fit.s$par, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(fit.s$bpar, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Compare to the version without transforming rate parameters (does not work</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # with analytical solution, we get NA values for m1 in predictions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.2 <- mkinfit(SFO_SFO, FOCUS_D, transform_rates = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' solution_type = "deSolve", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.2.s <- summary(fit.2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(fit.2.s$par, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(fit.2.s$bpar, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' initials <- fit$start$value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(initials) <- rownames(fit$start)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' transformed <- fit$start_transformed$value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(transformed) <- rownames(fit$start_transformed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' transform_odeparms(initials, SFO_SFO)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' backtransform_odeparms(transformed, SFO_SFO)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The case of formation fractions (this is now the default)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO.ff <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = list(type = "SFO", to = "m1", sink = TRUE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = list(type = "SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.ff <- mkinfit(SFO_SFO.ff, FOCUS_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.ff.s <- summary(fit.ff)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(fit.ff.s$par, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(fit.ff.s$bpar, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' initials <- c("f_parent_to_m1" = 0.5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' transformed <- transform_odeparms(initials, SFO_SFO.ff)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' backtransform_odeparms(transformed, SFO_SFO.ff)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # And without sink</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO.ff.2 <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = list(type = "SFO", to = "m1", sink = FALSE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = list(type = "SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.ff.2 <- mkinfit(SFO_SFO.ff.2, FOCUS_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.ff.2.s <- summary(fit.ff.2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(fit.ff.2.s$par, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(fit.ff.2.s$bpar, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export transform_odeparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">transform_odeparms <- function(parms, mkinmod,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = TRUE, transform_fractions = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We need the model specification for the names of the model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # variables and the information on the sink</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec = mkinmod$spec</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set up container for transformed parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms <- numeric(0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Do not transform initial values for state variables</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini.optim <- parms[grep("_0$", names(parms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[names(state.ini.optim)] <- state.ini.optim</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Log transformation for rate constants if requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k <- parms[grep("^k_", names(parms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k__iore <- parms[grep("^k__iore_", names(parms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k <- c(k, k__iore)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(k) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">120</td> + <td class="coverage">15485<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(transform_rates) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">14379<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[paste0("log_", names(k))] <- log(k)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">1106<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> } else transparms[names(k)] <- k</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Do not transform exponents in IORE models</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">126</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> N <- parms[grep("^N", names(parms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">127</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[names(N)] <- N</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Go through state variables and transform formation fractions if requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mod_vars = names(spec)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (box in mod_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">41283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f <- parms[grep(paste("^f", box, sep = "_"), names(parms))]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">41283<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(f) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">6522<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(transform_fractions) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">5910<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (spec[[box]]$sink) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">5908<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(f) == 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">5894<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_f_name <- paste("f", box, "qlogis", sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">5894<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[trans_f_name] <- qlogis(f)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">14<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_f <- ilr(c(f, 1 - sum(f)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">14<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_f_names <- paste("f", box, "ilr", 1:length(trans_f), sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">14<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[trans_f_names] <- trans_f</pre> + </td> + </tr> + <tr class="never"> + <td class="num">144</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(f) > 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_f <- ilr(f)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_f_names <- paste("f", box, "ilr", 1:length(trans_f), sep = "_")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[trans_f_names] <- trans_f</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">153</td> + <td class="coverage">612<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[names(f)] <- f</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transform also FOMC parameters alpha and beta, DFOP and HS rates k1 and k2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # and HS parameter tb as well as logistic model parameters kmax, k0 and r if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">160</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # transformation of rates is requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (pname in c("alpha", "beta", "k1", "k2", "tb", "kmax", "k0", "r")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">204696<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(parms[pname])) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">6006<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transform_rates) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">164</td> + <td class="coverage">6006<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[paste0("log_", pname)] <- log(parms[pname])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">166</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> transparms[pname] <- parms[pname]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">167</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">169</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">171</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # DFOP parameter g is treated as a fraction</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(parms["g"])) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">1978<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g <- parms["g"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">1978<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transform_fractions) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">1978<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transparms["g_qlogis"] <- qlogis(g)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">177</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> transparms["g"] <- g</pre> + </td> + </tr> + <tr class="never"> + <td class="num">178</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">25587<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(transparms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">182</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">183</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">184</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname transform_odeparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export backtransform_odeparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">186</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">backtransform_odeparms <- function(transparms, mkinmod,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">187</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">188</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We need the model specification for the names of the model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # variables and the information on the sink</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec = mkinmod$spec</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set up container for backtransformed parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms <- numeric(0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">196</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Do not transform initial values for state variables</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.ini.optim <- transparms[grep("_0$", names(transparms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[names(state.ini.optim)] <- state.ini.optim</pre> + </td> + </tr> + <tr class="never"> + <td class="num">200</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Exponential transformation for rate constants</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">202</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(transform_rates) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">203</td> + <td class="coverage">49140623<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_k <- transparms[grep("^log_k_", names(transparms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">49140623<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_k__iore <- transparms[grep("^log_k__iore_", names(transparms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">49140623<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_k = c(trans_k, trans_k__iore)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">206</td> + <td class="coverage">49140623<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(trans_k) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">207</td> + <td class="coverage">47598103<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_names <- gsub("^log_k", "k", names(trans_k))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">47598103<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[k_names] <- exp(trans_k)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">209</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">210</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">211</td> + <td class="coverage">73591<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_k <- transparms[grep("^k_", names(transparms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">212</td> + <td class="coverage">73591<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[names(trans_k)] <- trans_k</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">213</td> + <td class="coverage">73591<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_k__iore <- transparms[grep("^k__iore_", names(transparms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">214</td> + <td class="coverage">73591<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[names(trans_k__iore)] <- trans_k__iore</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">216</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">217</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Do not transform exponents in IORE models</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">218</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> N <- transparms[grep("^N", names(transparms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">219</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[names(N)] <- N</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Go through state variables and apply inverse transformations to formation fractions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mod_vars = names(spec)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (box in mod_vars) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">224</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get the names as used in the model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">225</td> + <td class="coverage">97593385<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names = grep(paste("^f", box, sep = "_"), mkinmod$parms, value = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">226</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get the formation fraction parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">97593385<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> trans_f = transparms[grep(paste("^f", box, sep = "_"), names(transparms))]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">229</td> + <td class="coverage">97593385<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(trans_f) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">230</td> + <td class="coverage">46632823<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(transform_fractions) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">231</td> + <td class="coverage">46588453<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(grepl("qlogis", names(trans_f)))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">232</td> + <td class="coverage">46059152<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_tmp <- plogis(trans_f)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">233</td> + <td class="coverage">46059152<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[f_names] <- f_tmp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">234</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_tmp <- invilr(trans_f)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">236</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (spec[[box]]$sink) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">528393<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[f_names] <- f_tmp[1:length(f_tmp)-1]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">239</td> + <td class="coverage">908<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[f_names] <- f_tmp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">240</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">241</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">242</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">44370<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[names(trans_f)] <- trans_f</pre> + </td> + </tr> + <tr class="never"> + <td class="num">244</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">245</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">246</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">247</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">248</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transform parameters also for FOMC, DFOP, HS and logistic models</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">249</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (pname in c("alpha", "beta", "k1", "k2", "tb", "kmax", "k0", "r")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">250</td> + <td class="coverage">393713712<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transform_rates) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">251</td> + <td class="coverage">393124984<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pname_trans = paste0("log_", pname)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">252</td> + <td class="coverage">393124984<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(transparms[pname_trans])) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">253</td> + <td class="coverage">4306142<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms[pname] <- exp(transparms[pname_trans])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">254</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">255</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">256</td> + <td class="coverage">588728<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(transparms[pname])) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">257</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> parms[pname] <- transparms[pname]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">258</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">259</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">260</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">261</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">262</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # DFOP parameter g is now transformed using qlogis</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">263</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(transparms["g_qlogis"])) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">2034008<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g_qlogis <- transparms["g_qlogis"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">265</td> + <td class="coverage">2034008<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms["g"] <- plogis(g_qlogis)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">266</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">267</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # In earlier times we used ilr for g, so we keep this around</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">268</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(transparms["g_ilr"])) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">269</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> g_ilr <- transparms["g_ilr"]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">270</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> parms["g"] <- invilr(g_ilr)[1]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">271</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">272</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(transparms["g"])) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">273</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> parms["g"] <- transparms["g"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">274</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">275</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">276</td> + <td class="coverage">49214214<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(parms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">277</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">278</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># vim: set ts=2 sw=2 expandtab:</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/hierarchical_kinetics.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Hierarchical kinetics template</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' R markdown format for setting up hierarchical kinetics based on a template</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' provided with the mkin package. This format is based on [rmarkdown::pdf_document].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Chunk options are adapted. Echoing R code from code chunks and caching are</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' turned on per default. character for prepending output from code chunks is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set to the empty string, code tidying is off, figure alignment defaults to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' centering, and positioning of figures is set to "H", which means that</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' figures will not move around in the document, but stay where the user</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' includes them.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The latter feature (positioning the figures with "H") depends on the LaTeX</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' package 'float'. In addition, the LaTeX package 'listing' is used in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' template for showing model fit summaries in the Appendix. This means that</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the LaTeX packages 'float' and 'listing' need to be installed in the TeX</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' distribution used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' On Windows, the easiest way to achieve this (if no TeX distribution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is present before) is to install the 'tinytex' R package, to run</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 'tinytex::install_tinytex()' to get the basic tiny Tex distribution,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and then to run 'tinytex::tlmgr_install(c("float", "listing"))'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inheritParams rmarkdown::pdf_document</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ... Arguments to \code{rmarkdown::pdf_document}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return R Markdown output format to pass to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link[rmarkdown:render]{render}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(rmarkdown)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The following is now commented out after the relase of v1.2.3 for the generation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # of online docs, as the command creates a directory and opens an editor</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #draft("example_analysis.rmd", template = "hierarchical_kinetics", package = "mkin")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">hierarchical_kinetics <- function(..., keep_tex = FALSE) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">41</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (getRversion() < "4.1.0")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">42</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("You need R with version > 4.1.0 to compile this document")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">44</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!requireNamespace("knitr")) stop("Please install the knitr package to use this template")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">45</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!requireNamespace("rmarkdown")) stop("Please install the rmarkdown package to use this template")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">46</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> knitr::opts_chunk$set(cache = TRUE, comment = "", tidy = FALSE, echo = TRUE)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">47</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> knitr::opts_chunk$set(fig.align = "center", fig.pos = "H")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">48</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> options(knitr.kable.NA = "")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">50</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> fmt <- rmarkdown::pdf_document(...,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">51</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> keep_tex = keep_tex,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">52</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> toc = TRUE,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">53</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> toc_depth = 3,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">54</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> includes = rmarkdown::includes(in_header = "header.tex"),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">55</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> extra_dependencies = c("float", "listing", "framed")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">58</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return(fmt)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/nlme.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># Code inspired by nlme::nlme.nlsList and R/nlme_fit.R from nlmixr</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># We need to assign the degradation function created in nlme.mmkin to an</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># environment that is always accessible, also e.g. when evaluation is done by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># testthat or pkgdown. Therefore parent.frame() is not good enough. The</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># following environment will be in the mkin namespace.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">.nlme_env <- new.env(parent = emptyenv())</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">nlme::nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Retrieve a degradation function from the mmkin namespace</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom utils getFromNamespace</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A function that was likely previously assigned from within</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' nlme.mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">get_deg_func <- function() {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">19</td> + <td class="coverage">217279<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(get("deg_func", getFromNamespace(".nlme_env", "mkin")))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Create an nlme model for an mmkin row object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This functions sets up a nonlinear mixed effects model for an mmkin row</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' object. An mmkin row object is essentially a list of mkinfit objects that</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' have been obtained by fitting the same model to a list of datasets.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Note that the convergence of the nlme algorithms depends on the quality</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the data. In degradation kinetics, we often only have few datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' (e.g. data for few soils) and complicated degradation models, which may</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' make it impossible to obtain convergence with nlme.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param model An [mmkin] row object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param data Ignored, data are taken from the mmkin model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param fixed Ignored, all degradation parameters fitted in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mmkin model are used as fixed parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param random If not specified, no correlations between random effects are</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set up for the optimised degradation model parameters. This is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' achieved by using the [nlme::pdDiag] method.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param groups See the documentation of nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param start If not specified, mean values of the fitted degradation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters taken from the mmkin object are used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param correlation See the documentation of nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param weights passed to nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param subset passed to nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param method passed to nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param na.action passed to nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param naPattern passed to nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param control passed to nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param verbose passed to nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats na.fail as.formula</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return Upon success, a fitted 'nlme.mmkin' object, which is an nlme object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' with additional elements. It also inherits from 'mixed.mmkin'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note As the object inherits from [nlme::nlme], there is a wealth of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' methods that will automatically work on 'nlme.mmkin' objects, such as</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [nlme::intervals()], [nlme::anova.lme()] and [nlme::coef.lme()].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso [nlme_function()], [plot.mixed.mmkin], [summary.nlme.mmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds <- lapply(experimental_data_for_UBA_2019[6:10],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' function(x) subset(x$data[c("name", "time", "value")], name == "parent"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mmkin(c("SFO", "DFOP"), ds, quiet = TRUE, cores = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(nlme)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme_sfo <- nlme(f["SFO", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme_dfop <- nlme(f["DFOP", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_nlme_sfo, f_nlme_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(f_nlme_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_nlme_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(f_nlme_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_2 <- lapply(experimental_data_for_UBA_2019[6:10],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' function(x) x$data[c("name", "time", "value")])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_sfo_sfo <- mkinmod(parent = mkinsub("SFO", "A1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A1 = mkinsub("SFO"), use_of_ff = "min", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_sfo_sfo_ff <- mkinmod(parent = mkinsub("SFO", "A1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A1 = mkinsub("SFO"), use_of_ff = "max", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "A1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A1 = mkinsub("SFO"), quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_2 <- mmkin(list("SFO-SFO" = m_sfo_sfo,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "SFO-SFO-ff" = m_sfo_sfo_ff,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "DFOP-SFO" = m_dfop_sfo),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_2, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme_sfo_sfo <- nlme(f_2["SFO-SFO", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_nlme_sfo_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # With formation fractions this does not coverge with defaults</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # f_nlme_sfo_sfo_ff <- nlme(f_2["SFO-SFO-ff", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #plot(f_nlme_sfo_sfo_ff)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # For the following, we need to increase pnlsMaxIter and the tolerance</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # to get convergence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme_dfop_sfo <- nlme(f_2["DFOP-SFO", ],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' control = list(pnlsMaxIter = 120, tolerance = 5e-4))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_nlme_dfop_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_nlme_dfop_sfo, f_nlme_sfo_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(f_nlme_sfo_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(f_nlme_dfop_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if (length(findFunction("varConstProp")) > 0) { # tc error model for nlme available</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Attempts to fit metabolite kinetics with the tc error model are possible,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # but need tweeking of control values and sometimes do not converge</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_tc <- mmkin(c("SFO", "DFOP"), ds, quiet = TRUE, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme_sfo_tc <- nlme(f_tc["SFO", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme_dfop_tc <- nlme(f_tc["DFOP", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' AIC(f_nlme_sfo, f_nlme_sfo_tc, f_nlme_dfop, f_nlme_dfop_tc)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(f_nlme_dfop_tc)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_2_obs <- update(f_2, error_model = "obs")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme_sfo_sfo_obs <- nlme(f_2_obs["SFO-SFO", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(f_nlme_sfo_sfo_obs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nlme_dfop_sfo_obs <- nlme(f_2_obs["DFOP-SFO", ],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' control = list(pnlsMaxIter = 120, tolerance = 5e-4))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_2_tc <- update(f_2, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # f_nlme_sfo_sfo_tc <- nlme(f_2_tc["SFO-SFO", ]) # No convergence with 50 iterations</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # f_nlme_dfop_sfo_tc <- nlme(f_2_tc["DFOP-SFO", ],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # control = list(pnlsMaxIter = 120, tolerance = 5e-4)) # Error in X[, fmap[[nm]]] <- gradnm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_nlme_dfop_sfo, f_nlme_dfop_sfo_obs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">nlme.mmkin <- function(model, data = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed = lapply(as.list(names(mean_degparms(model))),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> function(el) eval(parse(text = paste(el, 1, sep = "~")))),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> random = pdDiag(fixed),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> groups,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> start = mean_degparms(model, random = TRUE, test_log_parms = TRUE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> correlation = NULL, weights = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> subset, method = c("ML", "REML"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> na.action = na.fail, naPattern,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> control = list(), verbose= FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">142</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(model) > 1) stop("Only row objects allowed")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> thisCall <- as.list(match.call())[-1]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Warn in case arguments were used that are overriden</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(!is.na(match(names(thisCall),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> c("data"))))) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">149</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> warning("'nlme.mmkin' will redefine 'data'")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get native symbol info for speed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">153</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (model[[1]]$solution_type == "deSolve" & !is.null(model[[1]]$mkinmod$cf)) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # The mkinmod stored in the first fit will be used by nlme</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">155</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model[[1]]$mkinmod$symbols <- deSolve::checkDLL(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">156</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dllname = model[[1]]$mkinmod$dll_info[["name"]],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">157</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> func = "diffs", initfunc = "initpar",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">158</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> jacfunc = NULL, nout = 0, outnames = NULL)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">160</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> deg_func <- nlme_function(model)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">162</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> assign("deg_func", deg_func, getFromNamespace(".nlme_env", "mkin"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # For the formula, get the degradation function from the mkin namespace</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> this_model_text <- paste0("value ~ mkin::get_deg_func()(",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste(names(formals(deg_func)), collapse = ", "), ")")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> this_model <- as.formula(this_model_text)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">169</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">170</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> thisCall[["model"]] <- this_model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">171</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> thisCall[["data"]] <- nlme_data(model)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">173</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> thisCall[["start"]] <- start</pre> + </td> + </tr> + <tr class="never"> + <td class="num">175</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">176</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> thisCall[["fixed"]] <- fixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">177</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> thisCall[["random"]] <- random</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">180</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> error_model <- model[[1]]$err_mod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">181</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (missing(weights)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> thisCall[["weights"]] <- switch(error_model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> const = NULL,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">185</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs = varIdent(form = ~ 1 | name),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">186</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tc = varConstProp())</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma <- switch(error_model,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tc = 1,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">189</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> NULL)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> control <- thisCall[["control"]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">193</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (error_model == "tc") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">194</td> + <td class="coverage">928<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> control$sigma = 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">928<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> thisCall[["control"]] <- control</pre> + </td> + </tr> + <tr class="never"> + <td class="num">196</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_time <- system.time(val <- do.call("nlme.formula", thisCall))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$time <- fit_time</pre> + </td> + </tr> + <tr class="never"> + <td class="num">200</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">201</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$mkinmod <- model[[1]]$mkinmod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">202</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Don't return addresses that will become invalid</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">203</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$mkinmod$symbols <- NULL</pre> + </td> + </tr> + <tr class="never"> + <td class="num">204</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$data <- thisCall[["data"]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">206</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$mmkin <- model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">207</td> + <td class="coverage">824<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.list(start)) val$mean_dp_start <- start$fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">189<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else val$mean_dp_start <- start</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$transform_rates <- model[[1]]$transform_rates</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">210</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$transform_fractions <- model[[1]]$transform_fractions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">211</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$solution_type <- model[[1]]$solution_type</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">212</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$err_mode <- error_model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">214</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$bparms.optim <- backtransform_odeparms(val$coefficients$fixed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">215</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">216</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_rates = val$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform_fractions = val$transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">218</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">219</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$bparms.fixed <- model[[1]]$bparms.fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">220</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$date.fit <- date()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">221</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$nlmeversion <- as.character(utils::packageVersion("nlme"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$mkinversion <- as.character(utils::packageVersion("mkin"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val$Rversion <- paste(R.version$major, R.version$minor, sep=".")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">224</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(val) <- c("nlme.mmkin", "mixed.mmkin", "nlme", "lme")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">225</td> + <td class="coverage">1013<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(val)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">226</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">228</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">229</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname nlme.mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">230</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An nlme.mmkin object to print</pre> + </td> + </tr> + <tr class="never"> + <td class="num">231</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits Number of digits to use for printing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.nlme.mmkin <- function(x, digits = max(3, getOption("digits") - 3), ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">233</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat( "Kinetic nonlinear mixed-effects model fit by " )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">234</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat( if(x$method == "REML") "REML\n" else "maximum likelihood\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStructural model:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">236</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> diffs <- x$mmkin[[1]]$mkinmod$diffs</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nice_diffs <- gsub("^(d.*) =", "\\1/dt =", diffs)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">238</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> writeLines(strwrap(nice_diffs, exdent = 11))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">239</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nData:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">240</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(nrow(x$data), "observations of",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">241</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$name)), "variable(s) grouped in",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">242</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$ds)), "datasets\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nLog-", if(x$method == "REML") "restricted-" else "",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">244</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "likelihood: ", format(x$logLik, digits = digits), "\n", sep = "")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">245</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixF <- x$call$fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">246</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFixed effects:\n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">247</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> deparse(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">248</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(inherits(fixF, "formula") || is.call(fixF) || is.name(fixF))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">249</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> x$call$fixed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">250</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> else</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">251</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lapply(fixF, function(el) as.name(deparse(el)))), "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">252</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(fixef(x), digits = digits, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">253</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">254</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(summary(x$modelStruct), sigma = x$sigma, digits = digits, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">255</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> invisible(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">256</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">257</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">258</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">259</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname nlme.mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">260</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An nlme.mmkin object to update</pre> + </td> + </tr> + <tr class="never"> + <td class="num">261</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ... Update specifications passed to update.nlme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">262</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">update.nlme.mmkin <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">263</td> + <td class="coverage">85<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- NextMethod()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">85<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res$mmkin <- object$mmkin</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">265</td> + <td class="coverage">85<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(res) <- c("nlme.mmkin", "nlme", "lme")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">266</td> + <td class="coverage">85<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">267</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinresplot.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables(c("variable", "residual"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function to plot residuals stored in an mkin object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function plots the residuals for the specified subset of the observed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variables from an mkinfit object. A combined plot of the fitted model and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the residuals can be obtained using \code{\link{plot.mkinfit}} using the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' argument \code{show_residuals = TRUE}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats residuals</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object A fit represented in an \code{\link{mkinfit}} object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param obs_vars A character vector of names of the observed variables for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' which residuals should be plotted. Defaults to all observed variables in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param xlim plot range in x direction.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param xlab Label for the x axis.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param standardized Should the residuals be standardized by dividing by the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' standard deviation given by the error model of the fit?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ylab Label for the y axis.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param maxabs Maximum absolute value of the residuals. This is used for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' scaling of the y axis and defaults to "auto".</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param legend Should a legend be plotted?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param lpos Where should the legend be placed? Default is "topright". Will</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be passed on to \code{\link{legend}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param col_obs Colors for the observed variables.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param pch_obs Symbols to be used for the observed variables.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param frame Should a frame be drawn around the plots?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots further arguments passed to \code{\link{plot}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return Nothing is returned by this function, as it is called for its side</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' effect, namely to produce a plot.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke and Katrin Lindenberger</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso \code{\link{mkinplot}}, for a way to plot the data and the fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lines of the mkinfit object, and \code{\link{plot_res}} for a function</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' combining the plot of the fit and the residual plot.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit(model, FOCUS_2006_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinresplot(fit, "m1")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinresplot <- function (object,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars = names(object$mkinmod$map),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = c(0, 1.1 * max(object$data$time)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> standardized = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = "Time", ylab = ifelse(standardized, "Standardized residual", "Residual"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> maxabs = "auto", legend = TRUE, lpos = "topright",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> col_obs = "auto", pch_obs = "auto",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> frame = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars_all <- as.character(unique(object$data$variable))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(obs_vars) > 0){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars <- intersect(obs_vars_all, obs_vars)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">56</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> } else obs_vars <- obs_vars_all</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (standardized) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">59</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> res_col <- "standardized"</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">60</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object$data[[res_col]] <- residuals(object, standardized = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_col <- "residual"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- subset(object$data, variable %in% obs_vars)[res_col]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (maxabs == "auto") maxabs = max(abs(res), na.rm = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set colors and symbols</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (col_obs[1] == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> col_obs <- 1:length(obs_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (pch_obs[1] == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pch_obs <- 1:length(obs_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(col_obs) <- names(pch_obs) <- obs_vars</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(0, type = "n", frame = frame,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = xlab, ylab = ylab,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = xlim,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylim = c(-1.2 * maxabs, 1.2 * maxabs), ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for(obs_var in obs_vars){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">1298<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> residuals_plot <- subset(object$data, variable == obs_var, c("time", res_col))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">1298<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> points(residuals_plot, pch = pch_obs[obs_var], col = col_obs[obs_var])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> abline(h = 0, lty = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">1228<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (legend == TRUE) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">91</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> legend(lpos, inset = c(0.05, 0.05), legend = obs_vars,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">92</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> col = col_obs[obs_vars], pch = pch_obs[obs_vars])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/plot.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Plot model fits (observed and fitted) and the residuals for a row or column</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of an mmkin object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' When x is a row selected from an mmkin object (\code{\link{[.mmkin}}), the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' same model fitted for at least one dataset is shown. When it is a column,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the fit of at least one model to the same dataset is shown.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' If the current plot device is a \code{\link[tikzDevice]{tikz}} device, then</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' latex is being used for the formatting of the chi2 error level.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An object of class \code{\link{mmkin}}, with either one row or one</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' column.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param main The main title placed on the outer margin of the plot.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param legends An index for the fits for which legends should be shown.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param resplot Should the residuals plotted against time, using</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{mkinresplot}}, or as squared residuals against predicted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' values, with the error model, using \code{\link{mkinerrplot}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ylab Label for the y axis.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param standardized Should the residuals be standardized? This option</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is passed to \code{\link{mkinresplot}}, it only takes effect if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' `resplot = "time"`.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param show_errmin Should the chi2 error level be shown on top of the plots</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to the left?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param errmin_var The variable for which the FOCUS chi2 error value should</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be shown.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param errmin_digits The number of significant digits for rounding the FOCUS</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' chi2 error percentage.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cex Passed to the plot functions and \code{\link{mtext}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param rel.height.middle The relative height of the middle plot, if more</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' than two rows of plots are shown.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ymax Maximum y axis value for \code{\link{plot.mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Further arguments passed to \code{\link{plot.mkinfit}} and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{mkinresplot}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The function is called for its side effect.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Only use one core not to offend CRAN checks</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits <- mmkin(c("FOMC", "HS"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list("FOCUS B" = FOCUS_2006_B, "FOCUS C" = FOCUS_2006_C), # named list for titles</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cores = 1, quiet = TRUE, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits[, "FOCUS C"])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits["FOMC", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits["FOMC", ], show_errmin = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We can also plot a single fit, if we like the way plot.mmkin works, but then the plot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # height should be smaller than the plot width (this is not possible for the html pages</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # generated by pkgdown, as far as I know).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits["FOMC", "FOCUS C"]) # same as plot(fits[1, 2])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Show the error models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(fits["FOMC", ], resplot = "errmod")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">plot.mmkin <- function(x, main = "auto", legends = 1,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> resplot = c("time", "errmod"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ylab = "Residue",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> standardized = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> show_errmin = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> errmin_var = "All data", errmin_digits = 3,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> cex = 0.7, rel.height.middle = 0.9,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ymax = "auto", ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> oldpar <- par(no.readonly = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> on.exit(par(oldpar, no.readonly = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.m <- nrow(x)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.d <- ncol(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> resplot <- match.arg(resplot)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We can handle either a row (different models, same dataset)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # or a column (same model, different datasets)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">77</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (n.m > 1 & n.d > 1) stop("Please select fits either for one model or for one dataset")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">78</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (n.m == 1 & n.d == 1) loop_over = "none"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">246<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (n.m > 1) loop_over <- "models"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (n.d > 1) loop_over <- "datasets"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.fits <- length(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set the main plot titles from the names of the models or the datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Will be integer indexes if no other names are present in the mmkin object</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (main == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> main = switch(loop_over,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> none = paste(rownames(x), colnames(x)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> models = colnames(x),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> datasets = rownames(x))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set relative plot heights, so the first and the last plot are the norm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # and the middle plots (if n.fits >2) are smaller by rel.height.middle</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rel.heights <- if (n.fits > 2) c(1, rep(rel.height.middle, n.fits - 2), 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else rep(1, n.fits)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> layout(matrix(1:(2 * n.fits), n.fits, 2, byrow = TRUE), heights = rel.heights)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(cex = cex)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i.fit in 1:n.fits) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Margins for top row of plots when we have more than one row</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Reduce bottom margin by 2.1 - hides x axis legend</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (i.fit == 1 & n.fits > 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(3.0, 4.1, 4.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Margins for middle rows of plots, if any</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (i.fit > 1 & i.fit < n.fits) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Reduce top margin by 2 after the first plot as we have no main title,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # reduced plot height, therefore we need rel.height.middle in the layout</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(3.0, 4.1, 2.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Margins for bottom row of plots when we have more than one row</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (i.fit == n.fits & n.fits > 1) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Restore bottom margin for last plot to show x axis legend</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">316<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(5.1, 4.1, 2.1, 2.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit <- x[[i.fit]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ymax == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> plot(fit, legend = legends == i.fit, ylab = ylab, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">125</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> plot(fit, legend = legends == i.fit, ylim = c(0, ymax), ylab = ylab, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">128</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> title(main, outer = TRUE, line = -2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_name <- switch(loop_over,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> models = rownames(x)[i.fit],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> datasets = colnames(x)[i.fit],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> none = "")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (show_errmin) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> chi2 <- signif(100 * mkinerrmin(fit)[errmin_var, "err.min"], errmin_digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Use LateX if the current plotting device is tikz</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (names(dev.cur()) == "tikz output") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">140</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> chi2_text <- paste0(fit_name, " $\\chi^2$ error level = ", chi2, "\\%")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> chi2_perc <- paste0(chi2, "%")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> chi2_text <- bquote(.(fit_name) ~ chi^2 ~ "error level" == .(chi2_perc))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">144</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mtext(chi2_text, cex = cex, line = 0.4)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">147</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> mtext(fit_name, cex = cex, line = 0.4)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (resplot == "time") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mkinresplot(fit, legend = FALSE, standardized = standardized, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">153</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> mkinerrplot(fit, legend = FALSE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">155</td> + <td class="coverage">948<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mtext(paste(fit_name, "residuals"), cex = cex, line = 0.4)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/summary.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Summary method for class "mmkin"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Shows status information on the [mkinfit] objects contained in the object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and gives an overview of ill-defined parameters calculated by [illparms].</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object an object of class [mmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x an object of class \code{summary.mmkin}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param conf.level confidence level for testing parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits number of digits to use for printing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots optional arguments passed to methods like \code{print}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fits <- mmkin(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c("SFO", "FOMC"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list("FOCUS A" = FOCUS_2006_A,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "FOCUS C" = FOCUS_2006_C),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' quiet = TRUE, cores = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(fits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">summary.mmkin <- function(object, conf.level = 0.95, ...) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">23</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ans <- list(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">24</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> err_mod = object[[1, 1]]$err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">25</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> time = attr(object, "time"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">26</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> illparms = illparms(object),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">27</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> status = status(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">30</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(ans) <- c("summary.mmkin")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ans)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname summary.mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.summary.mmkin <- function(x, digits = max(3, getOption("digits") - 3), ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">37</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$err_mod)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">38</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Error model: ")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(switch(x$err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> const = "Constant variance",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs = "Variance unique to each observed variable",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tc = "Two-component variance function"), "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Fitted in", x$time[["elapsed"]], "s\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStatus:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$status)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x$illparms != "")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nIll-defined parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$illparms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> invisible(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/read_spreadsheet.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Read datasets and relevant meta information from a spreadsheet file</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function imports one dataset from each sheet of a spreadsheet file.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' These sheets are selected based on the contents of a sheet 'Datasets', with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a column called 'Dataset Number', containing numbers identifying the dataset</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sheets to be read in. In the second column there must be a grouping</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variable, which will often be named 'Soil'. Optionally, time normalization</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' factors can be given in columns named 'Temperature' and 'Moisture'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' There must be a sheet 'Compounds', with columns 'Name' and 'Acronym'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The first row read after the header read in from this sheet is assumed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to contain name and acronym of the parent compound.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The dataset sheets should be named using the dataset numbers read in from</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the 'Datasets' sheet, i.e. '1', '2', ... . In each dataset sheet, the name</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the observed variable (e.g. the acronym of the parent compound or</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' one of its transformation products) should be in the first column,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the time values should be in the second colum, and the observed value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in the third column.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' In case relevant covariate data are available, they should be given</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in a sheet 'Covariates', containing one line for each value of the grouping</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variable specified in 'Datasets'. These values should be in the first</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' column and the column must have the same name as the second column in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 'Datasets'. Covariates will be read in from columns four and higher.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Their names should preferably not contain special characters like spaces,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' so they can be easily used for specifying covariate models.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A similar data structure is defined as the R6 class [mkindsg], but</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is probably more complicated to use.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param path Absolute or relative path to the spreadsheet file</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param valid_datasets Optional numeric index of the valid datasets, default is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to use all datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param parent_only Should only the parent data be used?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param normalize Should the time scale be normalized using temperature</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and moisture normalisation factors in the sheet 'Datasets'?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">read_spreadsheet <- function(path, valid_datasets = "all",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_only = FALSE, normalize = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!requireNamespace("readxl", quietly = TRUE))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">43</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Please install the readxl package to use this function")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Read the compound table</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> compounds <- readxl::read_excel(path, sheet = "Compounds")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent <- compounds[1, ]$Acronym</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Read in meta information</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_meta <- readxl::read_excel(path, sheet = "Datasets")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_meta["Dataset Number"] <- as.character(ds_meta[["Dataset Number"]])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Select valid datasets</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">54</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (valid_datasets[1] == "all") valid_datasets <- 1:nrow(ds_meta)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_numbers_valid <- ds_meta[valid_datasets, ]$`Dataset Number`</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> grouping_factor <- names(ds_meta[2]) # Often "Soil"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Read in valid datasets</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_raw <- lapply(ds_numbers_valid,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> function(dsn) readxl::read_excel(path, sheet = as.character(dsn)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Make data frames compatible with mmkin</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_tmp <- lapply(ds_raw, function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">1287<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_ret <- x[1:3] |></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">1287<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rlang::set_names(c("name", "time", "value")) |></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">1287<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform(value = as.numeric(value))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(ds_tmp) <- ds_numbers_valid</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Normalize with temperature and moisture correction factors</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (normalize) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_norm <- lapply(ds_numbers_valid, function(ds_number) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">1287<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_corr <- as.numeric(ds_meta[ds_number, c("Temperature", "Moisture")])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">1287<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_corr <- ds_tmp[[ds_number]] |></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">1287<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transform(time = time * f_corr[1] * f_corr[2])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">1287<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ds_corr)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">79</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ds_norm <- ds_tmp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(ds_norm) <- ds_numbers_valid</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Select parent data only if requested</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (parent_only) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">85</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ds_norm <- lapply(ds_norm, function(x) subset(x, name == parent))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">86</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> compounds <- compounds[1, ]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Create a single long table to combine datasets with the same group name</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_all <- vctrs::vec_rbind(!!!ds_norm, .names_to = "Dataset Number")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds_all_group <- merge(ds_all, ds_meta[c("Dataset Number", grouping_factor)])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> groups <- unique(ds_meta[valid_datasets, ][[grouping_factor]])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ds <- lapply(groups, function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">819<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ret <- ds_all_group[ds_all_group[[grouping_factor]] == x, ]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">819<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ret[c("name", "time", "value")]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(ds) <- groups</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get covariates</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates_raw <- readxl::read_excel(path, sheet = "Covariates")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates <- as.data.frame(covariates_raw[4:ncol(covariates_raw)])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nocov <- setdiff(groups, covariates_raw[[1]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(nocov) > 0) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">106</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> message("Did not find covariate data for ", paste(nocov, collapse = ", "))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">107</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> message("Not returning covariate data")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">108</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> attr(ds, "covariates") <- NULL</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(covariates) <- covariates_raw[[1]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates <- covariates[which(colnames(covariates) != "Remarks")]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Attach covariate data if available</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(ds, "covariates") <- covariates[groups, , drop = FALSE]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Attach the compound list to support automatic model building</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(ds, "compounds") <- as.data.frame(compounds)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ds)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/CAKE_export.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Export a list of datasets format to a CAKE study file</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' In addition to the datasets, the pathways in the degradation model can be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' specified as well.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ds A named list of datasets in long format as compatible with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param map A character vector with CAKE compartment names (Parent, A1, ...),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' named with the names used in the list of datasets.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param links An optional character vector of target compartments, named with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the names of the source compartments. In order to make this easier, the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names are used as in the datasets supplied.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param filename Where to write the result. Should end in .csf in order to be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' compatible with CAKE.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param path An optional path to the output file.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param overwrite If TRUE, existing files are overwritten.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param study The name of the study.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param description An optional description.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param time_unit The time unit for the residue data.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param res_unit The unit used for the residues.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param comment An optional comment.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param date The date of file creation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param optimiser Can be OLS or IRLS.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom utils write.table</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The function is called for its side effect.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">CAKE_export <- function(ds, map = c(parent = "Parent"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> links = NA,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> filename = "CAKE_export.csf", path = ".", overwrite = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> study = "Degradinol aerobic soil degradation",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> description = "",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> time_unit = "days",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> res_unit = "% AR",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> comment = "",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> date = Sys.Date(),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> optimiser = "IRLS")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">741<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> file <- file.path(path, filename)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (file.exists(file) & !overwrite) stop(file, " already exists, stopping")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> csf <- file(file, encoding = "latin1", open = "w+")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> on.exit(close(csf))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> CAKE_compartments = c("Parent", "A1", "A2", "A3", "B1", "B2", "C1")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!all(map %in% CAKE_compartments)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("The elements of map have to be CAKE compartment names")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add <- function(x) cat(paste0(x, "\r\n"), file = csf, append = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add0 <- function(x) cat(x, file = csf, append = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("[FileInfo]")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("CAKE-Version: 3.4 (Release)")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste("Name:", study))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste("Description:", description))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste("MeasurementUnits:", res_unit))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste("TimeUnits:", time_unit))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste("Comments:", comment))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste("Date:", date))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste("Optimiser:", optimiser))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("[Data]")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in seq_along(ds)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste("NewDataSet:", names(ds)[i]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d <- mkin_long_to_wide(ds[[i]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(d) <- c("Time", map[names(d)[-1]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> write.table(d, csf,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sep = "\t", col.names = TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = FALSE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> quote = FALSE, eol = "\r\n", na = "")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(links)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("[Model]")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste0("ParentCompartment: Parent\t", names(map)[1], "\t", names(map)[1]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (name in names(map)[-1]) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste0("Compartment: ", map[name], "\t", name, "\t", name))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (li in names(links)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste0("Link: ", map[li], "\t", map[links[li]], "\t0.5\t0\t1\tFree\tExplicit"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add("[ComponentNames]")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (name in names(map)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> add(paste0(map[name], ":", name))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/summary_listing.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Display the output of a summary function according to the output format</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function is intended for use in a R markdown code chunk with the chunk</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' option `results = "asis"`.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object The object for which the summary is to be listed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param caption An optional caption</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param label An optional label, ignored in html output</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param clearpage Should a new page be started after the listing? Ignored in html output</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">summary_listing <- function(object, caption = NULL, label = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> clearpage = TRUE) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">13</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (knitr::is_latex_output()) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">14</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> tex_listing(object = object, caption = caption, label = label,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">15</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> clearpage = clearpage)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">17</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (knitr::is_html_output()) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">18</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> html_listing(object = object, caption = caption)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname summary_listing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">tex_listing <- function(object, caption = NULL, label = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> clearpage = TRUE) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">26</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">27</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\begin{listing}", "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">28</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(caption)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">29</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\caption{", caption, "}", "\n", sep = "")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">31</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(label)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">32</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\caption{", label, "}", "\n", sep = "")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">34</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\begin{snugshade}", "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">35</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\scriptsize", "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">36</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\begin{verbatim}", "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">37</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat(capture.output(suppressWarnings(summary(object))), sep = "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">38</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">39</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\end{verbatim}", "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">40</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\end{snugshade}", "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">41</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\end{listing}", "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">42</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (clearpage) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">43</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\\clearpage", "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname summary_listing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">html_listing <- function(object, caption = NULL) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">50</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">51</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(caption)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">52</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("<caption>", caption, "</caption>", "\n", sep = "")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">54</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("<pre><code>\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">55</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat(capture.output(suppressWarnings(summary(object))), sep = "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">56</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">57</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("</pre></code>\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/multistart.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Perform a hierarchical model fit with multiple starting values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The purpose of this method is to check if a certain algorithm for fitting</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' nonlinear hierarchical models (also known as nonlinear mixed-effects models)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' will reliably yield results that are sufficiently similar to each other, if</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' started with a certain range of reasonable starting parameters. It is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' inspired by the article on practical identifiabiliy in the frame of nonlinear</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mixed-effects models by Duchesne et al (2021).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object The fit object to work with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param n How many different combinations of starting parameters should be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' used?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cores How many fits should be run in parallel (only on posix platforms)?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cluster A cluster as returned by [parallel::makeCluster] to be used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for parallel execution.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Passed to the update function.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x The multistart object to print</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A list of [saem.mmkin] objects, with class attributes</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 'multistart.saem.mmkin' and 'multistart'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso [parplot], [llhist]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references Duchesne R, Guillemin A, Gandrillon O, Crauste F. Practical</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' identifiability in the frame of nonlinear mixed effects models: the example</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the in vitro erythropoiesis. BMC Bioinformatics. 2021 Oct 4;22(1):478.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' doi: 10.1186/s12859-021-04373-4.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(mkin)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dmta_ds <- lapply(1:7, function(i) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_i <- dimethenamid_2018$ds[[i]]$data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_i[ds_i$name == "DMTAP", "name"] <- "DMTA"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_i</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dmta_ds[["Elliot 1"]] <- dmta_ds[["Elliot 2"]] <- NULL</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mmkin <- mmkin("DFOP", dmta_ds, error_model = "tc", cores = 7, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_full <- saem(f_mmkin)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_full_multi <- multistart(f_saem_full, n = 16, cores = 16)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parplot(f_saem_full_multi, lpos = "topleft")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(f_saem_full)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_reduced <- update(f_saem_full, no_random_effect = "log_k2")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(f_saem_reduced)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # On Windows, we need to create a PSOCK cluster first and refer to it</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # in the call to multistart()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(parallel)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cl <- makePSOCKcluster(12)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_reduced_multi <- multistart(f_saem_reduced, n = 16, cluster = cl)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parplot(f_saem_reduced_multi, lpos = "topright", ylim = c(0.5, 2))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' stopCluster(cl)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">multistart <- function(object, n = 50,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> cores = if (Sys.info()["sysname"] == "Windows") 1 else parallel::detectCores(),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> cluster = NULL, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("multistart", object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname multistart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">multistart.saem.mmkin <- function(object, n = 50, cores = 1,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> cluster = NULL, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- match.call()</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">68</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (n <= 1) stop("Please specify an n of at least 2")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mmkin_object <- object$mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mmkin_parms <- parms(mmkin_object, errparms = FALSE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> transformed = object$transformations == "mkin")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> start_parms <- apply(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mmkin_parms, 1,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> function(x) stats::runif(n, min(x), max(x)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saem_call <- object$call</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saem_call[[1]] <- saem</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saem_call[[2]] <- mmkin_object</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> i_startparms <- which(names(saem_call) == "degparms_start")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fit_function <- function(x) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> new_startparms <- str2lang(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste0(capture.output(dput(start_parms[x, ])),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> collapse = ""))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(i_startparms) == 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saem_call <- c(as.list(saem_call), degparms_start = new_startparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> saem_call <- as.call(saem_call)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">93</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> saem_call[i_startparms] <- new_startparms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ret <- eval(saem_call)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ret)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(cluster)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- parallel::mclapply(1:n, fit_function,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">200<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mc.cores = cores, mc.preschedule = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">105</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> res <- parallel::parLapplyLB(cluster, 1:n, fit_function)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">184<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(res, "orig") <- object</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">184<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(res, "start_parms") <- start_parms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">184<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(res, "call") <- call</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">184<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(res) <- c("multistart.saem.mmkin", "multistart")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">184<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">status.multistart <- function(object, ...) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">116</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> all_summary_warnings <- character()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">118</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> result <- lapply(object,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">119</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> function(fit) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">120</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit, "try-error")) return("E")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">122</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return("OK")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">125</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> result <- unlist(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">127</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> class(result) <- "status.multistart"</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">128</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">130</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">status.multistart.saem.mmkin <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> all_summary_warnings <- character()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- lapply(object,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> function(fit) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">137</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(fit$so, "try-error")) return("E")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">704<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return("OK")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> })</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- unlist(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(result) <- "status.multistart"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.status.multistart <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(x) <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(table(x, dnn = NULL))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">152</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "OK")) cat("OK: Fit terminated successfully\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">153</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x == "E")) cat("E: Error\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname multistart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.multistart <- function(x, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("<multistart> object with", length(x), "fits:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">88<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(status(x))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">161</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">162</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname multistart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">best <- function(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">184<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("best", object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">169</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">171</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The object with the highest likelihood</pre> + </td> + </tr> + <tr class="never"> + <td class="num">172</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname multistart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">173</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">best.default <- function(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">174</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">184<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(object[[which.best(object)]])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">177</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">178</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The index of the object with the highest likelihood</pre> + </td> + </tr> + <tr class="never"> + <td class="num">179</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname multistart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">181</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">which.best <- function(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">182</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">360<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("which.best", object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">184</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">186</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname multistart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">187</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">188</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">which.best.default <- function(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">190</td> + <td class="coverage">360<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llfunc <- function(object) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">191</td> + <td class="coverage">2528<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ret <- try(logLik(object))</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">192</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(ret, "try-error")) return(NA)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">193</td> + <td class="coverage">2528<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else return(ret)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">360<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ll <- sapply(object, llfunc)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">360<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(which.max(ll))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">198</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">199</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">200</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">update.multistart <- function(object, ..., evaluate = TRUE) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">201</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> call <- attr(object, "call")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">202</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # For some reason we get multistart.saem.mmkin in call[[1]] when using multistart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # from the loaded package so we need to fix this so we do not have to export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">204</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # multistart.saem.mmkin</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">205</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> call[[1]] <- multistart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">206</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">207</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments <- match.call(expand.dots = FALSE)$...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">208</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">209</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(update_arguments) > 0) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">210</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_in_call <- !is.na(match(names(update_arguments), names(call)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">211</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">212</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">213</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> for (a in names(update_arguments)[update_arguments_in_call]) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">214</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> call[[a]] <- update_arguments[[a]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">216</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">217</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_not_in_call <- !update_arguments_in_call</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">218</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if(any(update_arguments_not_in_call)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">219</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> call <- c(as.list(call), update_arguments[update_arguments_not_in_call])</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">220</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> call <- as.call(call)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">222</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if(evaluate) eval(call, parent.frame())</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">223</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> else call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">224</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/lrtest.mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom lmtest lrtest</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">lmtest::lrtest</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Likelihood ratio test for mkinfit models</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Compare two mkinfit models based on their likelihood. If two fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinfit objects are given as arguments, it is checked if they have been</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fitted to the same data. It is the responsibility of the user to make sure</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' that the models are nested, i.e. one of them has less degrees of freedom</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and can be expressed by fixing the parameters of the other.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Alternatively, an argument to mkinfit can be given which is then passed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to \code{\link{update.mkinfit}} to obtain the alternative model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The comparison is then made by the \code{\link[lmtest]{lrtest.default}}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' method from the lmtest package. The model with the higher number of fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters (alternative hypothesis) is listed first, then the model with the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lower number of fitted parameters (null hypothesis).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats logLik update</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An \code{\link{mkinfit}} object, or an \code{\link{mmkin}} column</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' object containing two fits to the same data.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object_2 Optionally, another mkinfit object fitted to the same data.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Argument to \code{\link{mkinfit}}, passed to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{update.mkinfit}} for creating the alternative fitted object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' test_data <- subset(synthetic_data_for_UBA_2014[[12]]$data, name == "parent")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sfo_fit <- mkinfit("SFO", test_data, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dfop_fit <- mkinfit("DFOP", test_data, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lrtest(dfop_fit, sfo_fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lrtest(sfo_fit, dfop_fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The following two examples are commented out as they fail during</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # generation of the static help pages by pkgdown</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #lrtest(dfop_fit, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #lrtest(dfop_fit, fixed_parms = c(k2 = 0))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # However, this equivalent syntax also works for static help pages</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lrtest(dfop_fit, update(dfop_fit, error_model = "tc"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lrtest(dfop_fit, update(dfop_fit, fixed_parms = c(k2 = 0)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">lrtest.mkinfit <- function(object, object_2 = NULL, ...) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">6<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name_function <- function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_name <- paste(x$mkinmod$name, "with error model", x$err_mod)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(x$bparms.fixed) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">7<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_name <- paste(object_name,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">7<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "and fixed parameter(s)",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">7<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste(names(x$bparms.fixed), collapse = ", "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(object_name)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">6<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(object_2)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">58</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object_2 <- update(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">6<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data_object <- object$data[c("time", "variable", "observed")]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">6<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data_object_2 <- object_2$data[c("time", "variable", "observed")]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">6<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!identical(data_object, data_object_2)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("It seems that the mkinfit objects have not been fitted to the same data")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (attr(logLik(object), "df") > attr(logLik(object_2), "df")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lmtest::lrtest.default(object, object_2, name = name_function)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lmtest::lrtest.default(object_2, object, name = name_function)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname lrtest.mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">lrtest.mmkin <- function(object, ...) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">76</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(object) != 2 | ncol(object) > 1) stop("Only works for a column containing two mkinfit objects")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">77</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object[[1, 1]]$mkinmod$name <- rownames(object)[1]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">78</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object[[2, 1]]$mkinmod$name <- rownames(object)[2]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">79</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> lrtest(object[[1, 1]], object[[2, 1]])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/aw.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Calculate Akaike weights for model averaging</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Akaike weights are calculated based on the relative</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' expected Kullback-Leibler information as specified</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' by Burnham and Anderson (2004).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An [mmkin] column object, containing two or more</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' [mkinfit] models that have been fitted to the same data,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' or an mkinfit object. In the latter case, further mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' objects fitted to the same data should be specified</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' as dots arguments.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Not used in the method for [mmkin] column objects,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' further [mkinfit] objects in the method for mkinfit objects.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references Burnham KP and Anderson DR (2004) Multimodel</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Inference: Understanding AIC and BIC in Model Selection.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' *Sociological Methods & Research* **33**(2) 261-304</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @md</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_sfo <- mkinfit("SFO", FOCUS_2006_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_dfop <- mkinfit("DFOP", FOCUS_2006_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' aw_sfo_dfop <- aw(f_sfo, f_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sum(aw_sfo_dfop)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' aw_sfo_dfop # SFO gets more weight as it has less parameters and a similar fit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mmkin(c("SFO", "FOMC", "DFOP"), list("FOCUS D" = FOCUS_2006_D), cores = 1, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' aw(f)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sum(aw(f))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' aw(f[c("SFO", "DFOP")])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">1482<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r">aw <- function(object, ...) UseMethod("aw")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">.aw <- function(all_objects) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">34</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> AIC_all <- sapply(all_objects, AIC)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">35</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> delta_i <- AIC_all - min(AIC_all)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">36</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> denom <- sum(exp(-delta_i/2))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">37</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> w_i <- exp(-delta_i/2) / denom</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">38</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(w_i)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname aw</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">aw.mkinfit <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">988<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> oo <- list(...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">988<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data_object <- object$data[c("time", "variable", "observed")]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">988<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in seq_along(oo)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!inherits(oo[[i]], "mkinfit")) stop("Please supply only mkinfit objects")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">988<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data_other_object <- oo[[i]]$data[c("time", "variable", "observed")]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">988<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!identical(data_object, data_other_object)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("It seems that the mkinfit objects have not all been fitted to the same data")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> all_objects <- list(object, ...)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> .aw(all_objects)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname aw</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">aw.mmkin <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ncol(object) > 1) stop("Please supply an mmkin column object")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> do.call(aw, object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname aw</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">aw.mixed.mmkin <- function(object, ...) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">67</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> oo <- list(...)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">68</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> data_object <- object$data[c("ds", "name", "time", "value")]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">69</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in seq_along(oo)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">70</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!inherits(oo[[i]], "mixed.mmkin")) stop("Please supply objects inheriting from mixed.mmkin")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">71</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> data_other_object <- oo[[i]]$data[c("ds", "name", "time", "value")]</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">72</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!identical(data_object, data_other_object)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">73</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("It seems that the mixed.mmkin objects have not all been fitted to the same data")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">76</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> all_objects <- list(object, ...)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">77</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> .aw(all_objects)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname aw</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">aw.multistart <- function(object, ...) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">83</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> do.call(aw, object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mean_degparms.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Calculate mean degradation parameters for an mmkin row object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return If random is FALSE (default), a named vector containing mean values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the fitted degradation model parameters. If random is TRUE, a list with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fixed and random effects, in the format required by the start argument of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' nlme for the case of a single grouping variable ds.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An mmkin row object containing several fits of the same model to different datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param random Should a list with fixed and random effects be returned?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param test_log_parms If TRUE, log parameters are only considered in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the mean calculations if their untransformed counterparts (most likely</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rate constants) pass the t-test for significant difference from zero.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param conf.level Possibility to adjust the required confidence level</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for parameter that are tested if requested by 'test_log_parms'.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param default_log_parms If set to a numeric value, this is used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' as a default value for the tested log parameters that failed the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' t-test.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mean_degparms <- function(object, random = FALSE, test_log_parms = FALSE, conf.level = 0.6,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> default_log_parms = NA)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">21</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(object) > 1) stop("Only row objects allowed")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">22</td> + <td class="coverage">7271<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_mat_trans <- sapply(object, parms, transformed = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">24</td> + <td class="coverage">7271<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (test_log_parms) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">25</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_mat_dim <- dim(parm_mat_trans)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">26</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_mat_dimnames <- dimnames(parm_mat_trans)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">28</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> log_parm_trans_names <- grep("^log_", rownames(parm_mat_trans), value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">29</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> log_parm_names <- gsub("^log_", "", log_parm_trans_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t_test_back_OK <- matrix(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sapply(object, function(o) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">49860<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> suppressWarnings(summary(o)$bpar[log_parm_names, "Pr(>t)"] < (1 - conf.level))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">34</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> }), nrow = length(log_parm_names))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">35</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(t_test_back_OK) <- log_parm_trans_names</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">37</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_mat_trans_OK <- parm_mat_trans</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">38</td> + <td class="coverage">4668<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (trans_parm in log_parm_trans_names) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">9398<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_mat_trans_OK[trans_parm, ] <- ifelse(t_test_back_OK[trans_parm, ],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">9398<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_mat_trans[trans_parm, ], log(default_log_parms))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">2603<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm_mat_trans_OK <- parm_mat_trans</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">7271<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mean_degparm_names <- setdiff(rownames(parm_mat_trans), names(object[[1]]$errparms))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">7271<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparm_mat_trans <- parm_mat_trans[mean_degparm_names, , drop = FALSE]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">7271<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> degparm_mat_trans_OK <- parm_mat_trans_OK[mean_degparm_names, , drop = FALSE]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # fixed in the sense of fixed effects, as this function was</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # written to supply starting parameters for nlme</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">7271<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed <- apply(degparm_mat_trans_OK, 1, mean, na.rm = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">7271<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (random) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">2322<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> random <- t(apply(degparm_mat_trans[mean_degparm_names, , drop = FALSE], 2, function(column) column - fixed))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # If we only have one parameter, apply returns a vector so we get a single row</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">56</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (nrow(degparm_mat_trans) == 1) random <- t(random)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">2322<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(random) <- levels(nlme_data(object)$ds)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # For nlmixr we can specify starting values for standard deviations eta, and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # we ignore uncertain parameters if test_log_parms is FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">2322<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> eta <- apply(degparm_mat_trans_OK, 1, stats::sd, na.rm = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">2322<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(list(fixed = fixed, random = list(ds = random), eta = eta))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">4949<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(fixed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/ilr.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># This file is part of the R package mkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># mkin is free software: you can redistribute it and/or modify it under the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># terms of the GNU General Public License as published by the Free Software</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># Foundation, either version 3 of the License, or (at your option) any later</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># version.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># This program is distributed in the hope that it will be useful, but WITHOUT</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># FOR A PARTICULAR PURPOSE. See the GNU General Public License for more</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># details.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># You should have received a copy of the GNU General Public License along with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"># this program. If not, see <http://www.gnu.org/licenses/></pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function to perform isometric log-ratio transformation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This implementation is a special case of the class of isometric log-ratio</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' transformations.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @aliases ilr invilr</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x A numeric vector. Naturally, the forward transformation is only</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sensible for vectors with all elements being greater than zero.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The result of the forward or backward transformation. The returned</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' components always sum to 1 for the case of the inverse log-ratio</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' transformation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author René Lehmann and Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso Another implementation can be found in R package</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{robCompositions}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references Peter Filzmoser, Karel Hron (2008) Outlier Detection for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Compositional Data Using Robust Methods. Math Geosci 40 233-248</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @keywords manip</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Order matters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ilr(c(0.1, 1, 10))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ilr(c(10, 1, 0.1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Equal entries give ilr transformations with zeros as elements</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ilr(c(3, 3, 3))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Almost equal entries give small numbers</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ilr(c(0.3, 0.4, 0.3))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Only the ratio between the numbers counts, not their sum</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' invilr(ilr(c(0.7, 0.29, 0.01)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' invilr(ilr(2.1 * c(0.7, 0.29, 0.01)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Inverse transformation of larger numbers gives unequal elements</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' invilr(-10)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' invilr(c(-10, 0))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The sum of the elements of the inverse ilr is 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sum(invilr(c(-10, 0)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # This is why we do not need all elements of the inverse transformation to go back:</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a <- c(0.1, 0.3, 0.5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' b <- invilr(a)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' length(b) # Four elements</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ilr(c(b[1:3], 1 - sum(b[1:3]))) # Gives c(0.1, 0.3, 0.5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">ilr <- function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> z <- vector()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 1:(length(x) - 1)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">44<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> z[i] <- sqrt(i/(i+1)) * log((prod(x[1:i]))^(1/i) / x[i+1])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">16<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(z)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname ilr</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">invilr<-function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> D <- length(x) + 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> z <- c(x, 0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> y <- rep(0, D)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> s <- sqrt(1:D*2:(D+1))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> q <- z/s</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> y[1] <- sum(q[1:D])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 2:D) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">1585969<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> y[i] <- sum(q[i:D]) - sqrt((i-1)/i) * z[i-1]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> z <- vector()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 1:D) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">2115270<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> z[i] <- exp(y[i])/sum(exp(y))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Work around a numerical problem with NaN values returned by the above</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Only works if there is only one NaN value: replace it with 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # if the sum of the other components is < 1e-10</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (sum(is.na(z)) == 1 && sum(z[!is.na(z)]) < 1e-10)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">86</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> z = ifelse(is.na(z), 1, z)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">529301<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(z)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/max_twa_parent.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function to calculate maximum time weighted average concentrations from</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' kinetic models fitted with mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function calculates maximum moving window time weighted average</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' concentrations (TWAs) for kinetic models fitted with \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Currently, only calculations for the parent are implemented for the SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOMC, DFOP and HS models, using the analytical formulas given in the PEC</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' soil section of the FOCUS guidance.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @aliases max_twa_parent max_twa_sfo max_twa_fomc max_twa_dfop max_twa_hs</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param fit An object of class \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param windows The width of the time windows for which the TWAs should be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' calculated.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param M0 The initial concentration for which the maximum time weighted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' average over the decline curve should be calculated. The default is to use</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a value of 1, which means that a relative maximum time weighted average</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' factor (f_twa) is calculated.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k The rate constant in the case of SFO kinetics.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param t The width of the time window.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param alpha Parameter of the FOMC model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param beta Parameter of the FOMC model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k1 The first rate constant of the DFOP or the HS kinetics.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k2 The second rate constant of the DFOP or the HS kinetics.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param g Parameter of the DFOP model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param tb Parameter of the HS model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return For \code{max_twa_parent}, a numeric vector, named using the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{windows} argument. For the other functions, a numeric vector of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' length one (also known as 'a number').</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references FOCUS (2006) \dQuote{Guidance Document on Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit("FOMC", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' max_twa_parent(fit, c(7, 21))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">max_twa_parent <- function(fit, windows) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.all <- c(fit$bparms.optim, fit$bparms.fixed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_vars <- fit$obs_vars</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(obs_vars) > 1) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">45</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> warning("Calculation of maximum time weighted average concentrations is",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">46</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> "currently only implemented for the parent compound using",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">47</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> "analytical solutions")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_var <- obs_vars[1]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> spec = fit$mkinmod$spec</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> type = spec[[1]]$type</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> M0 <- parms.all[paste0(obs_var, "_0")]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "SFO") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k_name <- paste0("k_", obs_var)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (fit$mkinmod$use_of_ff == "min") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">58</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> k_name <- paste0(k_name, "_sink")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k <- parms.all[k_name]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> twafunc <- function(t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> max_twa_sfo(M0, k, t)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "FOMC") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> alpha <- parms.all["alpha"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> beta <- parms.all["beta"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> twafunc <- function(t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> max_twa_fomc(M0, alpha, beta, t)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "DFOP") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1 <- parms.all["k1"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- parms.all["k2"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> g <- parms.all["g"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> twafunc <- function(t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> max_twa_dfop(M0, k1, k2, g, t)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type == "HS") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k1 <- parms.all["k1"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> k2 <- parms.all["k2"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tb <- parms.all["tb"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> twafunc <- function(t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(t <= tb,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> max_twa_sfo(M0, k1, t),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> max_twa_hs(M0, k1, k2, tb, t)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type %in% c("IORE", "SFORB")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">92</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Calculation of maximum time weighted average concentrations is currently ",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">93</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> "not implemented for the ", type, " model.")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- twafunc(windows)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(res) <- windows</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname max_twa_parent</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">max_twa_sfo <- function(M0 = 1, k, t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> M0 * (1 - exp(- k * t)) / (k * t)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname max_twa_parent</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">max_twa_fomc <- function(M0 = 1, alpha, beta, t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> M0 * (beta)/(t * (1 - alpha)) * ((t/beta + 1)^(1 - alpha) - 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname max_twa_parent</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">max_twa_dfop <- function(M0 = 1, k1, k2, g, t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> M0/t * ((g/k1) * (1 - exp(- k1 * t)) + ((1 - g)/k2) * (1 - exp(- k2 * t)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname max_twa_parent</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">max_twa_hs <- function(M0 = 1, k1, k2, tb, t) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">121</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (M0 / t) * (</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (1/k1) * (1 - exp(- k1 * tb)) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (exp(- k1 * tb) / k2) * (1 - exp(- k2 * (t - tb)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/f_time_norm_focus.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables("D24_2014")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Normalisation factors for aerobic soil degradation according to FOCUS guidance</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Time step normalisation factors for aerobic soil degradation as described</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in Appendix 8 to the FOCUS kinetics guidance (FOCUS 2014, p. 369).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An object containing information used for the calculations</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param temperature Numeric vector of temperatures in °C</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param moisture Numeric vector of moisture contents in \\% w/w</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param field_moisture Numeric vector of moisture contents at field capacity</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' (pF2) in \\% w/w</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param study_moisture_ref_source Source for the reference value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' used to calculate the study moisture. If 'auto', preference is given</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to a reference moisture given in the meta information, otherwise</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the focus soil moisture for the soil class is used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param Q10 The Q10 value used for temperature normalisation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param walker The Walker exponent used for moisture normalisation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param f_na The factor to use for NA values. If set to NA, only factors</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for complete cases will be returned.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Currently not used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS (2006) \dQuote{Guidance Document on Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS (2014) \dQuote{Generic guidance for Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Version 1.1, 18 December 2014</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso [focus_soil_moisture]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_time_norm_focus(25, 20, 25) # 1.37, compare FOCUS 2014 p. 184</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' D24_2014$meta</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # No moisture normalisation in the first dataset, so we use f_na = 1 to get</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # temperature only normalisation as in the EU evaluation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_time_norm_focus(D24_2014, study_moisture_ref_source = "focus", f_na = 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">f_time_norm_focus <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">765<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("f_time_norm_focus")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname f_time_norm_focus</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">f_time_norm_focus.numeric <- function(object,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> moisture = NA, field_moisture = NA,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> temperature = object,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> Q10 = 2.58, walker = 0.7, f_na = NA, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_temp <- ifelse(is.na(temperature),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_na,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(temperature <= 0,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> 0,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> Q10^((temperature - 20)/10)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_moist <- ifelse(is.na(moisture),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_na,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(moisture >= field_moisture,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> 1,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (moisture / field_moisture)^walker))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_time_norm <- f_temp * f_moist</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">459<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_time_norm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname f_time_norm_focus</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">f_time_norm_focus.mkindsg <- function(object,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture_ref_source = c("auto", "meta", "focus"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> Q10 = 2.58, walker = 0.7, f_na = NA, ...) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture_ref_source <- match.arg(study_moisture_ref_source)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> meta <- object$meta</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(meta$field_moisture)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> field_moisture <- focus_soil_moisture[meta$usda_soil_type, "pF2"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">79</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> field_moisture <- ifelse(is.na(meta$field_moisture),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">80</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> focus_soil_moisture[meta$usda_soil_type, "pF2"],</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">81</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> meta$field_moisture)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture_ref_focus <-</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> focus_soil_moisture[as.matrix(meta[c("usda_soil_type", "study_moisture_ref_type")])]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (study_moisture_ref_source == "auto") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture_ref <- ifelse (is.na(meta$study_ref_moisture),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture_ref_focus,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> meta$study_ref_moisture)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (study_moisture_ref_source == "meta") {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">93</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture_ref <- meta$study_moisture_ref</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">153<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture_ref <- study_moisture_ref_focus</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if ("study_moisture" %in% names(meta)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">100</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture <- ifelse(is.na(meta$study_moisture),</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">101</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> meta$rel_moisture * study_moisture_ref,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">102</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> meta$study_moisture)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> study_moisture <- meta$rel_moisture * study_moisture_ref</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$f_time_norm <- f_time_norm_focus(meta$temperature,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> moisture = study_moisture, field_moisture = field_moisture,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> Q10 = Q10, walker = walker, f_na = f_na)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> message("$f_time_norm was (re)set to normalised values")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">306<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> invisible(object$f_time_norm)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinds.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A dataset class for mkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @description</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' At the moment this dataset class is hardly used in mkin. For example,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinfit does not take mkinds datasets as argument, but works with dataframes</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' such as the on contained in the data field of mkinds objects. Some datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' provided by this package come as mkinds objects nevertheless.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom R6 R6Class</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mds <- mkinds$new("FOCUS A", FOCUS_2006_A)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(mds)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinds <- R6Class("mkinds",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> public = list(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field title A full title for the dataset</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> title = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field sampling_times The sampling times</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> sampling_times = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field time_unit The time unit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> time_unit = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field observed Names of the observed variables</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> observed = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field unit The unit of the observations</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> unit = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field replicates The maximum number of replicates per sampling time</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> replicates = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field data A data frame with at least the columns name, time</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' and value in order to be compatible with mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> data = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @description</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' Create a new mkinds object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @param title The dataset title</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @param data The data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @param time_unit The time unit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @param unit The unit of the observations</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> initialize = function(title = "", data, time_unit = NA, unit = NA) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$title <- title</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$sampling_times <- sort(unique(data$time))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$time_unit <- time_unit</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$observed <- unique(data$name)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$unit <- unit</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$replicates <- max(by(data, list(data$name, data$time), nrow))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(data$override)) data$override <- NA</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(data$err)) data$err <- 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">57</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$data <- data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Print mkinds objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mkinds</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An [mkinds] object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param data Should the data be printed?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Not used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.mkinds <- function(x, data = FALSE, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("<mkinds> with $title: ", x$title, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Observed compounds $observed: ", paste(x$observed, collapse = ", "), "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Sampling times $sampling_times:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(paste(x$sampling_times, collapse = ", "), "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("With a maximum of ", x$replicates, " replicates\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(x$time_unit)) cat("Time unit: ", x$time_unit, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(x$unit)) cat("Observation unit: ", x$unit, "\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">78</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (data) print(mkin_long_to_wide(x$data))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A class for dataset groups for mkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @description</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A container for working with datasets that share at least one compound,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' so that combined evaluations are desirable.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Time normalisation factors are initialised with a value of 1 for each</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dataset if no data are supplied.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mdsg <- mkindsg$new("Experimental X", experimental_data_for_UBA_2019[6:10])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(mdsg)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(mdsg, verbose = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(mdsg, verbose = TRUE, data = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkindsg <- R6Class("mkindsg",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> public = list(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field title A title for the dataset group</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> title = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field ds A list of mkinds objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ds = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field observed_n Occurrence counts of compounds in datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> observed_n = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field f_time_norm Time normalisation factors</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> f_time_norm = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @field meta A data frame with a row for each dataset,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' containing additional information in the form</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' of categorical data (factors) or numerical data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' (e.g. temperature, moisture,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' or covariates like soil pH).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> meta = NULL,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @description</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' Create a new mkindsg object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @param title The title</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @param ds A list of mkinds objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @param f_time_norm Time normalisation factors</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> #' @param meta The meta data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> initialize = function(title = "", ds,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> f_time_norm = rep(1, length(ds)), meta)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$title <- title</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (all(sapply(ds, inherits, "mkinds"))) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$ds <- ds</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">133</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Please supply a list of mkinds objects")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> all_observed <- unlist(lapply(ds, function(x) x$observed))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> observed <- factor(all_observed, levels = unique(all_observed))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$observed_n <- table(observed)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(dimnames(self$observed_n)) <- NULL</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> self$f_time_norm <- f_time_norm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!missing(meta)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">143</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(meta) <- lapply(ds, function(x) x$title)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">144</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> self$meta <- meta</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Print mkindsg objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mkindsg</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x An [mkindsg] object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param verbose Should the mkinds objects be printed?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param data Should the mkinds objects be printed with their data?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Not used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.mkindsg <- function(x, data = FALSE, verbose = data, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("<mkindsg> holding", length(x$ds), "mkinds objects\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Title $title: ", x$title, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Occurrence of observed compounds $observed_n:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$observed_n)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (any(x$f_time_norm != 1)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">164</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Time normalisation factors $f_time_norm:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">165</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$f_time_norm)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$meta)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Meta information $meta:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">104<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$meta)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">208<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (verbose) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">172</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nDatasets $ds:")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">173</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> for (ds in x$ds) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">174</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">175</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(ds, data = data)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">177</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">178</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinerrmin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables(c("name", "value_mean"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Calculate the minimum error to assume in order to pass the variance test</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function finds the smallest relative error still resulting in passing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the chi-squared test as defined in the FOCUS kinetics report from 2006.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function is used internally by \code{\link{summary.mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param fit an object of class \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param alpha The confidence level chosen for the chi-squared test.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats qchisq aggregate</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A dataframe with the following components: \item{err.min}{The</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' relative error, expressed as a fraction.} \item{n.optim}{The number of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' optimised parameters attributed to the data series.} \item{df}{The number of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' remaining degrees of freedom for the chi2 error level calculations. Note</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' that mean values are used for the chi2 statistic and therefore every time</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' point with observed values in the series only counts one time.} The</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dataframe has one row for the total dataset and one further row for each</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed state variable in the model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references FOCUS (2006) \dQuote{Guidance Document on Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in EU</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Registration} Report of the FOCUS Work Group on Degradation Kinetics, EC</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Document Reference Sanco/10058/2005 version 2.0, 434 pp,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @keywords manip</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO = mkinmod(parent = mkinsub("SFO", to = "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_FOCUS_D = mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' round(mkinerrmin(fit_FOCUS_D), 4)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_FOCUS_E = mkinfit(SFO_SFO, FOCUS_2006_E, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' round(mkinerrmin(fit_FOCUS_E), 4)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinerrmin <- function(fit, alpha = 0.05)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms.optim <- fit$par</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> kinerrmin <- function(errdata, n.parms) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">124726<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> means.mean <- mean(errdata$observed, na.rm = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">124726<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> df = nrow(errdata) - n.parms</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">124726<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> err.min <- sqrt((1 / qchisq(1 - alpha, df)) *</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">124726<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sum((errdata$observed - errdata$predicted)^2)/(means.mean^2))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">124726<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(list(err.min = err.min, n.optim = n.parms, df = df))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errdata <- aggregate(cbind(observed, predicted) ~ time + variable, data = fit$data, mean, na.rm=TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errdata <- errdata[order(errdata$time, errdata$variable), ]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Remove values at time zero for variables whose value for state.ini is fixed,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # as these will not have any effect in the optimization and should therefore not</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # be counted as degrees of freedom.</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed_initials = gsub("_0$", "", rownames(subset(fit$fixed, type == "state")))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errdata <- subset(errdata, !(time == 0 & variable %in% fixed_initials))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.optim.overall <- length(parms.optim) - length(fit$errparms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errmin.overall <- kinerrmin(errdata, n.optim.overall)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errmin <- data.frame(err.min = errmin.overall$err.min,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.optim = errmin.overall$n.optim, df = errmin.overall$df)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(errmin) <- "All data"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # The degrees of freedom are counted according to FOCUS kinetics (2011, p. 164)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (obs_var in fit$obs_vars)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">74</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errdata.var <- subset(errdata, variable == obs_var)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check if initial value is optimised</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.initials.optim <- length(grep(paste(obs_var, ".*", "_0", sep=""), names(parms.optim)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Rate constants and IORE exponents are attributed to the source variable</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.k.optim <- length(grep(paste("^k", obs_var, sep="_"), names(parms.optim)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.k.optim <- n.k.optim + length(grep(paste("^log_k", obs_var, sep="_"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(parms.optim)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.k__iore.optim <- length(grep(paste("^k__iore", obs_var, sep="_"), names(parms.optim)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.k__iore.optim <- n.k__iore.optim + length(grep(paste("^log_k__iore",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs_var, sep = "_"), names(parms.optim)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.N.optim <- length(grep(paste("^N", obs_var, sep="_"), names(parms.optim)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.ff.optim <- 0</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Formation fractions are attributed to the target variable, so look</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # for source compartments with formation fractions</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (source_var in fit$obs_vars) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">112543<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.ff.source = length(grep(paste("^f", source_var, sep = "_"),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">112543<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(parms.optim)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">112543<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.paths.source = length(fit$mkinmod$spec[[source_var]]$to)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">112543<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (target_var in fit$mkinmod$spec[[source_var]]$to) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">46296<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (obs_var == target_var) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">17974<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.ff.optim <- n.ff.optim + n.ff.source/n.paths.source</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.optim <- sum(n.initials.optim, n.k.optim, n.k__iore.optim, n.N.optim, n.ff.optim)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # FOMC, DFOP and HS parameters are only counted if we are looking at the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # first variable in the model which is always the source variable</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (obs_var == fit$obs_vars[[1]]) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> special_parms = c("alpha", "log_alpha", "beta", "log_beta",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "k1", "log_k1", "k2", "log_k2",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "g", "g_ilr", "g_qlogis", "tb", "log_tb")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.optim <- n.optim + length(intersect(special_parms, names(parms.optim)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Calculate and add a line to the dataframe holding the results</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errmin.tmp <- kinerrmin(errdata.var, n.optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">70783<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errmin[obs_var, c("err.min", "n.optim", "df")] <- errmin.tmp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">119</td> + <td class="coverage">53943<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(errmin)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/residuals.mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Extract residuals from an mkinfit model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object A \code{\link{mkinfit}} object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param standardized Should the residuals be standardized by dividing by the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' standard deviation obtained from the fitted error model?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Not used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mkinfit("DFOP", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' residuals(f)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' residuals(f, standardized = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">residuals.mkinfit <- function(object, standardized = FALSE, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">13</td> + <td class="coverage">2493<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- object$data[["residual"]]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">14</td> + <td class="coverage">2493<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (standardized) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">15</td> + <td class="coverage">2428<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$err_mod == "const") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">16</td> + <td class="coverage">543<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_fitted <- object$errparms["sigma"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">18</td> + <td class="coverage">2428<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$err_mod == "obs") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">19</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_names = paste0("sigma_", object$data[["variable"]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">20</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_fitted <- object$errparms[sigma_names]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">22</td> + <td class="coverage">2428<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$err_mod == "tc") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">23</td> + <td class="coverage">1820<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_fitted <- sigma_twocomp(object$data[["predicted"]],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">24</td> + <td class="coverage">1820<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_low = object$errparms[1],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">25</td> + <td class="coverage">1820<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rsd_high = object$errparms[2])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">27</td> + <td class="coverage">2428<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res / sigma_fitted)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">29</td> + <td class="coverage">65<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/AIC.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Calculate the AIC for a column of an mmkin object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Provides a convenient way to compare different kinetic models fitted to the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' same dataset.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats AIC BIC</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An object of class \code{\link{mmkin}}, containing only one</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' column.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots For compatibility with the generic method</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k As in the generic method</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return As in the generic method (a numeric value for single fits, or a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dataframe if there are several fits in the column).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{ # skip, as it takes > 10 s on winbuilder</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mmkin(c("SFO", "FOMC", "DFOP"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' list("FOCUS A" = FOCUS_2006_A,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "FOCUS C" = FOCUS_2006_C), cores = 1, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We get a warning because the FOMC model does not converge for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # FOCUS A dataset, as it is well described by SFO</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' AIC(f["SFO", "FOCUS A"]) # We get a single number for a single fit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' AIC(f[["SFO", "FOCUS A"]]) # or when extracting an mkinfit object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # For FOCUS A, the models fit almost equally well, so the higher the number</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # of parameters, the higher (worse) the AIC</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' AIC(f[, "FOCUS A"])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' AIC(f[, "FOCUS A"], k = 0) # If we do not penalize additional parameters, we get nearly the same</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' BIC(f[, "FOCUS A"]) # Comparing the BIC gives a very similar picture</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # For FOCUS C, the more complex models fit better</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' AIC(f[, "FOCUS C"])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' BIC(f[, "FOCUS C"])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">AIC.mmkin <- function(object, ..., k = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We can only handle a single column</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ncol(object) != 1) stop("Please provide a single column object")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.fits <- length(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_names <- rownames(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> code <- paste0("AIC(",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste0("object[[", 1:n.fits, "]]", collapse = ", "),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ", k = k)")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- eval(parse(text = code))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (n.fits > 1) rownames(res) <- model_names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname AIC.mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">BIC.mmkin <- function(object, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # We can only handle a single column</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ncol(object) != 1) stop("Please provide a single column object")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.fits <- length(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> model_names <- rownames(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> code <- paste0("BIC(",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> paste0("object[[", 1:n.fits, "]]", collapse = ", "),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ")")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- eval(parse(text = code))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (n.fits > 1) rownames(res) <- model_names</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">247<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/intervals.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom nlme intervals</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">nlme::intervals</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Confidence intervals for parameters in saem.mmkin objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object The fitted saem.mmkin object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param level The confidence level. Must be the default of 0.95 as this is what</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' is available in the saemix object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param backtransform In case the model was fitted with mkin transformations,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' should we backtransform the parameters where a one to one correlation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' between transformed and backtransformed parameters exists?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots For compatibility with the generic method</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An object with 'intervals.saem.mmkin' and 'intervals.lme' in the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' class attribute</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">intervals.saem.mmkin <- function(object, level = 0.95, backtransform = TRUE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">19</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!identical(level, 0.95)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">20</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Confidence intervals are only available for a level of 95%")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">23</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mod_vars <- names(object$mkinmod$diffs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">25</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pnames <- names(object$mean_dp_start)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Confidence intervals are available in the SaemixObject, so</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # we just need to extract them and put them into a list modelled</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # after the result of nlme::intervals.lme</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int <- object$so@results@conf.int</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(conf.int) <- conf.int$name</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(conf.int)[2] <- "est."</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">34</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_trans <- as.matrix(conf.int[pnames, c("lower", "est.", "upper")])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Fixed effects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # In case objects were produced by earlier versions of saem</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">38</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(object$transformations)) object$transformations <- "mkin"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$transformations == "mkin" & backtransform) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bp <- backtransform_odeparms(confint_trans[, "est."], object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates, object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpnames <- names(bp)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transform boundaries of CI for one parameter at a time,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # with the exception of sets of formation fractions (single fractions are OK).</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names_skip <- character(0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (box in mod_vars) { # Figure out sets of fractions to skip</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">2396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names <- grep(paste("^f", box, sep = "_"), pnames, value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">2396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_paths <- length(f_names)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">51</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (n_paths > 1) f_names_skip <- c(f_names_skip, f_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back <- matrix(NA, nrow = length(bp), ncol = 3,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list(bpnames, colnames(confint_trans)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[, "est."] <- bp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (pname in pnames) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!pname %in% f_names_skip) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par.lower <- confint_trans[pname, "lower"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par.upper <- confint_trans[pname, "upper"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(par.lower) <- names(par.upper) <- pname</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">63</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpl <- backtransform_odeparms(par.lower, object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpu <- backtransform_odeparms(par.upper, object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[names(bpl), "lower"] <- bpl</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">6314<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[names(bpu), "upper"] <- bpu</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">2286<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_ret <- confint_back</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">195<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_ret <- confint_trans</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(confint_ret, "label") <- "Fixed effects:"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Random effects</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">80</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sdnames <- intersect(rownames(conf.int), paste("SD", pnames, sep = "."))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> corrnames <- grep("^Corr.", rownames(conf.int), value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ranef_ret <- as.matrix(conf.int[c(sdnames, corrnames), c("lower", "est.", "upper")])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sdnames_ret <- paste0(gsub("SD\\.", "sd(", sdnames), ")")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">84</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> corrnames_ret <- gsub("Corr\\.(.*)\\.(.*)", "corr(\\1,\\2)", corrnames)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(ranef_ret) <- c(sdnames_ret, corrnames_ret)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(ranef_ret, "label") <- "Random effects:"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Error model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> enames <- if (object$err_mod == "const") "a.1" else c("a.1", "b.1")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> err_ret <- as.matrix(conf.int[enames, c("lower", "est.", "upper")])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res <- list(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fixed = confint_ret,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> random = ranef_ret,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errmod = err_ret</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> )</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(res) <- c("intervals.saemix.mmkin", "intervals.lme")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(res, "level") <- level</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">2481<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(res)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/update.mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Update an mkinfit model with different arguments</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function will return an updated mkinfit object. The fitted degradation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model parameters from the old fit are used as starting values for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' updated fit. Values specified as 'parms.ini' and/or 'state.ini' will</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' override these starting values.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An mkinfit object to be updated</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Arguments to \code{\link{mkinfit}} that should replace</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the arguments from the original call. Arguments set to NULL will</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' remove arguments given in the original call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param evaluate Should the call be evaluated or returned as a call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit("SFO", subset(FOCUS_2006_D, value != 0), quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_err(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit_2 <- update(fit, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms(fit_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_err(fit_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">update.mkinfit <- function(object, ..., evaluate = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">25</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- object$call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">27</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments <- match.call(expand.dots = FALSE)$...</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get optimised ODE parameters and let parms.ini override them</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">30</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ode_optim_names <- intersect(names(object$bparms.optim), names(object$bparms.ode))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ode_start <- object$bparms.optim[ode_optim_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if ("parms.ini" %in% names(update_arguments)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">33</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ode_start[names(update_arguments["parms.ini"])] <- update_arguments["parms.ini"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">35</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ode_start)) update_arguments[["parms.ini"]] <- ode_start</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Get optimised values for initial states and let state.ini override them</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">38</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state_optim_names <- intersect(names(object$bparms.optim), paste0(names(object$bparms.state), "_0"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state_start <- object$bparms.optim[state_optim_names]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(state_start) <- gsub("_0$", "", names(state_start))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if ("state.ini" %in% names(update_arguments)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">42</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> state_start[names(update_arguments["state.ini"])] <- update_arguments["state.ini"]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(state_start)) update_arguments[["state.ini"]] <- state_start</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(update_arguments) > 0) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_in_call <- !is.na(match(names(update_arguments), names(call)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (a in names(update_arguments)[update_arguments_in_call]) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call[[a]] <- update_arguments[[a]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> update_arguments_not_in_call <- !update_arguments_in_call</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(any(update_arguments_not_in_call)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- c(as.list(call), update_arguments[update_arguments_not_in_call])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> call <- as.call(call)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(evaluate) eval(call, parent.frame())</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">60</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> else call</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/confint.mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Confidence intervals for parameters of mkinfit objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The default method 'quadratic' is based on the quadratic approximation of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the curvature of the likelihood function at the maximum likelihood parameter</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' estimates.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The alternative method 'profile' is based on the profile likelihood for each</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameter. The 'profile' method uses two nested optimisations and can take a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' very long time, even if parallelized by specifying 'cores' on unixoid</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' platforms. The speed of the method could likely be improved by using the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' method of Venzon and Moolgavkar (1988).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An \code{\link{mkinfit}} object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param parm A vector of names of the parameters which are to be given</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' confidence intervals. If missing, all parameters are considered.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param level The confidence level required</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param alpha The allowed error probability, overrides 'level' if specified.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cutoff Possibility to specify an alternative cutoff for the difference</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in the log-likelihoods at the confidence boundary. Specifying an explicit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cutoff value overrides arguments 'level' and 'alpha'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param method The 'quadratic' method approximates the likelihood function at</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the optimised parameters using the second term of the Taylor expansion,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' using a second derivative (hessian) contained in the object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The 'profile' method searches the parameter space for the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cutoff of the confidence intervals by means of a likelihood ratio test.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param transformed If the quadratic approximation is used, should it be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' applied to the likelihood based on the transformed parameters?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param backtransform If we approximate the likelihood in terms of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' transformed parameters, should we backtransform the parameters with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' their confidence intervals?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param rel_tol If the method is 'profile', what should be the accuracy</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of the lower and upper bounds, relative to the estimate obtained from</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the quadratic method?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param cores The number of cores to be used for multicore processing.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' On Windows machines, cores > 1 is currently not supported.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param quiet Should we suppress the message "Profiling the likelihood"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A matrix with columns giving lower and upper confidence limits for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' each parameter.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Not used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats qnorm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Bates DM and Watts GW (1988) Nonlinear regression analysis & its applications</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Pawitan Y (2013) In all likelihood - Statistical modelling and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' inference using likelihood. Clarendon Press, Oxford.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Venzon DJ and Moolgavkar SH (1988) A Method for Computing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Profile-Likelihood Based Confidence Intervals, Applied Statistics, 37,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 87–94.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f <- mkinfit("SFO", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' confint(f, method = "quadratic")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' confint(f, method = "profile")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Set the number of cores for the profiling method for further examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if (identical(Sys.getenv("NOT_CRAN"), "true")) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' n_cores <- parallel::detectCores() - 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' } else {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' n_cores <- 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if (Sys.getenv("TRAVIS") != "") n_cores = 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if (Sys.info()["sysname"] == "Windows") n_cores = 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' use_of_ff = "min", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' SFO_SFO.ff <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' use_of_ff = "max", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_d_1 <- mkinfit(SFO_SFO, subset(FOCUS_2006_D, value != 0), quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' system.time(ci_profile <- confint(f_d_1, method = "profile", cores = 1, quiet = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Using more cores does not save much time here, as parent_0 takes up most of the time</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # If we additionally exclude parent_0 (the confidence of which is often of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # minor interest), we get a nice performance improvement if we use at least 4 cores</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' system.time(ci_profile_no_parent_0 <- confint(f_d_1, method = "profile",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c("k_parent_sink", "k_parent_m1", "k_m1_sink", "sigma"), cores = n_cores))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_profile</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_quadratic_transformed <- confint(f_d_1, method = "quadratic")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_quadratic_transformed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_quadratic_untransformed <- confint(f_d_1, method = "quadratic", transformed = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_quadratic_untransformed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Against the expectation based on Bates and Watts (1988), the confidence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # intervals based on the internal parameter transformation are less</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # congruent with the likelihood based intervals. Note the superiority of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # interval based on the untransformed fit for k_m1_sink</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rel_diffs_transformed <- abs((ci_quadratic_transformed - ci_profile)/ci_profile)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rel_diffs_untransformed <- abs((ci_quadratic_untransformed - ci_profile)/ci_profile)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rel_diffs_transformed < rel_diffs_untransformed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' signif(rel_diffs_transformed, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' signif(rel_diffs_untransformed, 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Investigate a case with formation fractions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_d_2 <- mkinfit(SFO_SFO.ff, subset(FOCUS_2006_D, value != 0), quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_profile_ff <- confint(f_d_2, method = "profile", cores = n_cores)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_profile_ff</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_quadratic_transformed_ff <- confint(f_d_2, method = "quadratic")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_quadratic_transformed_ff</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_quadratic_untransformed_ff <- confint(f_d_2, method = "quadratic", transformed = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ci_quadratic_untransformed_ff</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rel_diffs_transformed_ff <- abs((ci_quadratic_transformed_ff - ci_profile_ff)/ci_profile_ff)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rel_diffs_untransformed_ff <- abs((ci_quadratic_untransformed_ff - ci_profile_ff)/ci_profile_ff)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # While the confidence interval for the parent rate constant is closer to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # the profile based interval when using the internal parameter</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # transformation, the interval for the metabolite rate constant is 'better</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # without internal parameter transformation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rel_diffs_transformed_ff < rel_diffs_untransformed_ff</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rel_diffs_transformed_ff</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rel_diffs_untransformed_ff</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The profiling for the following fit does not finish in a reasonable time,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # therefore we use the quadratic approximation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_synth_DFOP_par <- mkinmod(parent = mkinsub("DFOP", c("M1", "M2")),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M1 = mkinsub("SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M2 = mkinsub("SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' use_of_ff = "max", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' DFOP_par_c <- synthetic_data_for_UBA_2014[[12]]$data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_tc_2 <- mkinfit(m_synth_DFOP_par, DFOP_par_c, error_model = "tc",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' error_model_algorithm = "direct", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' confint(f_tc_2, method = "quadratic")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' confint(f_tc_2, "parent_0", method = "quadratic")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">confint.mkinfit <- function(object, parm,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> level = 0.95, alpha = 1 - level, cutoff,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> method = c("quadratic", "profile"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> transformed = TRUE, backtransform = TRUE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> cores = parallel::detectCores(), rel_tol = 0.01, quiet = FALSE, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tparms <- parms(object, transformed = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bparms <- parms(object, transformed = FALSE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tpnames <- names(tparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpnames <- names(bparms)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return_pnames <- if (missing(parm)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (backtransform) bpnames else tpnames</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> p <- length(return_pnames)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> method <- match.arg(method)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> a <- c(alpha / 2, 1 - (alpha / 2))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> quantiles <- qt(a, object$df.residual)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar_pnames <- if (missing(parm)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">420<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformed) tpnames else bpnames</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">154</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return_parms <- if (backtransform) bparms[return_pnames]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">155</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else tparms[return_pnames]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">157</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar_parms <- if (transformed) tparms[covar_pnames]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">158</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else bparms[covar_pnames]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformed) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">840<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar <- try(solve(object$hessian), silent = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">162</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">420<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> covar <- try(solve(object$hessian_notrans), silent = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # If inverting the covariance matrix failed or produced NA values</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.numeric(covar) | is.na(covar[1])) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">168</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> ses <- lci <- uci <- rep(NA, p)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">169</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">170</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ses <- sqrt(diag(covar))[covar_pnames]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">171</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lci <- covar_parms + quantiles[1] * ses</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> uci <- covar_parms + quantiles[2] * ses</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (transformed & backtransform) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">630<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lci_back <- backtransform_odeparms(lci,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">175</td> + <td class="coverage">630<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$mkinmod, object$transform_rates, object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">176</td> + <td class="coverage">630<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> uci_back <- backtransform_odeparms(uci,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">630<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$mkinmod, object$transform_rates, object$transform_fractions)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">178</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">179</td> + <td class="coverage">630<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return_errparm_names <- intersect(names(object$errparms), return_pnames)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">180</td> + <td class="coverage">630<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lci <- c(lci_back, lci[return_errparm_names])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">630<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> uci <- c(uci_back, uci[return_errparm_names])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">182</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">183</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ci <- cbind(lower = lci, upper = uci)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">186</td> + <td class="coverage">1260<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (method == "profile") {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">187</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ci_quadratic <- ci</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">190</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!quiet) message("Profiling the likelihood")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lci <- uci <- rep(NA, p)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">193</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(lci) <- names(uci) <- return_pnames</pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> profile_pnames <- if(missing(parm)) names(parms(object))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else parm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">198</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (missing(cutoff)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cutoff <- 0.5 * qchisq(1 - alpha, 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">200</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">202</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> all_parms <- parms(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> get_ci <- function(pname) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pnames_free <- setdiff(names(all_parms), pname)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">206</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> profile_ll <- function(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">207</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">80<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pll_cost <- function(P) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">209</td> + <td class="coverage">3132<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms_cost <- all_parms</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">210</td> + <td class="coverage">3132<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms_cost[pnames_free] <- P[pnames_free]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">211</td> + <td class="coverage">3132<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parms_cost[pname] <- x</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">212</td> + <td class="coverage">3132<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> - object$ll(parms_cost)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">214</td> + <td class="coverage">80<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> - nlminb(all_parms[pnames_free], pll_cost)$objective</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">216</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cost <- function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">218</td> + <td class="coverage">80<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (cutoff - (object$logLik - profile_ll(x)))^2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">219</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">221</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lower_quadratic <- ci_quadratic["lower"][pname]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper_quadratic <- ci_quadratic["upper"][pname]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">223</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ltol <- if (!is.na(lower_quadratic)) rel_tol * lower_quadratic else .Machine$double.eps^0.25</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">224</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> utol <- if (!is.na(upper_quadratic)) rel_tol * upper_quadratic else .Machine$double.eps^0.25</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">225</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lci_pname <- optimize(cost, lower = 0, upper = all_parms[pname], tol = ltol)$minimum</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">226</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> uci_pname <- optimize(cost, lower = all_parms[pname],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">227</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> upper = ifelse(grepl("^f_|^g$", pname), 1, 15 * all_parms[pname]),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tol = utol)$minimum</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">229</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(c(lci_pname, uci_pname))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">230</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">231</td> + <td class="coverage">210<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ci <- t(parallel::mcmapply(get_ci, profile_pnames, mc.cores = cores))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">233</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">234</td> + <td class="coverage">1257<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(ci) <- paste0(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">1257<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> format(100 * a, trim = TRUE, scientific = FALSE, digits = 3), "%")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">236</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">1257<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(ci)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/set_nd_nq.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Set non-detects and unquantified values in residue series without replicates</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function automates replacing unquantified values in residue time and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' depth series. For time series, the function performs part of the residue</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' processing proposed in the FOCUS kinetics guidance for parent compounds</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and metabolites. For two-dimensional residue series over time and depth,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' it automates the proposal of Boesten et al (2015).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param res_raw Character vector of a residue time series, or matrix of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' residue values with rows representing depth profiles for a specific sampling</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' time, and columns representing time series of residues at the same depth.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Values below the limit of detection (lod) have to be coded as "nd", values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' between the limit of detection and the limit of quantification, if any, have</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to be coded as "nq". Samples not analysed have to be coded as "na". All</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' values that are not "na", "nd" or "nq" have to be coercible to numeric</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param lod Limit of detection (numeric)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param loq Limit of quantification(numeric). Must be specified if the FOCUS rule to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' stop after the first non-detection is to be applied</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param time_zero_presence Do we assume that residues occur at time zero?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This only affects samples from the first sampling time that have been</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' reported as "nd" (not detected).</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references Boesten, J. J. T. I., van der Linden, A. M. A., Beltman, W. H.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' J. and Pol, J. W. (2015). Leaching of plant protection products and their</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' transformation products; Proposals for improving the assessment of leaching</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to groundwater in the Netherlands — Version 2. Alterra report 2630, Alterra</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Wageningen UR (University & Research centre)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references FOCUS (2014) Generic Guidance for Estimating Persistence and Degradation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Kinetics from Environmental Fate Studies on Pesticides in EU Registration, Version 1.1,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 18 December 2014, p. 251</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A numeric vector, if a vector was supplied, or a numeric matrix otherwise</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # FOCUS (2014) p. 75/76 and 131/132</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq(parent_1, 0.02)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq(parent_2, 0.02)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq_focus(parent_2, 0.02, loq = 0.05)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq(parent_3, 0.02)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq_focus(parent_3, 0.02, loq = 0.05)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq(metabolite, 0.02)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq_focus(metabolite, 0.02, 0.05)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Boesten et al. (2015), p. 57/58</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' table_8 <- matrix(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(10, 10, rep("nd", 4),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 10, 10, rep("nq", 2), rep("nd", 2),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 10, 10, 10, "nq", "nd", "nd",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "nq", 10, "nq", rep("nd", 3),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "nd", "nq", "nq", rep("nd", 3),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rep("nd", 6), rep("nd", 6)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ncol = 6, byrow = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq(table_8, 0.5, 1.5, time_zero_presence = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' table_10 <- matrix(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(10, 10, rep("nd", 4),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 10, 10, rep("nd", 4),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 10, 10, 10, rep("nd", 3),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "nd", 10, rep("nd", 4),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' rep("nd", 18)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ncol = 6, byrow = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set_nd_nq(table_10, 0.5, time_zero_presence = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">set_nd_nq <- function(res_raw, lod, loq = NA, time_zero_presence = FALSE) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.character(res_raw)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">66</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Please supply a vector or a matrix of character values")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">68</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.vector(res_raw)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> was_vector <- TRUE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">70</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_raw <- as.matrix(res_raw)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> was_vector <- FALSE</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.matrix(res_raw)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">74</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Please supply a vector or a matrix of character values")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nq <- 0.5 * (loq + lod)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">78</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nda <- 0.5 * lod # not detected but adjacent to detection</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_raw[res_raw == "nq"] <- nq</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">81</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!time_zero_presence) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (j in 1:ncol(res_raw)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">83</td> + <td class="coverage">3<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (res_raw[1, j] == "nd") res_raw[1, j] <- "na"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_raw[res_raw == "na"] <- NA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> not_nd_na <- function(value) !(grepl("nd", value) | is.na(value))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 1:nrow(res_raw)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">94<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (j in 1:ncol(res_raw)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">164<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(res_raw[i, j]) && res_raw[i, j] == "nd") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">98<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (i > 1) { # check earlier sample in same layer</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">17<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (not_nd_na(res_raw[i - 1, j])) res_raw[i, j] <- "nda"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">96</td> + <td class="coverage">98<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (i < nrow(res_raw)) { # check later sample</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">97</td> + <td class="coverage">7<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (not_nd_na(res_raw[i + 1, j])) res_raw[i, j] <- "nda"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">99</td> + <td class="coverage">98<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (j > 1) { # check above sample at the same time</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">9<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (not_nd_na(res_raw[i, j - 1])) res_raw[i, j] <- "nda"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">98<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (j < ncol(res_raw)) { # check sample below at the same time</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (not_nd_na(res_raw[i, j + 1])) res_raw[i, j] <- "nda"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">107</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_raw[res_raw == "nda"] <- nda</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_raw[res_raw == "nd"] <- NA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- as.numeric(res_raw)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">112</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(result) <- dim(res_raw)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">113</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames(result) <- dimnames(res_raw)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">114</td> + <td class="coverage">8<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (was_vector) result <- as.vector(result)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">10<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @describeIn set_nd_nq Set non-detects in residue time series according to FOCUS rules</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param set_first_sample_nd Should the first sample be set to "first_sample_nd_value"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in case it is a non-detection?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param first_sample_nd_value Value to be used for the first sample if it is a non-detection</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param ignore_below_loq_after_first_nd Should we ignore values below the LOQ after the first</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' non-detection that occurs after the quantified values?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">set_nd_nq_focus <- function(res_raw, lod, loq = NA,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> set_first_sample_nd = TRUE, first_sample_nd_value = 0,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ignore_below_loq_after_first_nd = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">129</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="missed"> + <td class="num">130</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.vector(res_raw)) stop("FOCUS rules are only specified for one-dimensional time series")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">132</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ignore_below_loq_after_first_nd & is.na(loq)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("You need to specify an LOQ")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n <- length(res_raw)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (ignore_below_loq_after_first_nd) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 3:n) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">35<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!res_raw[i - 2] %in% c("na", "nd")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">21<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (res_raw[i - 1] == "nd") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_remaining <- res_raw[i:n]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_remaining_unquantified <- ifelse(res_remaining == "na", TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(res_remaining == "nd", TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(res_remaining == "nq", TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(suppressWarnings(as.numeric(res_remaining)) < loq, TRUE, FALSE))))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">146</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_remaining_numeric <- suppressWarnings(as.numeric(res_remaining))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">147</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_remaining_below_loq <- ifelse(res_remaining == "nq", TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">148</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ifelse(!is.na(res_remaining_numeric) & res_remaining_numeric < loq, TRUE, FALSE))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">5<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (all(res_remaining_unquantified)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> res_raw[i:n] <- ifelse(res_remaining_below_loq, "nd", res_remaining)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">157</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> result <- set_nd_nq(res_raw, lod = lod, loq = loq)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (set_first_sample_nd) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (res_raw[1] == "nd") result[1] <- first_sample_nd_value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">161</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">162</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">163</td> + <td class="coverage">4<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(result)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinparplot.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function to plot the confidence intervals obtained using mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function plots the confidence intervals for the parameters fitted using</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object A fit represented in an \code{\link{mkinfit}} object.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return Nothing is returned by this function, as it is called for its side</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' effect, namely to produce a plot.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' T245 = mkinsub("SFO", to = c("phenol"), sink = FALSE),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' phenol = mkinsub("SFO", to = c("anisole")),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anisole = mkinsub("SFO"), use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit <- mkinfit(model, subset(mccall81_245T, soil == "Commerce"), quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinparplot(fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinparplot <- function(object) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">22</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.optim = rownames(subset(object$start, type == "state"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">23</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> deparms.optim = rownames(subset(object$start, type == "deparm"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">24</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fractions.optim = grep("^f_", deparms.optim, value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">25</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> N.optim = grep("^N_", deparms.optim, value = TRUE)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">26</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if ("g" %in% deparms.optim) fractions.optim <- c("g", fractions.optim)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">27</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rates.optim.unsorted = setdiff(deparms.optim, union(fractions.optim, N.optim))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">28</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rates.optim <- rownames(object$start[rates.optim.unsorted, ])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">29</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.plot <- c(state.optim = length(state.optim),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">30</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rates.optim = length(rates.optim),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> N.optim = length(N.optim),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fractions.optim = length(fractions.optim))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n.plot <- n.plot[n.plot > 0]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">35</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> oldpar <- par(no.readonly = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">36</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> on.exit(par(oldpar, no.readonly = TRUE))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">37</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> layout(matrix(1:length(n.plot), ncol = 1), heights = n.plot + 1)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> s <- summary(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpar <- data.frame(t(s$bpar[, c("Estimate", "Lower", "Upper")]))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(mar = c(2.1, 2.1, 0.1, 2.1))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(cex = 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">43</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (type in names(n.plot)) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">44</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parnames <- get(type)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">45</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> values <- bpar[parnames]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">46</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> values_with_confints <- data.frame(t(subset(data.frame(t(values)), !is.na("Lower"))))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">47</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = switch(type,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">48</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> state.optim = range(c(0, unlist(values)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">49</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> na.rm = TRUE, finite = TRUE),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">50</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rates.optim = range(c(0, unlist(values)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">51</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> na.rm = TRUE, finite = TRUE),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">52</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> N.optim = range(c(0, 1, unlist(values)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> na.rm = TRUE, finite = TRUE),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">54</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> fractions.optim = range(c(0, 1, unlist(values)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">55</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> na.rm = TRUE, finite = TRUE))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">56</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parname_index <- length(parnames):1 # Reverse order for strip chart</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">58</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stripchart(values["Estimate", ][parname_index],</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">59</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlim = xlim,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">60</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylim = c(0.5, length(get(type)) + 0.5),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">61</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> yaxt = "n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">62</td> + <td class="coverage">70<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (type %in% c("rates.optim", "fractions.optim")) abline(v = 0, lty = 2)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">63</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (type %in% c("N.optim", "fractions.optim")) abline(v = 1, lty = 2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">64</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> position <- ifelse(values["Estimate", ] < mean(xlim), "right", "left")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">65</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> text(ifelse(position == "left", min(xlim), max(xlim)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">66</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parname_index, parnames,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">67</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pos = ifelse(position == "left", 4, 2))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">69</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> values.upper.nonInf <- ifelse(values["Upper", ] == Inf, 1.5 * xlim[[2]], values["Upper", ])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Suppress warnings for non-existing arrow lengths</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> suppressWarnings(arrows(as.numeric(values["Lower", ]), parname_index,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">72</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> as.numeric(values.upper.nonInf), parname_index,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">73</td> + <td class="coverage">140<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> code = 3, angle = 90, length = 0.05))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/summary.saem.mmkin.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Summary method for class "saem.mmkin"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Lists model equations, initial parameter values, optimised parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for fixed effects (population), random effects (deviations from the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' population mean) and residual error model, as well as the resulting</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints such as formation fractions and DT50 values. Optionally</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' (default is FALSE), the data are listed in full.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object an object of class [saem.mmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param x an object of class [summary.saem.mmkin]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param data logical, indicating whether the full data should be included in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the summary.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param verbose Should the summary be verbose?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param distimes logical, indicating whether DT50 and DT90 values should be</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' included.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits Number of digits to use for printing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots optional arguments passed to methods like \code{print}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inheritParams endpoints</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The summary function returns a list based on the [saemix::SaemixObject]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' obtained in the fit, with at least the following additional components</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{saemixversion, mkinversion, Rversion}{The saemix, mkin and R versions used}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{date.fit, date.summary}{The dates where the fit and the summary were</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' produced}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{diffs}{The differential equations used in the degradation model}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{use_of_ff}{Was maximum or minimum use made of formation fractions}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{data}{The data}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{confint_trans}{Transformed parameters as used in the optimisation, with confidence intervals}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{confint_back}{Backtransformed parameters, with confidence intervals if available}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{confint_errmod}{Error model parameters with confidence intervals}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{ff}{The estimated formation fractions derived from the fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' model.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{distimes}{The DT50 and DT90 values for each observed variable.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \item{SFORB}{If applicable, eigenvalues of SFORB components of the model.}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The print method is called for its side effect, i.e. printing the summary.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats predict vcov</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke for the mkin specific parts</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' saemix authors for the parts inherited from saemix.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Generate five datasets following DFOP-SFO kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO"), quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set.seed(1234)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k1_in <- rlnorm(5, log(0.1), 0.3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k2_in <- rlnorm(5, log(0.02), 0.3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' g_in <- plogis(rnorm(5, qlogis(0.5), 0.3))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_parent_to_m1_in <- plogis(rnorm(5, qlogis(0.3), 0.3))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k_m1_in <- rlnorm(5, log(0.02), 0.3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' pred_dfop_sfo <- function(k1, k2, g, f_parent_to_m1, k_m1) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(dfop_sfo,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k1 = k1, k2 = k2, g = g, f_parent_to_m1 = f_parent_to_m1, k_m1 = k_m1),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100, m1 = 0),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_mean_dfop_sfo <- lapply(1:5, function(i) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkinpredict(dfop_sfo,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k1 = k1_in[i], k2 = k2_in[i], g = g_in[i],</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_parent_to_m1 = f_parent_to_m1_in[i], k_m1 = k_m1_in[i]),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100, m1 = 0),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(ds_mean_dfop_sfo) <- paste("ds", 1:5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ds_syn_dfop_sfo <- lapply(ds_mean_dfop_sfo, function(ds) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' add_err(ds,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sdfunc = function(value) sqrt(1^2 + value^2 * 0.07^2),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' n = 1)[[1]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' })</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Evaluate using mmkin and saem</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mmkin_dfop_sfo <- mmkin(list(dfop_sfo), ds_syn_dfop_sfo,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' quiet = TRUE, error_model = "tc", cores = 5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_dfop_sfo <- saem(f_mmkin_dfop_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(f_saem_dfop_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(f_saem_dfop_sfo)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_dfop_sfo_2 <- update(f_saem_dfop_sfo,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' no_random_effect = c("parent_0", "log_k_m1"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' illparms(f_saem_dfop_sfo_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' intervals(f_saem_dfop_sfo_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(f_saem_dfop_sfo_2, data = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Add a correlation between random effects of g and k2</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cov_model_3 <- f_saem_dfop_sfo_2$so@model@covariance.model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cov_model_3["log_k2", "g_qlogis"] <- 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' cov_model_3["g_qlogis", "log_k2"] <- 1</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_saem_dfop_sfo_3 <- update(f_saem_dfop_sfo,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' covariance.model = cov_model_3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' intervals(f_saem_dfop_sfo_3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The correlation does not improve the fit judged by AIC and BIC, although</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # the likelihood is higher with the additional parameter</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova(f_saem_dfop_sfo, f_saem_dfop_sfo_2, f_saem_dfop_sfo_3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">summary.saem.mmkin <- function(object, data = FALSE, verbose = FALSE,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> covariates = NULL, covariate_quantile = 0.5,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> distimes = TRUE, ...) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mod_vars <- names(object$mkinmod$diffs)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> pnames <- names(object$mean_dp_start)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names_fixed_effects <- object$so@results@name.fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_fixed <- length(names_fixed_effects)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> conf.int <- object$so@results@conf.int</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> rownames(conf.int) <- conf.int$name</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_trans <- as.matrix(parms(object, ci = TRUE))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">110</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(confint_trans)[1] <- "est."</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # In case objects were produced by earlier versions of saem</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">113</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (is.null(object$transformations)) object$transformations <- "mkin"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">115</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (object$transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">116</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bp <- backtransform_odeparms(confint_trans[pnames, "est."], object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">117</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates, object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">118</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpnames <- names(bp)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Transform boundaries of CI for one parameter at a time,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # with the exception of sets of formation fractions (single fractions are OK).</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">122</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names_skip <- character(0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">123</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (box in mod_vars) { # Figure out sets of fractions to skip</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">124</td> + <td class="coverage">492<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> f_names <- grep(paste("^f", box, sep = "_"), pnames, value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">125</td> + <td class="coverage">492<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n_paths <- length(f_names)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">126</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (n_paths > 1) f_names_skip <- c(f_names_skip, f_names)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back <- matrix(NA, nrow = length(bp), ncol = 3,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dimnames = list(bpnames, colnames(confint_trans)))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">131</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[, "est."] <- bp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">133</td> + <td class="coverage">396<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (pname in pnames) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">134</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!pname %in% f_names_skip) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">135</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par.lower <- confint_trans[pname, "lower"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">136</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par.upper <- confint_trans[pname, "upper"]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">137</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(par.lower) <- names(par.upper) <- pname</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">138</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpl <- backtransform_odeparms(par.lower, object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">139</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">140</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">141</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> bpu <- backtransform_odeparms(par.upper, object$mkinmod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">142</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_rates,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">143</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$transform_fractions)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">144</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[names(bpl), "lower"] <- bpl</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">145</td> + <td class="coverage">1291<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back[names(bpu), "upper"] <- bpu</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">149</td> + <td class="coverage">404<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_back <- confint_trans[names_fixed_effects, ]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">150</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">151</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">152</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Correlation of fixed effects (inspired by summary.nlme)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">153</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cov_so <- try(solve(object$so@results@fim), silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">154</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(cov_so, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">155</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object$corFixed <- NA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">157</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> varFix <- cov_so[1:n_fixed, 1:n_fixed]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">158</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stdFix <- sqrt(diag(varFix))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">159</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$corFixed <- array(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">160</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> t(varFix/stdFix)/stdFix,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">161</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> dim(varFix),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">162</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> list(names_fixed_effects, names_fixed_effects))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Random effects</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">166</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sdnames <- intersect(rownames(conf.int), paste0("SD.", pnames))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">167</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> corrnames <- grep("^Corr.", rownames(conf.int), value = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">168</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_ranef <- as.matrix(conf.int[c(sdnames, corrnames), c("estimate", "lower", "upper")])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">169</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(confint_ranef)[1] <- "est."</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">171</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Error model</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">172</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> enames <- if (object$err_mod == "const") "a.1" else c("a.1", "b.1")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">173</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> confint_errmod <- as.matrix(conf.int[enames, c("estimate", "lower", "upper")])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">174</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames(confint_errmod)[1] <- "est."</pre> + </td> + </tr> + <tr class="never"> + <td class="num">175</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">176</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$confint_trans <- confint_trans</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$confint_ranef <- confint_ranef</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$confint_errmod <- confint_errmod</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">179</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$confint_back <- confint_back</pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$date.summary = date()</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$use_of_ff = object$mkinmod$use_of_ff</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$error_model_algorithm = object$mmkin_orig[[1]]$error_model_algorithm</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">184</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> err_mod = object$mmkin_orig[[1]]$err_mod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">186</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$diffs <- object$mkinmod$diffs</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">187</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$print_data <- data # boolean: Should we print the data?</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">188</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> so_pred <- object$so@results@predictions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">190</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(object$data)[4] <- "observed" # rename value to observed</pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">192</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$verbose <- verbose</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">194</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$fixed <- object$mmkin_orig[[1]]$fixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">195</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ll <-try(logLik(object$so, method = "is"), silent = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">196</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(ll, "try-error")) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">197</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object$logLik <- object$AIC <- object $BIC <- NA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">198</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">199</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$logLik = logLik(object$so, method = "is")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">200</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$AIC = AIC(object$so)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">201</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$BIC = BIC(object$so)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">202</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">204</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ep <- endpoints(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">205</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$covariates <- ep$covariates</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">206</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ep$ff) != 0)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">207</td> + <td class="coverage">330<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object$ff <- ep$ff</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">208</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (distimes) object$distimes <- ep$distimes</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">209</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(ep$SFORB) != 0) object$SFORB <- ep$SFORB</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">210</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(object) <- c("summary.saem.mmkin")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">211</td> + <td class="coverage">800<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(object)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">212</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">214</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname summary.saem.mmkin</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">216</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">print.summary.saem.mmkin <- function(x, digits = max(3, getOption("digits") - 3), verbose = x$verbose, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">217</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("saemix version used for fitting: ", x$saemixversion, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">218</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("mkin version used for pre-fitting: ", x$mkinversion, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">219</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("R version used for fitting: ", x$Rversion, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">221</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Date of fit: ", x$date.fit, "\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">222</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Date of summary:", x$date.summary, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">223</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">224</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEquations:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">225</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> nice_diffs <- gsub("^(d.*) =", "\\1/dt =", x[["diffs"]])</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">226</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> writeLines(strwrap(nice_diffs, exdent = 11))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">228</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nData:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">229</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(nrow(x$data), "observations of",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">230</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$name)), "variable(s) grouped in",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">231</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> length(unique(x$data$ds)), "datasets\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">233</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nModel predictions using solution type", x$solution_type, "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">234</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">235</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFitted in", x$time[["elapsed"]], "s\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">236</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Using", paste(x$so@options$nbiter.saemix, collapse = ", "),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> "iterations and", x$so@options$nb.chains, "chains\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">239</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nVariance model: ")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">240</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat(switch(x$err_mod,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">241</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> const = "Constant variance",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">242</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> obs = "Variance unique to each observed variable",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">243</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> tc = "Two-component variance function"), "\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">244</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">245</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStarting values for degradation parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">246</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$mean_dp_start, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">247</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">248</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nFixed degradation parameter values:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">249</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(length(x$fixed$value) == 0) cat("None\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">250</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> else print(x$fixed, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">251</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">252</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStarting values for random effects (square root of initial entries in omega):\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">253</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(sqrt(x$so@model@omega.init), digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">254</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">255</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nStarting values for error model parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">256</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms <- x$so@model@error.init</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">257</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(errparms) <- x$so@model@name.sigma</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">258</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> errparms <- errparms[x$so@model@indx.res]</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">259</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(errparms, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">260</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">261</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nResults:\n\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">262</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("Likelihood computed by importance sampling\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">263</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(data.frame(AIC = x$AIC, BIC = x$BIC, logLik = x$logLik,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">264</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = " "), digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">265</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">266</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nOptimised parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">267</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$confint_trans, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">268</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">269</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (identical(x$corFixed, NA)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">270</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nCorrelation is not available\n")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">271</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">272</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> corr <- x$corFixed</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">273</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(corr) <- "correlation"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">274</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(corr, title = "\nCorrelation:", rdig = digits, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">275</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">276</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">277</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nRandom effects:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">278</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$confint_ranef, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">279</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">280</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nVariance model:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">281</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$confint_errmod, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">282</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">283</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (x$transformations == "mkin") {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">284</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nBacktransformed parameters:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">285</td> + <td class="coverage">125<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$confint_back, digits = digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">286</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">287</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">288</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.null(x$covariates)) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">289</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nCovariates used for endpoints below:\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">290</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$covariates)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">291</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">292</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">293</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printSFORB <- !is.null(x$SFORB)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">294</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printSFORB){</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">295</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEstimated Eigenvalues of SFORB model(s):\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">296</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$SFORB, digits = digits,...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">297</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">298</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">299</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printff <- !is.null(x$ff)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">300</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printff){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">301</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nResulting formation fractions:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">302</td> + <td class="coverage">117<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(data.frame(ff = x$ff), digits = digits,...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">303</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">304</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">305</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> printdistimes <- !is.null(x$distimes)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">306</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if(printdistimes){</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">307</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nEstimated disappearance times:\n")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">308</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> print(x$distimes, digits = digits,...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">309</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">310</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">311</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (x$print_data){</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">312</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> cat("\nData:\n")</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">313</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> print(format(x$data, digits = digits, ...), row.names = FALSE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">314</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">315</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">316</td> + <td class="coverage">242<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> invisible(x)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">317</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkin_long_to_wide.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Convert a dataframe from long to wide format</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function takes a dataframe in the long form, i.e. with a row for each</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed value, and converts it into a dataframe with one independent</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' variable and several dependent variables as columns.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param long_data The dataframe must contain one variable called "time" with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the time values specified by the \code{time} argument, one column called</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' "name" with the grouping of the observed values, and finally one column of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed values called "value".</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param time The name of the time variable in the long input data.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param outtime The name of the time variable in the wide output data.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return Dataframe in wide format.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkin_long_to_wide(FOCUS_2006_D)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export mkin_long_to_wide</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkin_long_to_wide <- function(long_data, time = "time", outtime = "time")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">22</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames <- unique(long_data$name)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">23</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> wide_data <- data.frame(time = subset(long_data, name == colnames[1], time))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">24</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> names(wide_data) <- outtime</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">25</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (var in colnames) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">26</td> + <td class="coverage">741<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> wide_data[var] <- subset(long_data, name == var, value)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">28</td> + <td class="coverage">494<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(wide_data)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/loftest.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Lack-of-fit test for models fitted to data with replicates</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This is a generic function with a method currently only defined for mkinfit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' objects. It fits an anova model to the data contained in the object and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' compares the likelihoods using the likelihood ratio test</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link[lmtest]{lrtest.default}} from the lmtest package.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The anova model is interpreted as the simplest form of an mkinfit model,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' assuming only a constant variance about the means, but not enforcing any</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' structure of the means, so we have one model parameter for every mean</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' of replicate samples.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object A model object with a defined loftest method</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Not used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">loftest <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">17</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> UseMethod("loftest")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname loftest</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats logLik lm dnorm coef</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso lrtest</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' test_data <- subset(synthetic_data_for_UBA_2014[[12]]$data, name == "parent")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sfo_fit <- mkinfit("SFO", test_data, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_res(sfo_fit) # We see a clear pattern in the residuals</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' loftest(sfo_fit) # We have a clear lack of fit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We try a different model (the one that was used to generate the data)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dfop_fit <- mkinfit("DFOP", test_data, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_res(dfop_fit) # We don't see systematic deviations, but heteroscedastic residuals</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # therefore we should consider adapting the error model, although we have</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' loftest(dfop_fit) # no lack of fit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # This is the anova model used internally for the comparison</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' test_data_anova <- test_data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' test_data_anova$time <- as.factor(test_data_anova$time)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova_fit <- lm(value ~ time, data = test_data_anova)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(anova_fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' logLik(anova_fit) # We get the same likelihood and degrees of freedom</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' test_data_2 <- synthetic_data_for_UBA_2014[[12]]$data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_synth_SFO_lin <- mkinmod(parent = list(type = "SFO", to = "M1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M1 = list(type = "SFO", to = "M2"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M2 = list(type = "SFO"), use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sfo_lin_fit <- mkinfit(m_synth_SFO_lin, test_data_2, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_res(sfo_lin_fit) # not a good model, we try parallel formation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' loftest(sfo_lin_fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_synth_SFO_par <- mkinmod(parent = list(type = "SFO", to = c("M1", "M2")),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M1 = list(type = "SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M2 = list(type = "SFO"), use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sfo_par_fit <- mkinfit(m_synth_SFO_par, test_data_2, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_res(sfo_par_fit) # much better for metabolites</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' loftest(sfo_par_fit)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_synth_DFOP_par <- mkinmod(parent = list(type = "DFOP", to = c("M1", "M2")),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M1 = list(type = "SFO"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M2 = list(type = "SFO"), use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dfop_par_fit <- mkinfit(m_synth_DFOP_par, test_data_2, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_res(dfop_par_fit) # No visual lack of fit</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' loftest(dfop_par_fit) # no lack of fit found by the test</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' #</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The anova model used for comparison in the case of transformation products</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' test_data_anova_2 <- dfop_par_fit$data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' test_data_anova_2$variable <- as.factor(test_data_anova_2$variable)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' test_data_anova_2$time <- as.factor(test_data_anova_2$time)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' anova_fit_2 <- lm(observed ~ time:variable - 1, data = test_data_anova_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(anova_fit_2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">loftest.mkinfit <- function(object, ...) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">75</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name_function <- function(x) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">76</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_name <- paste(x$mkinmod$name, "with error model", x$err_mod)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (length(x$bparms.fixed) > 0) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">78</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object_name <- paste(object_name,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">79</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> "and fixed parameter(s)",</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">80</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> paste(names(x$bparms.fixed), collapse = ", "))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(object_name)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Check if we have replicates in the data</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">86</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (max(aggregate(object$data$observed,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">87</td> + <td class="coverage">2<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> by = list(object$data$variable, object$data$time), length)$x) == 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> stop("Not defined for fits to data without replicates")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">91</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data_anova <- object$data</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data_anova$time <- as.factor(data_anova$time)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">93</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> data_anova$variable <- as.factor(data_anova$variable)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">94</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (nlevels(data_anova$variable) == 1) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_2 <- lm(observed ~ time - 1, data = data_anova)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">97</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> object_2 <- lm(observed ~ variable:time - 1,</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">98</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> data = data_anova)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">101</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_2$mkinmod <- list(name = "ANOVA")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">102</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_2$err_mod <- "const"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sigma_mle <- sqrt(sum(residuals(object_2)^2)/nobs(object_2))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">104</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_2$logLik <- sum(dnorm(x = object_2$residuals,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">105</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> mean = 0, sd = sigma_mle, log = TRUE))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">106</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_2$data <- object$data # to make the nobs.mkinfit method work</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_2$bparms.optim <- coef(object_2)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">108</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> object_2$errparms <- 1 # We have estimated one error model parameter</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">109</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(object_2) <- "mkinfit"</pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">111</td> + <td class="coverage">1<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lmtest::lrtest.default(object_2, object, name = name_function)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/add_err.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Add normally distributed errors to simulated kinetic degradation data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Normally distributed errors are added to data predicted for a specific</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' degradation model using \code{\link{mkinpredict}}. The variance of the error</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' may depend on the predicted value and is specified as a standard deviation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param prediction A prediction from a kinetic model as produced by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{mkinpredict}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param sdfunc A function taking the predicted value as its only argument and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' returning a standard deviation that should be used for generating the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' random error terms for this value.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param secondary The names of state variables that should have an initial</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' value of zero</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param n The number of datasets to be generated.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param LOD The limit of detection (LOD). Values that are below the LOD after</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' adding the random error will be set to NA.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param reps The number of replicates to be generated within the datasets.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param digits The number of digits to which the values will be rounded.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param seed The seed used for the generation of random numbers. If NA, the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' seed is not set.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats rnorm</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A list of datasets compatible with \code{\link{mmkin}}, i.e. the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' components of the list are datasets compatible with \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references Ranke J and Lehmann R (2015) To t-test or not to t-test, that is</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the question. XV Symposium on Pesticide Chemistry 2-4 September 2015,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Piacenza, Italy</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' https://jrwb.de/posters/piacenza_2015.pdf</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # The kinetic model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m_SFO_SFO <- mkinmod(parent = mkinsub("SFO", "M1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' M1 = mkinsub("SFO"), use_of_ff = "max")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Generate a prediction for a specific set of parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # This is the prediction used for the "Type 2 datasets" on the Piacenza poster</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # from 2015</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_SFO <- mkinpredict(m_SFO_SFO,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(k_parent = 0.1, f_parent_to_M1 = 0.5,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' k_M1 = log(2)/1000),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' c(parent = 100, M1 = 0),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Add an error term with a constant (independent of the value) standard deviation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # of 10, and generate three datasets</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_SFO_err <- add_err(d_SFO_SFO, function(x) 10, n = 3, seed = 123456789 )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Name the datasets for nicer plotting</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' names(d_SFO_SFO_err) <- paste("Dataset", 1:3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Name the model in the list of models (with only one member in this case) for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # nicer plotting later on. Be quiet and use only one core not to offend CRAN</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # checks</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_SFO_SFO <- mmkin(list("SFO-SFO" = m_SFO_SFO),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_SFO_SFO_err, cores = 1,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_SFO_SFO)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # We would like to inspect the fit for dataset 3 more closely</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Using double brackets makes the returned object an mkinfit object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # instead of a list of mkinfit objects, so plot.mkinfit is used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_SFO_SFO[[3]], show_residuals = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # If we use single brackets, we should give two indices (model and dataset),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # and plot.mmkin is used</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(f_SFO_SFO[1, 3])</pre> + </td> + </tr> + <tr class="never"> + <td class="num">71</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">add_err <- function(prediction, sdfunc, secondary = c("M1", "M2"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> n = 10, LOD = 0.1, reps = 2, digits = 1, seed = NA)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">77</td> + <td class="coverage">842<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (!is.na(seed)) set.seed(seed)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">79</td> + <td class="coverage">862<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> prediction <- as.data.frame(prediction)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # The output of mkinpredict is in wide format</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">82</td> + <td class="coverage">862<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_long = mkin_wide_to_long(prediction, time = "time")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set up the list to be returned</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">85</td> + <td class="coverage">862<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_return = list()</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Generate datasets one by one in a loop</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">88</td> + <td class="coverage">862<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> for (i in 1:n) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">89</td> + <td class="coverage">1712<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_rep = data.frame(lapply(d_long, rep, each = reps))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">90</td> + <td class="coverage">1712<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_rep$value = rnorm(length(d_rep$value), d_rep$value, sdfunc(d_rep$value))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">92</td> + <td class="coverage">1712<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_rep[d_rep$time == 0 & d_rep$name %in% secondary, "value"] <- 0</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Set values below the LOD to NA</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">95</td> + <td class="coverage">1712<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_NA <- transform(d_rep, value = ifelse(value < LOD, NA, value))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Round the values for convenience</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">98</td> + <td class="coverage">1712<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_NA$value <- round(d_NA$value, digits)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">100</td> + <td class="coverage">1712<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> d_return[[i]] <- d_NA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">103</td> + <td class="coverage">862<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(d_return)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkin_wide_to_long.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">utils::globalVariables(c("name", "time", "value"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Convert a dataframe with observations over time into long format</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function simply takes a dataframe with one independent variable and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' several dependent variable and converts it into the long form as required by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param wide_data The dataframe must contain one variable with the time</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' values specified by the \code{time} argument and usually more than one</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' column of observed values.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param time The name of the time variable.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return Dataframe in long format as needed for \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @keywords manip</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' wide <- data.frame(t = c(1,2,3), x = c(1,4,7), y = c(3,4,5))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' mkin_wide_to_long(wide)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' </pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkin_wide_to_long <- function(wide_data, time = "t")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">24</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> wide_data <- as.data.frame(wide_data)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">25</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> colnames <- names(wide_data)</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">26</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (!(time %in% colnames)) stop("The data in wide format have to contain a variable named ", time, ".")</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">27</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> vars <- subset(colnames, colnames != time)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">28</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> n <- length(colnames) - 1</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">29</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> long_data <- data.frame(</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">30</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> name = rep(vars, each = length(wide_data[[time]])),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> time = as.numeric(rep(wide_data[[time]], n)),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> value = as.numeric(unlist(wide_data[vars])),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> row.names = NULL)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">34</td> + <td class="coverage">1127<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(long_data)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/parent_solutions.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Single First-Order kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function describing exponential decline from a defined starting value.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @family parent solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param t Time.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param parent_0 Starting value for the response variable at time zero.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k Kinetic rate constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The value of the response variable at time \code{t}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS (2006) \dQuote{Guidance Document on Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS (2014) \dQuote{Generic guidance for Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Version 1.1, 18 December 2014</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{plot(function(x) SFO.solution(x, 100, 3), 0, 2)}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">SFO.solution <- function(t, parent_0, k)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">28</td> + <td class="coverage">2338849<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent = parent_0 * exp(-k * t)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' First-Order Multi-Compartment kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function describing exponential decline from a defined starting value, with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a decreasing rate constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The form given here differs slightly from the original reference by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Gustafson and Holden (1990). The parameter \code{beta} corresponds to 1/beta</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' in the original equation.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @family parent solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inherit SFO.solution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param alpha Shape parameter determined by coefficient of variation of rate</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' constant values.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param beta Location parameter.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note The solution of the FOMC kinetic model reduces to the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{SFO.solution}} for large values of \code{alpha} and \code{beta}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' with \eqn{k = \frac{\beta}{\alpha}}{k = beta/alpha}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS (2006) \dQuote{Guidance Document on Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">53</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">55</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' FOCUS (2014) \dQuote{Generic guidance for Estimating Persistence</pre> + </td> + </tr> + <tr class="never"> + <td class="num">56</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and Degradation Kinetics from Environmental Fate Studies on Pesticides in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">57</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' EU Registration} Report of the FOCUS Work Group on Degradation Kinetics,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">58</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Version 1.1, 18 December 2014</pre> + </td> + </tr> + <tr class="never"> + <td class="num">59</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">60</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">61</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Gustafson DI and Holden LR (1990) Nonlinear pesticide dissipation in soil:</pre> + </td> + </tr> + <tr class="never"> + <td class="num">62</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' A new model based on spatial variability. \emph{Environmental Science and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">63</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Technology} \bold{24}, 1032-1038</pre> + </td> + </tr> + <tr class="never"> + <td class="num">64</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">65</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">66</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) FOMC.solution(x, 100, 10, 2), 0, 2, ylim = c(0, 100))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">67</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">68</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">69</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">FOMC.solution <- function(t, parent_0, alpha, beta)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">70</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">71</td> + <td class="coverage">32626<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent = parent_0 / (t/beta + 1)^alpha</pre> + </td> + </tr> + <tr class="never"> + <td class="num">72</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">73</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">74</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Indeterminate order rate equation kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">75</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">76</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function describing exponential decline from a defined starting value, with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">77</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' a concentration dependent rate constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">78</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">79</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @family parent solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">80</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inherit SFO.solution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">81</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k__iore Rate constant. Note that this depends on the concentration</pre> + </td> + </tr> + <tr class="never"> + <td class="num">82</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' units used.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">83</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param N Exponent describing the nonlinearity of the rate equation</pre> + </td> + </tr> + <tr class="never"> + <td class="num">84</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note The solution of the IORE kinetic model reduces to the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">85</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{SFO.solution}} if N = 1. The parameters of the IORE model can</pre> + </td> + </tr> + <tr class="never"> + <td class="num">86</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' be transformed to equivalent parameters of the FOMC mode - see the NAFTA</pre> + </td> + </tr> + <tr class="never"> + <td class="num">87</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' guidance for details.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">88</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references NAFTA Technical Working Group on Pesticides (not dated) Guidance</pre> + </td> + </tr> + <tr class="never"> + <td class="num">89</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' for Evaluating and Calculating Degradation Kinetics in Environmental Media</pre> + </td> + </tr> + <tr class="never"> + <td class="num">90</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">91</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">92</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) IORE.solution(x, 100, 0.2, 1.3), 0, 2, ylim = c(0, 100))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">93</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">94</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.fomc <- mkinfit("FOMC", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">95</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.iore <- mkinfit("IORE", FOCUS_2006_C, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">96</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fit.iore.deS <- mkinfit("IORE", FOCUS_2006_C, solution_type = "deSolve", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">97</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">98</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(data.frame(fit.fomc$par, fit.iore$par, fit.iore.deS$par,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">99</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' row.names = paste("model par", 1:4)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">100</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' print(rbind(fomc = endpoints(fit.fomc)$distimes, iore = endpoints(fit.iore)$distimes,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">101</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' iore.deS = endpoints(fit.iore)$distimes))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">102</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">103</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">104</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">105</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">IORE.solution <- function(t, parent_0, k__iore, N)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">106</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">107</td> + <td class="coverage">42328<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent = (parent_0^(1 - N) - (1 - N) * k__iore * t)^(1/(1 - N))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">108</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">109</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">110</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Double First-Order in Parallel kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">111</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">112</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function describing decline from a defined starting value using the sum of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">113</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' two exponential decline functions.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">114</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">115</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @family parent solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">116</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inherit SFO.solution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">117</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param t Time.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">118</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k1 First kinetic constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">119</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k2 Second kinetic constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">120</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param g Fraction of the starting value declining according to the first</pre> + </td> + </tr> + <tr class="never"> + <td class="num">121</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' kinetic constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">122</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">123</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">124</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) DFOP.solution(x, 100, 5, 0.5, 0.3), 0, 4, ylim = c(0,100))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">125</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">126</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">127</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">DFOP.solution <- function(t, parent_0, k1, k2, g)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">128</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">129</td> + <td class="coverage">1904176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent = g * parent_0 * exp(-k1 * t) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">130</td> + <td class="coverage">1904176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (1 - g) * parent_0 * exp(-k2 * t)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">131</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">132</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">133</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Hockey-Stick kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">134</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">135</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function describing two exponential decline functions with a break point</pre> + </td> + </tr> + <tr class="never"> + <td class="num">136</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' between them.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">137</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">138</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @family parent solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">139</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inherit DFOP.solution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">140</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param tb Break point. Before this time, exponential decline according to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">141</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{k1} is calculated, after this time, exponential decline proceeds</pre> + </td> + </tr> + <tr class="never"> + <td class="num">142</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' according to \code{k2}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">143</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">144</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">145</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) HS.solution(x, 100, 2, 0.3, 0.5), 0, 2, ylim=c(0,100))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">146</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">147</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">148</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">HS.solution <- function(t, parent_0, k1, k2, tb)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">149</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">150</td> + <td class="coverage">22552<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent = ifelse(t <= tb,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">151</td> + <td class="coverage">22552<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_0 * exp(-k1 * t),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">152</td> + <td class="coverage">22552<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent_0 * exp(-k1 * tb) * exp(-k2 * (t - tb)))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">153</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">154</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">155</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Single First-Order Reversible Binding kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">156</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">157</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function describing the solution of the differential equations describing</pre> + </td> + </tr> + <tr class="never"> + <td class="num">158</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the kinetic model with first-order terms for a two-way transfer from a free</pre> + </td> + </tr> + <tr class="never"> + <td class="num">159</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' to a bound fraction, and a first-order degradation term for the free</pre> + </td> + </tr> + <tr class="never"> + <td class="num">160</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fraction. The initial condition is a defined amount in the free fraction</pre> + </td> + </tr> + <tr class="never"> + <td class="num">161</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and no substance in the bound fraction.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">162</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">163</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @family parent solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">164</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inherit SFO.solution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">165</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k_12 Kinetic constant describing transfer from free to bound.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">166</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k_21 Kinetic constant describing transfer from bound to free.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">167</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k_1output Kinetic constant describing degradation of the free</pre> + </td> + </tr> + <tr class="never"> + <td class="num">168</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' fraction.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">169</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The value of the response variable, which is the sum of free and</pre> + </td> + </tr> + <tr class="never"> + <td class="num">170</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' bound fractions at time \code{t}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">171</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">172</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">173</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{plot(function(x) SFORB.solution(x, 100, 0.5, 2, 3), 0, 2)}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">174</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">175</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">176</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">SFORB.solution = function(t, parent_0, k_12, k_21, k_1output) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">177</td> + <td class="coverage">9240<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sqrt_exp = sqrt(1/4 * (k_12 + k_21 + k_1output)^2 - k_1output * k_21)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">178</td> + <td class="coverage">9240<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> b1 = 0.5 * (k_12 + k_21 + k_1output) + sqrt_exp</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">179</td> + <td class="coverage">9240<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> b2 = 0.5 * (k_12 + k_21 + k_1output) - sqrt_exp</pre> + </td> + </tr> + <tr class="never"> + <td class="num">180</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">181</td> + <td class="coverage">9240<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent = parent_0 *</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">182</td> + <td class="coverage">9240<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> (((k_12 + k_21 - b1)/(b2 - b1)) * exp(-b1 * t) +</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">183</td> + <td class="coverage">9240<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ((k_12 + k_21 - b2)/(b1 - b2)) * exp(-b2 * t))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">184</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + <tr class="never"> + <td class="num">185</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="never"> + <td class="num">186</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Logistic kinetics</pre> + </td> + </tr> + <tr class="never"> + <td class="num">187</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">188</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function describing exponential decline from a defined starting value, with</pre> + </td> + </tr> + <tr class="never"> + <td class="num">189</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' an increasing rate constant, supposedly caused by microbial growth</pre> + </td> + </tr> + <tr class="never"> + <td class="num">190</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">191</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @family parent solutions</pre> + </td> + </tr> + <tr class="never"> + <td class="num">192</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @inherit SFO.solution</pre> + </td> + </tr> + <tr class="never"> + <td class="num">193</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param kmax Maximum rate constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">194</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param k0 Minimum rate constant effective at time zero.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">195</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param r Growth rate of the increase in the rate constant.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">196</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @note The solution of the logistic model reduces to the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">197</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{SFO.solution}} if \code{k0} is equal to \code{kmax}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">198</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">199</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">200</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Reproduce the plot on page 57 of FOCUS (2014)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">201</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.2),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">202</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' from = 0, to = 100, ylim = c(0, 100),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">203</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' xlab = "Time", ylab = "Residue")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">204</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.4),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">205</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' from = 0, to = 100, add = TRUE, lty = 2, col = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">206</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.8),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">207</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' from = 0, to = 100, add = TRUE, lty = 3, col = 3)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">208</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) logistic.solution(x, 100, 0.08, 0.001, 0.2),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">209</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' from = 0, to = 100, add = TRUE, lty = 4, col = 4)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">210</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot(function(x) logistic.solution(x, 100, 0.08, 0.08, 0.2),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">211</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' from = 0, to = 100, add = TRUE, lty = 5, col = 5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">212</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' legend("topright", inset = 0.05,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">213</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' legend = paste0("k0 = ", c(0.0001, 0.0001, 0.0001, 0.001, 0.08),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">214</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' ", r = ", c(0.2, 0.4, 0.8, 0.2, 0.2)),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">215</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' lty = 1:5, col = 1:5)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">216</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">217</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' # Fit with synthetic data</pre> + </td> + </tr> + <tr class="never"> + <td class="num">218</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' logistic <- mkinmod(parent = mkinsub("logistic"))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">219</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">220</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">221</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms_logistic <- c(kmax = 0.08, k0 = 0.0001, r = 0.2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">222</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_logistic <- mkinpredict(logistic,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">223</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parms_logistic, c(parent = 100),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">224</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sampling_times)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">225</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_2_1 <- add_err(d_logistic,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">226</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sdfunc = function(x) sigma_twocomp(x, 0.5, 0.07),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">227</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' n = 1, reps = 2, digits = 5, LOD = 0.1, seed = 123456)[[1]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">228</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">229</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m <- mkinfit("logistic", d_2_1, quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">230</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_sep(m)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">231</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' summary(m)$bpar</pre> + </td> + </tr> + <tr class="never"> + <td class="num">232</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' endpoints(m)$distimes</pre> + </td> + </tr> + <tr class="never"> + <td class="num">233</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">234</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">235</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">logistic.solution <- function(t, parent_0, kmax, k0, r)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">236</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">237</td> + <td class="coverage">56304<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> parent = parent_0 * (kmax / (kmax - k0 + k0 * exp (r * t))) ^(kmax/r)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">238</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/llhist.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Plot the distribution of log likelihoods from multistart objects</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Produces a histogram of log-likelihoods. In addition, the likelihood of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' original fit is shown as a red vertical line.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object The [multistart] object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param breaks Passed to [hist]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param lpos Positioning of the legend.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param main Title of the plot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots Passed to [hist]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso [multistart]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">llhist <- function(object, breaks = "Sturges", lpos = "topleft", main = "",</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">16</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> oldpar <- par(no.readonly = TRUE)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">17</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> on.exit(par(oldpar, no.readonly = TRUE))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">19</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(object, "multistart.saem.mmkin")) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">20</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> llfunc <- function(object) {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">21</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> if (inherits(object$so, "try-error")) return(NA)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">22</td> + <td class="coverage">1408<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> else return(logLik(object$so))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> } else {</pre> + </td> + </tr> + <tr class="missed"> + <td class="num">25</td> + <td class="coverage">!</td> + <td class="col-sm-12"> + <pre class="language-r"> stop("llhist is only implemented for multistart.saem.mmkin objects")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">28</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ll_orig <- logLik(attr(object, "orig"))</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">29</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ll <- stats::na.omit(sapply(object, llfunc))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">31</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> par(las = 1)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">32</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> h <- hist(ll, freq = TRUE,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">33</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> xlab = "", main = main,</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">34</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> ylab = "Frequency of log likelihoods", breaks = breaks, ...)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">36</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> freq_factor <- h$counts[1] / h$density[1]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">38</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> abline(v = ll_orig, col = 2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"></pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend(lpos, inset = c(0.05, 0.05), bty = "n",</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> lty = 1, col = c(2),</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">176<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> legend = "original fit")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/logLik.mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Calculated the log-likelihood of a fitted mkinfit object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This function returns the product of the likelihood densities of each</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed value, as calculated as part of the fitting procedure using</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{dnorm}}, i.e. assuming normal distribution, and with the means</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' predicted by the degradation model, and the standard deviations predicted by</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the error model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' The total number of estimated parameters returned with the value of the</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' likelihood is calculated as the sum of fitted degradation model parameters</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' and the fitted error model parameters.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An object of class \code{\link{mkinfit}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots For compatibility with the generic method</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return An object of class \code{\link{logLik}} with the number of estimated</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parameters (degradation model parameters plus variance model parameters)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' as attribute.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @author Johannes Ranke</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @seealso Compare the AIC of columns of \code{\link{mmkin}} objects using</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \code{\link{AIC.mmkin}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \dontrun{</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sfo_sfo <- mkinmod(</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' parent = mkinsub("SFO", to = "m1"),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' m1 = mkinsub("SFO")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' )</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_t <- subset(FOCUS_2006_D, value != 0)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nw <- mkinfit(sfo_sfo, d_t, quiet = TRUE) # no weighting (weights are unity)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_obs <- update(f_nw, error_model = "obs")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_tc <- update(f_nw, error_model = "tc")</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' AIC(f_nw, f_obs, f_tc)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">logLik.mkinfit <- function(object, ...) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">37</td> + <td class="coverage">166798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> val <- object$logLik</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r"> # Number of estimated parameters</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">39</td> + <td class="coverage">166798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(val, "df") <- length(object$bparms.optim) + length(object$errparms)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">40</td> + <td class="coverage">166798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> attr(val, "nobs") <- nobs(object)</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">41</td> + <td class="coverage">166798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> class(val) <- "logLik"</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">42</td> + <td class="coverage">166798<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(val)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/nobs.mkinfit.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Number of observations on which an mkinfit object was fitted</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @importFrom stats nobs</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param object An mkinfit object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param \dots For compatibility with the generic method</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The number of rows in the data included in the mkinfit object</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">8</td> + <td class="coverage">166810<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r">nobs.mkinfit <- function(object, ...) nrow(object$data)</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/sigma_twocomp.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Two-component error model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Function describing the standard deviation of the measurement error in</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' dependence of the measured value \eqn{y}:</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \deqn{\sigma = \sqrt{ \sigma_{low}^2 + y^2 * {rsd}_{high}^2}} sigma =</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' sqrt(sigma_low^2 + y^2 * rsd_high^2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' This is the error model used for example by Werner et al. (1978). The model</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' proposed by Rocke and Lorenzato (1995) can be written in this form as well,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' but assumes approximate lognormal distribution of errors for high values of</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' y.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param y The magnitude of the observed value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param sigma_low The asymptotic minimum of the standard deviation for low</pre> + </td> + </tr> + <tr class="never"> + <td class="num">16</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' observed values</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param rsd_high The coefficient describing the increase of the standard</pre> + </td> + </tr> + <tr class="never"> + <td class="num">18</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' deviation with the magnitude of the observed value</pre> + </td> + </tr> + <tr class="never"> + <td class="num">19</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return The standard deviation of the response variable.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">20</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @references Werner, Mario, Brooks, Samuel H., and Knott, Lancaster B. (1978)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">21</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Additive, Multiplicative, and Mixed Analytical Errors. Clinical Chemistry</pre> + </td> + </tr> + <tr class="never"> + <td class="num">22</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' 24(11), 1895-1898.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">23</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">24</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Rocke, David M. and Lorenzato, Stefan (1995) A two-component model for</pre> + </td> + </tr> + <tr class="never"> + <td class="num">25</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' measurement error in analytical chemistry. Technometrics 37(2), 176-184.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">26</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">27</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Ranke J and Meinecke S (2019) Error Models for the Kinetic Evaluation of Chemical</pre> + </td> + </tr> + <tr class="never"> + <td class="num">28</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' Degradation Data. *Environments* 6(12) 124</pre> + </td> + </tr> + <tr class="never"> + <td class="num">29</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' \doi{10.3390/environments6120124}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">30</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#'</pre> + </td> + </tr> + <tr class="never"> + <td class="num">31</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @examples</pre> + </td> + </tr> + <tr class="never"> + <td class="num">32</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' times <- c(0, 1, 3, 7, 14, 28, 60, 90, 120)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">33</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_pred <- data.frame(time = times, parent = 100 * exp(- 0.03 * times))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">34</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' set.seed(123456)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">35</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' d_syn <- add_err(d_pred, function(y) sigma_twocomp(y, 1, 0.07),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">36</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' reps = 2, n = 1)[[1]]</pre> + </td> + </tr> + <tr class="never"> + <td class="num">37</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_nls <- nls(value ~ SSasymp(time, 0, parent_0, lrc), data = d_syn,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">38</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' start = list(parent_0 = 100, lrc = -3))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">39</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' library(nlme)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">40</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_gnls <- gnls(value ~ SSasymp(time, 0, parent_0, lrc),</pre> + </td> + </tr> + <tr class="never"> + <td class="num">41</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' data = d_syn, na.action = na.omit,</pre> + </td> + </tr> + <tr class="never"> + <td class="num">42</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' start = list(parent_0 = 100, lrc = -3))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">43</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' if (length(findFunction("varConstProp")) > 0) {</pre> + </td> + </tr> + <tr class="never"> + <td class="num">44</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_gnls_tc <- update(f_gnls, weights = varConstProp())</pre> + </td> + </tr> + <tr class="never"> + <td class="num">45</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_gnls_tc_sf <- update(f_gnls_tc, control = list(sigma = 1))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">46</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' }</pre> + </td> + </tr> + <tr class="never"> + <td class="num">47</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mkin <- mkinfit("SFO", d_syn, error_model = "const", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">48</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' f_mkin_tc <- mkinfit("SFO", d_syn, error_model = "tc", quiet = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">49</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' plot_res(f_mkin_tc, standardized = TRUE)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">50</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' AIC(f_nls, f_gnls, f_gnls_tc, f_gnls_tc_sf, f_mkin, f_mkin_tc)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">51</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">52</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">sigma_twocomp <- function(y, sigma_low, rsd_high) {</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">53</td> + <td class="coverage">4250<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> sqrt(sigma_low^2 + y^2 * rsd_high^2)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">54</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <div id="R/mkinsub.R" class="hidden"> + <table class="table-condensed"> + <tbody> + <tr class="never"> + <td class="num">1</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @rdname mkinmod</pre> + </td> + </tr> + <tr class="never"> + <td class="num">2</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param submodel Character vector of length one to specify the submodel type.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">3</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' See \code{\link{mkinmod}} for the list of allowed submodel names.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">4</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param to Vector of the names of the state variable to which a</pre> + </td> + </tr> + <tr class="never"> + <td class="num">5</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' transformation shall be included in the model.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">6</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param sink Should a pathway to sink be included in the model in addition to</pre> + </td> + </tr> + <tr class="never"> + <td class="num">7</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' the pathways to other state variables?</pre> + </td> + </tr> + <tr class="never"> + <td class="num">8</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @param full_name An optional name to be used e.g. for plotting fits</pre> + </td> + </tr> + <tr class="never"> + <td class="num">9</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' performed with the model. You can use non-ASCII characters here, but then</pre> + </td> + </tr> + <tr class="never"> + <td class="num">10</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' your R code will not be portable, \emph{i.e.} may produce unintended plot</pre> + </td> + </tr> + <tr class="never"> + <td class="num">11</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' results on other operating systems or system configurations.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">12</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @return A list for use with \code{\link{mkinmod}}.</pre> + </td> + </tr> + <tr class="never"> + <td class="num">13</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">#' @export</pre> + </td> + </tr> + <tr class="never"> + <td class="num">14</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">mkinsub <- function(submodel, to = NULL, sink = TRUE, full_name = NA)</pre> + </td> + </tr> + <tr class="never"> + <td class="num">15</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">{</pre> + </td> + </tr> + <tr class="covered"> + <td class="num">16</td> + <td class="coverage">9864<em>x</em></td> + <td class="col-sm-12"> + <pre class="language-r"> return(list(type = submodel, to = to, sink = sink, full_name = full_name))</pre> + </td> + </tr> + <tr class="never"> + <td class="num">17</td> + <td class="coverage"></td> + <td class="col-sm-12"> + <pre class="language-r">}</pre> + </td> + </tr> + </tbody> + </table> + </div> + <script>$('div#files pre').each(function(i, block) { + hljs.highlightBlock(block); +});</script> + </div> + </div> + </div> + </div> + </div> +</div> +</body> +</html> diff --git a/docs/coverage/lib/bootstrap-3.3.5/css/bootstrap-theme.min.css b/docs/coverage/lib/bootstrap-3.3.5/css/bootstrap-theme.min.css new file mode 100644 index 00000000..61358b13 --- /dev/null +++ b/docs/coverage/lib/bootstrap-3.3.5/css/bootstrap-theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file diff --git a/docs/coverage/lib/bootstrap-3.3.5/css/bootstrap.min.css b/docs/coverage/lib/bootstrap-3.3.5/css/bootstrap.min.css new file mode 100644 index 00000000..9dc0f978 --- /dev/null +++ b/docs/coverage/lib/bootstrap-3.3.5/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} diff --git a/docs/coverage/lib/bootstrap-3.3.5/js/bootstrap.min.js b/docs/coverage/lib/bootstrap-3.3.5/js/bootstrap.min.js new file mode 100644 index 00000000..133aeecb --- /dev/null +++ b/docs/coverage/lib/bootstrap-3.3.5/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")), +d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file diff --git a/docs/coverage/lib/bootstrap-3.3.5/shim/html5shiv.min.js b/docs/coverage/lib/bootstrap-3.3.5/shim/html5shiv.min.js new file mode 100644 index 00000000..36831143 --- /dev/null +++ b/docs/coverage/lib/bootstrap-3.3.5/shim/html5shiv.min.js @@ -0,0 +1,7 @@ +/** +* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +// Only run this code in IE 8 +if (!!window.navigator.userAgent.match("MSIE 8")) { +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); +}; diff --git a/docs/coverage/lib/bootstrap-3.3.5/shim/respond.min.js b/docs/coverage/lib/bootstrap-3.3.5/shim/respond.min.js new file mode 100644 index 00000000..22094690 --- /dev/null +++ b/docs/coverage/lib/bootstrap-3.3.5/shim/respond.min.js @@ -0,0 +1,8 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl + * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT + * */ + +// Only run this code in IE 8 +if (!!window.navigator.userAgent.match("MSIE 8")) { +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this); +}; diff --git a/docs/coverage/lib/crosstalk-1.2.1/css/crosstalk.min.css b/docs/coverage/lib/crosstalk-1.2.1/css/crosstalk.min.css new file mode 100644 index 00000000..6b453828 --- /dev/null +++ b/docs/coverage/lib/crosstalk-1.2.1/css/crosstalk.min.css @@ -0,0 +1 @@ +.container-fluid.crosstalk-bscols{margin-left:-30px;margin-right:-30px;white-space:normal}body>.container-fluid.crosstalk-bscols{margin-left:auto;margin-right:auto}.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:inline-block;padding-right:12px;vertical-align:top}@media only screen and (max-width: 480px){.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:block;padding-right:inherit}}.crosstalk-input{margin-bottom:15px}.crosstalk-input .control-label{margin-bottom:0;vertical-align:middle}.crosstalk-input input[type="checkbox"]{margin:4px 0 0;margin-top:1px;line-height:normal}.crosstalk-input .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.crosstalk-input .checkbox>label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.crosstalk-input .checkbox input[type="checkbox"],.crosstalk-input .checkbox-inline input[type="checkbox"]{position:absolute;margin-top:2px;margin-left:-20px}.crosstalk-input .checkbox+.checkbox{margin-top:-5px}.crosstalk-input .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.crosstalk-input .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px} diff --git a/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.js b/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.js new file mode 100644 index 00000000..fd9eb53d --- /dev/null +++ b/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.js @@ -0,0 +1,1474 @@ +(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Events = function () { + function Events() { + _classCallCheck(this, Events); + + this._types = {}; + this._seq = 0; + } + + _createClass(Events, [{ + key: "on", + value: function on(eventType, listener) { + var subs = this._types[eventType]; + if (!subs) { + subs = this._types[eventType] = {}; + } + var sub = "sub" + this._seq++; + subs[sub] = listener; + return sub; + } + + // Returns false if no match, or string for sub name if matched + + }, { + key: "off", + value: function off(eventType, listener) { + var subs = this._types[eventType]; + if (typeof listener === "function") { + for (var key in subs) { + if (subs.hasOwnProperty(key)) { + if (subs[key] === listener) { + delete subs[key]; + return key; + } + } + } + return false; + } else if (typeof listener === "string") { + if (subs && subs[listener]) { + delete subs[listener]; + return listener; + } + return false; + } else { + throw new Error("Unexpected type for listener"); + } + } + }, { + key: "trigger", + value: function trigger(eventType, arg, thisObj) { + var subs = this._types[eventType]; + for (var key in subs) { + if (subs.hasOwnProperty(key)) { + subs[key].call(thisObj, arg); + } + } + } + }]); + + return Events; +}(); + +exports.default = Events; + +},{}],2:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.FilterHandle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +var _filterset = require("./filterset"); + +var _filterset2 = _interopRequireDefault(_filterset); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function getFilterSet(group) { + var fsVar = group.var("filterset"); + var result = fsVar.get(); + if (!result) { + result = new _filterset2.default(); + fsVar.set(result); + } + return result; +} + +var id = 1; +function nextId() { + return id++; +} + +/** + * Use this class to contribute to, and listen for changes to, the filter set + * for the given group of widgets. Filter input controls should create one + * `FilterHandle` and only call {@link FilterHandle#set}. Output widgets that + * wish to displayed filtered data should create one `FilterHandle` and use + * the {@link FilterHandle#filteredKeys} property and listen for change + * events. + * + * If two (or more) `FilterHandle` instances in the same webpage share the + * same group name, they will contribute to a single "filter set". Each + * `FilterHandle` starts out with a `null` value, which means they take + * nothing away from the set of data that should be shown. To make a + * `FilterHandle` actually remove data from the filter set, set its value to + * an array of keys which should be displayed. Crosstalk will aggregate the + * various key arrays by finding their intersection; only keys that are + * present in all non-null filter handles are considered part of the filter + * set. + * + * @param {string} [group] - The name of the Crosstalk group, or if none, + * null or undefined (or any other falsy value). This can be changed later + * via the {@link FilterHandle#setGroup} method. + * @param {Object} [extraInfo] - An object whose properties will be copied to + * the event object whenever an event is emitted. + */ + +var FilterHandle = exports.FilterHandle = function () { + function FilterHandle(group, extraInfo) { + _classCallCheck(this, FilterHandle); + + this._eventRelay = new _events2.default(); + this._emitter = new util.SubscriptionTracker(this._eventRelay); + + // Name of the group we're currently tracking, if any. Can change over time. + this._group = null; + // The filterSet that we're tracking, if any. Can change over time. + this._filterSet = null; + // The Var we're currently tracking, if any. Can change over time. + this._filterVar = null; + // The event handler subscription we currently have on var.on("change"). + this._varOnChangeSub = null; + + this._extraInfo = util.extend({ sender: this }, extraInfo); + + this._id = "filter" + nextId(); + + this.setGroup(group); + } + + /** + * Changes the Crosstalk group membership of this FilterHandle. If `set()` was + * previously called on this handle, switching groups will clear those keys + * from the old group's filter set. These keys will not be applied to the new + * group's filter set either. In other words, `setGroup()` effectively calls + * `clear()` before switching groups. + * + * @param {string} group - The name of the Crosstalk group, or null (or + * undefined) to clear the group. + */ + + + _createClass(FilterHandle, [{ + key: "setGroup", + value: function setGroup(group) { + var _this = this; + + // If group is unchanged, do nothing + if (this._group === group) return; + // Treat null, undefined, and other falsy values the same + if (!this._group && !group) return; + + if (this._filterVar) { + this._filterVar.off("change", this._varOnChangeSub); + this.clear(); + this._varOnChangeSub = null; + this._filterVar = null; + this._filterSet = null; + } + + this._group = group; + + if (group) { + group = (0, _group2.default)(group); + this._filterSet = getFilterSet(group); + this._filterVar = (0, _group2.default)(group).var("filter"); + var sub = this._filterVar.on("change", function (e) { + _this._eventRelay.trigger("change", e, _this); + }); + this._varOnChangeSub = sub; + } + } + + /** + * Combine the given `extraInfo` (if any) with the handle's default + * `_extraInfo` (if any). + * @private + */ + + }, { + key: "_mergeExtraInfo", + value: function _mergeExtraInfo(extraInfo) { + return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null); + } + + /** + * Close the handle. This clears this handle's contribution to the filter set, + * and unsubscribes all event listeners. + */ + + }, { + key: "close", + value: function close() { + this._emitter.removeAllListeners(); + this.clear(); + this.setGroup(null); + } + + /** + * Clear this handle's contribution to the filter set. + * + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any options that were + * passed into the `FilterHandle` constructor). + * + * @fires FilterHandle#change + */ + + }, { + key: "clear", + value: function clear(extraInfo) { + if (!this._filterSet) return; + this._filterSet.clear(this._id); + this._onChange(extraInfo); + } + + /** + * Set this handle's contribution to the filter set. This array should consist + * of the keys of the rows that _should_ be displayed; any keys that are not + * present in the array will be considered _filtered out_. Note that multiple + * `FilterHandle` instances in the group may each contribute an array of keys, + * and only those keys that appear in _all_ of the arrays make it through the + * filter. + * + * @param {string[]} keys - Empty array, or array of keys. To clear the + * filter, don't pass an empty array; instead, use the + * {@link FilterHandle#clear} method. + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any options that were + * passed into the `FilterHandle` constructor). + * + * @fires FilterHandle#change + */ + + }, { + key: "set", + value: function set(keys, extraInfo) { + if (!this._filterSet) return; + this._filterSet.update(this._id, keys); + this._onChange(extraInfo); + } + + /** + * @return {string[]|null} - Either: 1) an array of keys that made it through + * all of the `FilterHandle` instances, or, 2) `null`, which means no filter + * is being applied (all data should be displayed). + */ + + }, { + key: "on", + + + /** + * Subscribe to events on this `FilterHandle`. + * + * @param {string} eventType - Indicates the type of events to listen to. + * Currently, only `"change"` is supported. + * @param {FilterHandle~listener} listener - The callback function that + * will be invoked when the event occurs. + * @return {string} - A token to pass to {@link FilterHandle#off} to cancel + * this subscription. + */ + value: function on(eventType, listener) { + return this._emitter.on(eventType, listener); + } + + /** + * Cancel event subscriptions created by {@link FilterHandle#on}. + * + * @param {string} eventType - The type of event to unsubscribe. + * @param {string|FilterHandle~listener} listener - Either the callback + * function previously passed into {@link FilterHandle#on}, or the + * string that was returned from {@link FilterHandle#on}. + */ + + }, { + key: "off", + value: function off(eventType, listener) { + return this._emitter.off(eventType, listener); + } + }, { + key: "_onChange", + value: function _onChange(extraInfo) { + if (!this._filterSet) return; + this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo)); + } + + /** + * @callback FilterHandle~listener + * @param {Object} event - An object containing details of the event. For + * `"change"` events, this includes the properties `value` (the new + * value of the filter set, or `null` if no filter set is active), + * `oldValue` (the previous value of the filter set), and `sender` (the + * `FilterHandle` instance that made the change). + */ + + }, { + key: "filteredKeys", + get: function get() { + return this._filterSet ? this._filterSet.value : null; + } + }]); + + return FilterHandle; +}(); + +/** + * @event FilterHandle#change + * @type {object} + * @property {object} value - The new value of the filter set, or `null` + * if no filter set is active. + * @property {object} oldValue - The previous value of the filter set. + * @property {FilterHandle} sender - The `FilterHandle` instance that + * changed the value. + */ + +},{"./events":1,"./filterset":3,"./group":4,"./util":11}],3:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _util = require("./util"); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function naturalComparator(a, b) { + if (a === b) { + return 0; + } else if (a < b) { + return -1; + } else if (a > b) { + return 1; + } +} + +/** + * @private + */ + +var FilterSet = function () { + function FilterSet() { + _classCallCheck(this, FilterSet); + + this.reset(); + } + + _createClass(FilterSet, [{ + key: "reset", + value: function reset() { + // Key: handle ID, Value: array of selected keys, or null + this._handles = {}; + // Key: key string, Value: count of handles that include it + this._keys = {}; + this._value = null; + this._activeHandles = 0; + } + }, { + key: "update", + value: function update(handleId, keys) { + if (keys !== null) { + keys = keys.slice(0); // clone before sorting + keys.sort(naturalComparator); + } + + var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys), + added = _diffSortedLists.added, + removed = _diffSortedLists.removed; + + this._handles[handleId] = keys; + + for (var i = 0; i < added.length; i++) { + this._keys[added[i]] = (this._keys[added[i]] || 0) + 1; + } + for (var _i = 0; _i < removed.length; _i++) { + this._keys[removed[_i]]--; + } + + this._updateValue(keys); + } + + /** + * @param {string[]} keys Sorted array of strings that indicate + * a superset of possible keys. + * @private + */ + + }, { + key: "_updateValue", + value: function _updateValue() { + var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys; + + var handleCount = Object.keys(this._handles).length; + if (handleCount === 0) { + this._value = null; + } else { + this._value = []; + for (var i = 0; i < keys.length; i++) { + var count = this._keys[keys[i]]; + if (count === handleCount) { + this._value.push(keys[i]); + } + } + } + } + }, { + key: "clear", + value: function clear(handleId) { + if (typeof this._handles[handleId] === "undefined") { + return; + } + + var keys = this._handles[handleId]; + if (!keys) { + keys = []; + } + + for (var i = 0; i < keys.length; i++) { + this._keys[keys[i]]--; + } + delete this._handles[handleId]; + + this._updateValue(); + } + }, { + key: "value", + get: function get() { + return this._value; + } + }, { + key: "_allKeys", + get: function get() { + var allKeys = Object.keys(this._keys); + allKeys.sort(naturalComparator); + return allKeys; + } + }]); + + return FilterSet; +}(); + +exports.default = FilterSet; + +},{"./util":11}],4:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.default = group; + +var _var2 = require("./var"); + +var _var3 = _interopRequireDefault(_var2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// Use a global so that multiple copies of crosstalk.js can be loaded and still +// have groups behave as singletons across all copies. +global.__crosstalk_groups = global.__crosstalk_groups || {}; +var groups = global.__crosstalk_groups; + +function group(groupName) { + if (groupName && typeof groupName === "string") { + if (!groups.hasOwnProperty(groupName)) { + groups[groupName] = new Group(groupName); + } + return groups[groupName]; + } else if ((typeof groupName === "undefined" ? "undefined" : _typeof(groupName)) === "object" && groupName._vars && groupName.var) { + // Appears to already be a group object + return groupName; + } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === "string") { + return group(groupName[0]); + } else { + throw new Error("Invalid groupName argument"); + } +} + +var Group = function () { + function Group(name) { + _classCallCheck(this, Group); + + this.name = name; + this._vars = {}; + } + + _createClass(Group, [{ + key: "var", + value: function _var(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name); + return this._vars[name]; + } + }, { + key: "has", + value: function has(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + return this._vars.hasOwnProperty(name); + } + }]); + + return Group; +}(); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./var":12}],5:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _selection = require("./selection"); + +var _filter = require("./filter"); + +var _input = require("./input"); + +require("./input_selectize"); + +require("./input_checkboxgroup"); + +require("./input_slider"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var defaultGroup = (0, _group2.default)("default"); + +function var_(name) { + return defaultGroup.var(name); +} + +function has(name) { + return defaultGroup.has(name); +} + +if (global.Shiny) { + global.Shiny.addCustomMessageHandler("update-client-value", function (message) { + if (typeof message.group === "string") { + (0, _group2.default)(message.group).var(message.name).set(message.value); + } else { + var_(message.name).set(message.value); + } + }); +} + +var crosstalk = { + group: _group2.default, + var: var_, + has: has, + SelectionHandle: _selection.SelectionHandle, + FilterHandle: _filter.FilterHandle, + bind: _input.bind +}; + +/** + * @namespace crosstalk + */ +exports.default = crosstalk; + +global.crosstalk = crosstalk; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.register = register; +exports.bind = bind; +var $ = global.jQuery; + +var bindings = {}; + +function register(reg) { + bindings[reg.className] = reg; + if (global.document && global.document.readyState !== "complete") { + $(function () { + bind(); + }); + } else if (global.document) { + setTimeout(bind, 100); + } +} + +function bind() { + Object.keys(bindings).forEach(function (className) { + var binding = bindings[className]; + $("." + binding.className).not(".crosstalk-input-bound").each(function (i, el) { + bindInstance(binding, el); + }); + }); +} + +// Escape jQuery identifier +function $escape(val) { + return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); +} + +function bindEl(el) { + var $el = $(el); + Object.keys(bindings).forEach(function (className) { + if ($el.hasClass(className) && !$el.hasClass("crosstalk-input-bound")) { + var binding = bindings[className]; + bindInstance(binding, el); + } + }); +} + +function bindInstance(binding, el) { + var jsonEl = $(el).find("script[type='application/json'][data-for='" + $escape(el.id) + "']"); + var data = JSON.parse(jsonEl[0].innerText); + + var instance = binding.factory(el, data); + $(el).data("crosstalk-instance", instance); + $(el).addClass("crosstalk-input-bound"); +} + +if (global.Shiny) { + var inputBinding = new global.Shiny.InputBinding(); + var _$ = global.jQuery; + _$.extend(inputBinding, { + find: function find(scope) { + return _$(scope).find(".crosstalk-input"); + }, + initialize: function initialize(el) { + if (!_$(el).hasClass("crosstalk-input-bound")) { + bindEl(el); + } + }, + getId: function getId(el) { + return el.id; + }, + getValue: function getValue(el) {}, + setValue: function setValue(el, value) {}, + receiveMessage: function receiveMessage(el, data) {}, + subscribe: function subscribe(el, callback) { + _$(el).data("crosstalk-instance").resume(); + }, + unsubscribe: function unsubscribe(el) { + _$(el).data("crosstalk-instance").suspend(); + } + }); + global.Shiny.inputBindings.register(inputBinding, "crosstalk.inputBinding"); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],7:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-checkboxgroup", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + var $el = $(el); + $el.on("change", "input[type='checkbox']", function () { + var checked = $el.find("input[type='checkbox']:checked"); + if (checked.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + checked.each(function () { + data.map[this.value].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],8:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-select", + + factory: function factory(el, data) { + /* + * items: {value: [...], label: [...]} + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + + var first = [{ value: "", label: "(All)" }]; + var items = util.dataframeToD3(data.items); + var opts = { + options: first.concat(items), + valueField: "value", + labelField: "label", + searchField: "label" + }; + + var select = $(el).find("select")[0]; + + var selectize = $(select).selectize(opts)[0].selectize; + + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + selectize.on("change", function () { + if (selectize.items.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + selectize.items.forEach(function (group) { + data.map[group].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6,"./util":11}],9:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; +var strftime = global.strftime; + +input.register({ + className: "crosstalk-input-slider", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var opts = {}; + var $el = $(el).find("input"); + var dataType = $el.data("data-type"); + var timeFormat = $el.data("time-format"); + var round = $el.data("round"); + var timeFormatter = void 0; + + // Set up formatting functions + if (dataType === "date") { + timeFormatter = strftime.utc(); + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "datetime") { + var timezone = $el.data("timezone"); + if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime; + + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "number") { + if (typeof round !== "undefined") opts.prettify = function (num) { + var factor = Math.pow(10, round); + return Math.round(num * factor) / factor; + }; + } + + $el.ionRangeSlider(opts); + + function getValue() { + var result = $el.data("ionRangeSlider").result; + + // Function for converting numeric value from slider to appropriate type. + var convert = void 0; + var dataType = $el.data("data-type"); + if (dataType === "date") { + convert = function convert(val) { + return formatDateUTC(new Date(+val)); + }; + } else if (dataType === "datetime") { + convert = function convert(val) { + // Convert ms to s + return +val / 1000; + }; + } else { + convert = function convert(val) { + return +val; + }; + } + + if ($el.data("ionRangeSlider").options.type === "double") { + return [convert(result.from), convert(result.to)]; + } else { + return convert(result.from); + } + } + + var lastKnownKeys = null; + + $el.on("change.crosstalkSliderInput", function (event) { + if (!$el.data("updating") && !$el.data("animating")) { + var _getValue = getValue(), + _getValue2 = _slicedToArray(_getValue, 2), + from = _getValue2[0], + to = _getValue2[1]; + + var keys = []; + for (var i = 0; i < data.values.length; i++) { + var val = data.values[i]; + if (val >= from && val <= to) { + keys.push(data.keys[i]); + } + } + keys.sort(); + ctHandle.set(keys); + lastKnownKeys = keys; + } + }); + + // let $el = $(el); + // $el.on("change", "input[type="checkbox"]", function() { + // let checked = $el.find("input[type="checkbox"]:checked"); + // if (checked.length === 0) { + // ctHandle.clear(); + // } else { + // let keys = {}; + // checked.each(function() { + // data.map[this.value].forEach(function(key) { + // keys[key] = true; + // }); + // }); + // let keyArray = Object.keys(keys); + // keyArray.sort(); + // ctHandle.set(keyArray); + // } + // }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +// Convert a number to a string with leading zeros +function padZeros(n, digits) { + var str = n.toString(); + while (str.length < digits) { + str = "0" + str; + }return str; +} + +// Given a Date object, return a string in yyyy-mm-dd format, using the +// UTC date. This may be a day off from the date in the local time zone. +function formatDateUTC(date) { + if (date instanceof Date) { + return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2); + } else { + return null; + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SelectionHandle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Use this class to read and write (and listen for changes to) the selection + * for a Crosstalk group. This is intended to be used for linked brushing. + * + * If two (or more) `SelectionHandle` instances in the same webpage share the + * same group name, they will share the same state. Setting the selection using + * one `SelectionHandle` instance will result in the `value` property instantly + * changing across the others, and `"change"` event listeners on all instances + * (including the one that initiated the sending) will fire. + * + * @param {string} [group] - The name of the Crosstalk group, or if none, + * null or undefined (or any other falsy value). This can be changed later + * via the [SelectionHandle#setGroup](#setGroup) method. + * @param {Object} [extraInfo] - An object whose properties will be copied to + * the event object whenever an event is emitted. + */ +var SelectionHandle = exports.SelectionHandle = function () { + function SelectionHandle() { + var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, SelectionHandle); + + this._eventRelay = new _events2.default(); + this._emitter = new util.SubscriptionTracker(this._eventRelay); + + // Name of the group we're currently tracking, if any. Can change over time. + this._group = null; + // The Var we're currently tracking, if any. Can change over time. + this._var = null; + // The event handler subscription we currently have on var.on("change"). + this._varOnChangeSub = null; + + this._extraInfo = util.extend({ sender: this }, extraInfo); + + this.setGroup(group); + } + + /** + * Changes the Crosstalk group membership of this SelectionHandle. The group + * being switched away from (if any) will not have its selection value + * modified as a result of calling `setGroup`, even if this handle was the + * most recent handle to set the selection of the group. + * + * The group being switched to (if any) will also not have its selection value + * modified as a result of calling `setGroup`. If you want to set the + * selection value of the new group, call `set` explicitly. + * + * @param {string} group - The name of the Crosstalk group, or null (or + * undefined) to clear the group. + */ + + + _createClass(SelectionHandle, [{ + key: "setGroup", + value: function setGroup(group) { + var _this = this; + + // If group is unchanged, do nothing + if (this._group === group) return; + // Treat null, undefined, and other falsy values the same + if (!this._group && !group) return; + + if (this._var) { + this._var.off("change", this._varOnChangeSub); + this._var = null; + this._varOnChangeSub = null; + } + + this._group = group; + + if (group) { + this._var = (0, _group2.default)(group).var("selection"); + var sub = this._var.on("change", function (e) { + _this._eventRelay.trigger("change", e, _this); + }); + this._varOnChangeSub = sub; + } + } + + /** + * Retrieves the current selection for the group represented by this + * `SelectionHandle`. + * + * - If no selection is active, then this value will be falsy. + * - If a selection is active, but no data points are selected, then this + * value will be an empty array. + * - If a selection is active, and data points are selected, then the keys + * of the selected data points will be present in the array. + */ + + }, { + key: "_mergeExtraInfo", + + + /** + * Combines the given `extraInfo` (if any) with the handle's default + * `_extraInfo` (if any). + * @private + */ + value: function _mergeExtraInfo(extraInfo) { + // Important incidental effect: shallow clone is returned + return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see + * {@link SelectionHandle#value}). + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any options that were + * passed into the `SelectionHandle` constructor). + */ + + }, { + key: "set", + value: function set(selectedKeys, extraInfo) { + if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo)); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any that were passed + * into the `SelectionHandle` constructor). + */ + + }, { + key: "clear", + value: function clear(extraInfo) { + if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo)); + } + + /** + * Subscribes to events on this `SelectionHandle`. + * + * @param {string} eventType - Indicates the type of events to listen to. + * Currently, only `"change"` is supported. + * @param {SelectionHandle~listener} listener - The callback function that + * will be invoked when the event occurs. + * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel + * this subscription. + */ + + }, { + key: "on", + value: function on(eventType, listener) { + return this._emitter.on(eventType, listener); + } + + /** + * Cancels event subscriptions created by {@link SelectionHandle#on}. + * + * @param {string} eventType - The type of event to unsubscribe. + * @param {string|SelectionHandle~listener} listener - Either the callback + * function previously passed into {@link SelectionHandle#on}, or the + * string that was returned from {@link SelectionHandle#on}. + */ + + }, { + key: "off", + value: function off(eventType, listener) { + return this._emitter.off(eventType, listener); + } + + /** + * Shuts down the `SelectionHandle` object. + * + * Removes all event listeners that were added through this handle. + */ + + }, { + key: "close", + value: function close() { + this._emitter.removeAllListeners(); + this.setGroup(null); + } + }, { + key: "value", + get: function get() { + return this._var ? this._var.get() : null; + } + }]); + + return SelectionHandle; +}(); + +/** + * @callback SelectionHandle~listener + * @param {Object} event - An object containing details of the event. For + * `"change"` events, this includes the properties `value` (the new + * value of the selection, or `undefined` if no selection is active), + * `oldValue` (the previous value of the selection), and `sender` (the + * `SelectionHandle` instance that made the change). + */ + +/** + * @event SelectionHandle#change + * @type {object} + * @property {object} value - The new value of the selection, or `undefined` + * if no selection is active. + * @property {object} oldValue - The previous value of the selection. + * @property {SelectionHandle} sender - The `SelectionHandle` instance that + * changed the value. + */ + +},{"./events":1,"./group":4,"./util":11}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.extend = extend; +exports.checkSorted = checkSorted; +exports.diffSortedLists = diffSortedLists; +exports.dataframeToD3 = dataframeToD3; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function extend(target) { + for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + for (var i = 0; i < sources.length; i++) { + var src = sources[i]; + if (typeof src === "undefined" || src === null) continue; + + for (var key in src) { + if (src.hasOwnProperty(key)) { + target[key] = src[key]; + } + } + } + return target; +} + +function checkSorted(list) { + for (var i = 1; i < list.length; i++) { + if (list[i] <= list[i - 1]) { + throw new Error("List is not sorted or contains duplicate"); + } + } +} + +function diffSortedLists(a, b) { + var i_a = 0; + var i_b = 0; + + if (!a) a = []; + if (!b) b = []; + + var a_only = []; + var b_only = []; + + checkSorted(a); + checkSorted(b); + + while (i_a < a.length && i_b < b.length) { + if (a[i_a] === b[i_b]) { + i_a++; + i_b++; + } else if (a[i_a] < b[i_b]) { + a_only.push(a[i_a++]); + } else { + b_only.push(b[i_b++]); + } + } + + if (i_a < a.length) a_only = a_only.concat(a.slice(i_a)); + if (i_b < b.length) b_only = b_only.concat(b.slice(i_b)); + return { + removed: a_only, + added: b_only + }; +} + +// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... } +// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ] +function dataframeToD3(df) { + var names = []; + var length = void 0; + for (var name in df) { + if (df.hasOwnProperty(name)) names.push(name); + if (_typeof(df[name]) !== "object" || typeof df[name].length === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof length !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item = void 0; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; +} + +/** + * Keeps track of all event listener additions/removals and lets all active + * listeners be removed with a single operation. + * + * @private + */ + +var SubscriptionTracker = exports.SubscriptionTracker = function () { + function SubscriptionTracker(emitter) { + _classCallCheck(this, SubscriptionTracker); + + this._emitter = emitter; + this._subs = {}; + } + + _createClass(SubscriptionTracker, [{ + key: "on", + value: function on(eventType, listener) { + var sub = this._emitter.on(eventType, listener); + this._subs[sub] = eventType; + return sub; + } + }, { + key: "off", + value: function off(eventType, listener) { + var sub = this._emitter.off(eventType, listener); + if (sub) { + delete this._subs[sub]; + } + return sub; + } + }, { + key: "removeAllListeners", + value: function removeAllListeners() { + var _this = this; + + var current_subs = this._subs; + this._subs = {}; + Object.keys(current_subs).forEach(function (sub) { + _this._emitter.off(current_subs[sub], sub); + }); + } + }]); + + return SubscriptionTracker; +}(); + +},{}],12:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Var = function () { + function Var(group, name, /*optional*/value) { + _classCallCheck(this, Var); + + this._group = group; + this._name = name; + this._value = value; + this._events = new _events2.default(); + } + + _createClass(Var, [{ + key: "get", + value: function get() { + return this._value; + } + }, { + key: "set", + value: function set(value, /*optional*/event) { + if (this._value === value) { + // Do nothing; the value hasn't changed + return; + } + var oldValue = this._value; + this._value = value; + // Alert JavaScript listeners that the value has changed + var evt = {}; + if (event && (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object") { + for (var k in event) { + if (event.hasOwnProperty(k)) evt[k] = event[k]; + } + } + evt.oldValue = oldValue; + evt.value = value; + this._events.trigger("change", evt, this); + + // TODO: Make this extensible, to let arbitrary back-ends know that + // something has changed + if (global.Shiny && global.Shiny.onInputChange) { + global.Shiny.onInputChange(".clientValue-" + (this._group.name !== null ? this._group.name + "-" : "") + this._name, typeof value === "undefined" ? null : value); + } + } + }, { + key: "on", + value: function on(eventType, listener) { + return this._events.on(eventType, listener); + } + }, { + key: "off", + value: function off(eventType, listener) { + return this._events.off(eventType, listener); + } + }]); + + return Var; +}(); + +exports.default = Var; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./events":1}]},{},[5]) +//# sourceMappingURL=crosstalk.js.map diff --git a/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.js.map b/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.js.map new file mode 100644 index 00000000..cff94f08 --- /dev/null +++ b/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.js.map @@ -0,0 +1,37 @@ +{ + "version": 3, + "sources": [ + "node_modules/browser-pack/_prelude.js", + "javascript/src/events.js", + "javascript/src/filter.js", + "javascript/src/filterset.js", + "javascript/src/group.js", + "javascript/src/index.js", + "javascript/src/input.js", + "javascript/src/input_checkboxgroup.js", + "javascript/src/input_selectize.js", + "javascript/src/input_slider.js", + "javascript/src/selection.js", + "javascript/src/util.js", + "javascript/src/var.js" + ], + "names": [], + "mappings": "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", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()", + "export default class Events {\n constructor() {\n this._types = {};\n this._seq = 0;\n }\n\n on(eventType, listener) {\n let subs = this._types[eventType];\n if (!subs) {\n subs = this._types[eventType] = {};\n }\n let sub = \"sub\" + (this._seq++);\n subs[sub] = listener;\n return sub;\n }\n\n // Returns false if no match, or string for sub name if matched\n off(eventType, listener) {\n let subs = this._types[eventType];\n if (typeof(listener) === \"function\") {\n for (let key in subs) {\n if (subs.hasOwnProperty(key)) {\n if (subs[key] === listener) {\n delete subs[key];\n return key;\n }\n }\n }\n return false;\n } else if (typeof(listener) === \"string\") {\n if (subs && subs[listener]) {\n delete subs[listener];\n return listener;\n }\n return false;\n } else {\n throw new Error(\"Unexpected type for listener\");\n }\n }\n\n trigger(eventType, arg, thisObj) {\n let subs = this._types[eventType];\n for (let key in subs) {\n if (subs.hasOwnProperty(key)) {\n subs[key].call(thisObj, arg);\n }\n }\n }\n}\n", + "import Events from \"./events\";\nimport FilterSet from \"./filterset\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\nfunction getFilterSet(group) {\n let fsVar = group.var(\"filterset\");\n let result = fsVar.get();\n if (!result) {\n result = new FilterSet();\n fsVar.set(result);\n }\n return result;\n}\n\nlet id = 1;\nfunction nextId() {\n return id++;\n}\n\n/**\n * Use this class to contribute to, and listen for changes to, the filter set\n * for the given group of widgets. Filter input controls should create one\n * `FilterHandle` and only call {@link FilterHandle#set}. Output widgets that\n * wish to displayed filtered data should create one `FilterHandle` and use\n * the {@link FilterHandle#filteredKeys} property and listen for change\n * events.\n *\n * If two (or more) `FilterHandle` instances in the same webpage share the\n * same group name, they will contribute to a single \"filter set\". Each\n * `FilterHandle` starts out with a `null` value, which means they take\n * nothing away from the set of data that should be shown. To make a\n * `FilterHandle` actually remove data from the filter set, set its value to\n * an array of keys which should be displayed. Crosstalk will aggregate the\n * various key arrays by finding their intersection; only keys that are\n * present in all non-null filter handles are considered part of the filter\n * set.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the {@link FilterHandle#setGroup} method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class FilterHandle {\n constructor(group, extraInfo) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The filterSet that we're tracking, if any. Can change over time.\n this._filterSet = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._filterVar = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this._id = \"filter\" + nextId();\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this FilterHandle. If `set()` was\n * previously called on this handle, switching groups will clear those keys\n * from the old group's filter set. These keys will not be applied to the new\n * group's filter set either. In other words, `setGroup()` effectively calls\n * `clear()` before switching groups.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._filterVar) {\n this._filterVar.off(\"change\", this._varOnChangeSub);\n this.clear();\n this._varOnChangeSub = null;\n this._filterVar = null;\n this._filterSet = null;\n }\n\n this._group = group;\n\n if (group) {\n group = grp(group);\n this._filterSet = getFilterSet(group);\n this._filterVar = grp(group).var(\"filter\");\n let sub = this._filterVar.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n", + "import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n", + "import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n", + "import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n", + "let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n", + "import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n", + "export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n", + "import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n" + ] +}
\ No newline at end of file diff --git a/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.min.js b/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.min.js new file mode 100644 index 00000000..b7ec0ac9 --- /dev/null +++ b/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.min.js @@ -0,0 +1,2 @@ +!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e<l.length;e++)s(l[e]);return s}({1:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}();var i=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._types={},this._seq=0}return r(e,[{key:"on",value:function(e,t){var n=this._types[e];n||(n=this._types[e]={});var r="sub"+this._seq++;return n[r]=t,r}},{key:"off",value:function(e,t){var n=this._types[e];if("function"==typeof t){for(var r in n)if(n.hasOwnProperty(r)&&n[r]===t)return delete n[r],r;return!1}if("string"==typeof t)return!(!n||!n[t])&&(delete n[t],t);throw new Error("Unexpected type for listener")}},{key:"trigger",value:function(e,t,n){var r=this._types[e];for(var i in r)r.hasOwnProperty(i)&&r[i].call(n,t)}}]),e}();n.default=i},{}],2:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.FilterHandle=void 0;var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),i=l(e("./events")),o=l(e("./filterset")),u=l(e("./group")),a=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(e("./util"));function l(e){return e&&e.__esModule?e:{default:e}}var s=1;n.FilterHandle=function(){function n(e,t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n),this._eventRelay=new i.default,this._emitter=new a.SubscriptionTracker(this._eventRelay),this._group=null,this._filterSet=null,this._filterVar=null,this._varOnChangeSub=null,this._extraInfo=a.extend({sender:this},t),this._id="filter"+s++,this.setGroup(e)}return r(n,[{key:"setGroup",value:function(e){var t,n,r=this;if(this._group!==e&&((this._group||e)&&(this._filterVar&&(this._filterVar.off("change",this._varOnChangeSub),this.clear(),this._varOnChangeSub=null,this._filterVar=null,this._filterSet=null),this._group=e))){e=(0,u.default)(e),this._filterSet=(t=e.var("filterset"),(n=t.get())||(n=new o.default,t.set(n)),n),this._filterVar=(0,u.default)(e).var("filter");var i=this._filterVar.on("change",function(e){r._eventRelay.trigger("change",e,r)});this._varOnChangeSub=i}}},{key:"_mergeExtraInfo",value:function(e){return a.extend({},this._extraInfo?this._extraInfo:null,e||null)}},{key:"close",value:function(){this._emitter.removeAllListeners(),this.clear(),this.setGroup(null)}},{key:"clear",value:function(e){this._filterSet&&(this._filterSet.clear(this._id),this._onChange(e))}},{key:"set",value:function(e,t){this._filterSet&&(this._filterSet.update(this._id,e),this._onChange(t))}},{key:"on",value:function(e,t){return this._emitter.on(e,t)}},{key:"off",value:function(e,t){return this._emitter.off(e,t)}},{key:"_onChange",value:function(e){this._filterSet&&this._filterVar.set(this._filterSet.value,this._mergeExtraInfo(e))}},{key:"filteredKeys",get:function(){return this._filterSet?this._filterSet.value:null}}]),n}()},{"./events":1,"./filterset":3,"./group":4,"./util":11}],3:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),a=e("./util");function l(e,t){return e===t?0:e<t?-1:t<e?1:void 0}var i=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.reset()}return r(e,[{key:"reset",value:function(){this._handles={},this._keys={},this._value=null,this._activeHandles=0}},{key:"update",value:function(e,t){null!==t&&(t=t.slice(0)).sort(l);var n=(0,a.diffSortedLists)(this._handles[e],t),r=n.added,i=n.removed;this._handles[e]=t;for(var o=0;o<r.length;o++)this._keys[r[o]]=(this._keys[r[o]]||0)+1;for(var u=0;u<i.length;u++)this._keys[i[u]]--;this._updateValue(t)}},{key:"_updateValue",value:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this._allKeys,t=Object.keys(this._handles).length;if(0===t)this._value=null;else{this._value=[];for(var n=0;n<e.length;n++){this._keys[e[n]]===t&&this._value.push(e[n])}}}},{key:"clear",value:function(e){if(void 0!==this._handles[e]){var t=this._handles[e];t||(t=[]);for(var n=0;n<t.length;n++)this._keys[t[n]]--;delete this._handles[e],this._updateValue()}}},{key:"value",get:function(){return this._value}},{key:"_allKeys",get:function(){var e=Object.keys(this._keys);return e.sort(l),e}}]),e}();n.default=i},{"./util":11}],4:[function(l,e,s){(function(e){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var n=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};s.default=function e(t){{if(t&&"string"==typeof t)return u.hasOwnProperty(t)||(u[t]=new a(t)),u[t];if("object"===(void 0===t?"undefined":r(t))&&t._vars&&t.var)return t;if(Array.isArray(t)&&1==t.length&&"string"==typeof t[0])return e(t[0]);throw new Error("Invalid groupName argument")}};var t,i=l("./var"),o=(t=i)&&t.__esModule?t:{default:t};e.__crosstalk_groups=e.__crosstalk_groups||{};var u=e.__crosstalk_groups;var a=function(){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.name=e,this._vars={}}return n(t,[{key:"var",value:function(e){if(!e||"string"!=typeof e)throw new Error("Invalid var name");return this._vars.hasOwnProperty(e)||(this._vars[e]=new o.default(this,e)),this._vars[e]}},{key:"has",value:function(e){if(!e||"string"!=typeof e)throw new Error("Invalid var name");return this._vars.hasOwnProperty(e)}}]),t}()}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./var":12}],5:[function(f,e,c){(function(e){"use strict";Object.defineProperty(c,"__esModule",{value:!0});var t,n=f("./group"),r=(t=n)&&t.__esModule?t:{default:t},i=f("./selection"),o=f("./filter"),u=f("./input");f("./input_selectize"),f("./input_checkboxgroup"),f("./input_slider");var a=(0,r.default)("default");function l(e){return a.var(e)}e.Shiny&&e.Shiny.addCustomMessageHandler("update-client-value",function(e){"string"==typeof e.group?(0,r.default)(e.group).var(e.name).set(e.value):l(e.name).set(e.value)});var s={group:r.default,var:l,has:function(e){return a.has(e)},SelectionHandle:i.SelectionHandle,FilterHandle:o.FilterHandle,bind:u.bind};c.default=s,e.crosstalk=s}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(e,t,a){(function(t){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.register=function(e){r[e.className]=e,t.document&&"complete"!==t.document.readyState?o(function(){n()}):t.document&&setTimeout(n,100)},a.bind=n;var o=t.jQuery,r={};function n(){Object.keys(r).forEach(function(e){var n=r[e];o("."+n.className).not(".crosstalk-input-bound").each(function(e,t){i(n,t)})})}function i(e,t){var n=o(t).find("script[type='application/json'][data-for='"+t.id.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g,"\\$1")+"']"),r=JSON.parse(n[0].innerText),i=e.factory(t,r);o(t).data("crosstalk-instance",i),o(t).addClass("crosstalk-input-bound")}if(t.Shiny){var e=new t.Shiny.InputBinding,u=t.jQuery;u.extend(e,{find:function(e){return u(e).find(".crosstalk-input")},initialize:function(e){var t,n;u(e).hasClass("crosstalk-input-bound")||(n=o(t=e),Object.keys(r).forEach(function(e){n.hasClass(e)&&!n.hasClass("crosstalk-input-bound")&&i(r[e],t)}))},getId:function(e){return e.id},getValue:function(e){},setValue:function(e,t){},receiveMessage:function(e,t){},subscribe:function(e,t){u(e).data("crosstalk-instance").resume()},unsubscribe:function(e){u(e).data("crosstalk-instance").suspend()}}),t.Shiny.inputBindings.register(e,"crosstalk.inputBinding")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],7:[function(r,e,t){(function(e){"use strict";var t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(r("./input")),n=r("./filter");var a=e.jQuery;t.register({className:"crosstalk-input-checkboxgroup",factory:function(e,r){var i=new n.FilterHandle(r.group),o=void 0,u=a(e);return u.on("change","input[type='checkbox']",function(){var e=u.find("input[type='checkbox']:checked");if(0===e.length)o=null,i.clear();else{var t={};e.each(function(){r.map[this.value].forEach(function(e){t[e]=!0})});var n=Object.keys(t);n.sort(),o=n,i.set(n)}}),{suspend:function(){i.clear()},resume:function(){o&&i.set(o)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],8:[function(r,e,t){(function(e){"use strict";var t=n(r("./input")),l=n(r("./util")),s=r("./filter");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var f=e.jQuery;t.register({className:"crosstalk-input-select",factory:function(e,n){var t=l.dataframeToD3(n.items),r={options:[{value:"",label:"(All)"}].concat(t),valueField:"value",labelField:"label",searchField:"label"},i=f(e).find("select")[0],o=f(i).selectize(r)[0].selectize,u=new s.FilterHandle(n.group),a=void 0;return o.on("change",function(){if(0===o.items.length)a=null,u.clear();else{var t={};o.items.forEach(function(e){n.map[e].forEach(function(e){t[e]=!0})});var e=Object.keys(t);e.sort(),a=e,u.set(e)}}),{suspend:function(){u.clear()},resume:function(){a&&u.set(a)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6,"./util":11}],9:[function(n,e,t){(function(e){"use strict";var d=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(n("./input")),a=n("./filter");var v=e.jQuery,p=e.strftime;function y(e,t){for(var n=e.toString();n.length<t;)n="0"+n;return n}t.register({className:"crosstalk-input-slider",factory:function(e,l){var s=new a.FilterHandle(l.group),t={},f=v(e).find("input"),n=f.data("data-type"),r=f.data("time-format"),i=f.data("round"),o=void 0;if("date"===n)o=p.utc(),t.prettify=function(e){return o(r,new Date(e))};else if("datetime"===n){var u=f.data("timezone");o=u?p.timezone(u):p,t.prettify=function(e){return o(r,new Date(e))}}else"number"===n&&void 0!==i&&(t.prettify=function(e){var t=Math.pow(10,i);return Math.round(e*t)/t});function c(){var e=f.data("ionRangeSlider").result,t=void 0,n=f.data("data-type");return t="date"===n?function(e){return(t=new Date(+e))instanceof Date?t.getUTCFullYear()+"-"+y(t.getUTCMonth()+1,2)+"-"+y(t.getUTCDate(),2):null;var t}:"datetime"===n?function(e){return+e/1e3}:function(e){return+e},"double"===f.data("ionRangeSlider").options.type?[t(e.from),t(e.to)]:t(e.from)}f.ionRangeSlider(t);var h=null;return f.on("change.crosstalkSliderInput",function(e){if(!f.data("updating")&&!f.data("animating")){for(var t=c(),n=d(t,2),r=n[0],i=n[1],o=[],u=0;u<l.values.length;u++){var a=l.values[u];r<=a&&a<=i&&o.push(l.keys[u])}o.sort(),s.set(o),h=o}}),{suspend:function(){s.clear()},resume:function(){h&&s.set(h)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],10:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.SelectionHandle=void 0;var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),i=a(e("./events")),o=a(e("./group")),u=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(e("./util"));function a(e){return e&&e.__esModule?e:{default:e}}n.SelectionHandle=function(){function n(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n),this._eventRelay=new i.default,this._emitter=new u.SubscriptionTracker(this._eventRelay),this._group=null,this._var=null,this._varOnChangeSub=null,this._extraInfo=u.extend({sender:this},t),this.setGroup(e)}return r(n,[{key:"setGroup",value:function(e){var t=this;if(this._group!==e&&(this._group||e)&&(this._var&&(this._var.off("change",this._varOnChangeSub),this._var=null,this._varOnChangeSub=null),this._group=e)){this._var=(0,o.default)(e).var("selection");var n=this._var.on("change",function(e){t._eventRelay.trigger("change",e,t)});this._varOnChangeSub=n}}},{key:"_mergeExtraInfo",value:function(e){return u.extend({},this._extraInfo?this._extraInfo:null,e||null)}},{key:"set",value:function(e,t){this._var&&this._var.set(e,this._mergeExtraInfo(t))}},{key:"clear",value:function(e){this._var&&this.set(void 0,this._mergeExtraInfo(e))}},{key:"on",value:function(e,t){return this._emitter.on(e,t)}},{key:"off",value:function(e,t){return this._emitter.off(e,t)}},{key:"close",value:function(){this._emitter.removeAllListeners(),this.setGroup(null)}},{key:"value",get:function(){return this._var?this._var.get():null}}]),n}()},{"./events":1,"./group":4,"./util":11}],11:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function u(e){for(var t=1;t<e.length;t++)if(e[t]<=e[t-1])throw new Error("List is not sorted or contains duplicate")}n.extend=function(e){for(var t=arguments.length,n=Array(1<t?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];for(var i=0;i<n.length;i++){var o=n[i];if(null!=o)for(var u in o)o.hasOwnProperty(u)&&(e[u]=o[u])}return e},n.checkSorted=u,n.diffSortedLists=function(e,t){var n=0,r=0;e||(e=[]);t||(t=[]);var i=[],o=[];u(e),u(t);for(;n<e.length&&r<t.length;)e[n]===t[r]?(n++,r++):e[n]<t[r]?i.push(e[n++]):o.push(t[r++]);n<e.length&&(i=i.concat(e.slice(n)));r<t.length&&(o=o.concat(t.slice(r)));return{removed:i,added:o}},n.dataframeToD3=function(e){var t=[],n=void 0;for(var r in e){if(e.hasOwnProperty(r)&&t.push(r),"object"!==l(e[r])||void 0===e[r].length)throw new Error("All fields must be arrays");if(void 0!==n&&n!==e[r].length)throw new Error("All fields must be arrays of the same length");n=e[r].length}for(var i=[],o=void 0,u=0;u<n;u++){o={};for(var a=0;a<t.length;a++)o[t[a]]=e[t[a]][u];i.push(o)}return i};n.SubscriptionTracker=function(){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this._emitter=e,this._subs={}}return r(t,[{key:"on",value:function(e,t){var n=this._emitter.on(e,t);return this._subs[n]=e,n}},{key:"off",value:function(e,t){var n=this._emitter.off(e,t);return n&&delete this._subs[n],n}},{key:"removeAllListeners",value:function(){var t=this,n=this._subs;this._subs={},Object.keys(n).forEach(function(e){t._emitter.off(n[e],e)})}}]),t}()},{}],12:[function(a,e,l){(function(o){"use strict";Object.defineProperty(l,"__esModule",{value:!0});var e,u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),n=a("./events"),i=(e=n)&&e.__esModule?e:{default:e};var r=function(){function r(e,t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r),this._group=e,this._name=t,this._value=n,this._events=new i.default}return t(r,[{key:"get",value:function(){return this._value}},{key:"set",value:function(e,t){if(this._value!==e){var n=this._value;this._value=e;var r={};if(t&&"object"===(void 0===t?"undefined":u(t)))for(var i in t)t.hasOwnProperty(i)&&(r[i]=t[i]);r.oldValue=n,r.value=e,this._events.trigger("change",r,this),o.Shiny&&o.Shiny.onInputChange&&o.Shiny.onInputChange(".clientValue-"+(null!==this._group.name?this._group.name+"-":"")+this._name,void 0===e?null:e)}}},{key:"on",value:function(e,t){return this._events.on(e,t)}},{key:"off",value:function(e,t){return this._events.off(e,t)}}]),r}();l.default=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./events":1}]},{},[5]); +//# sourceMappingURL=crosstalk.min.js.map
\ No newline at end of file diff --git a/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.min.js.map b/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.min.js.map new file mode 100644 index 00000000..886ebeef --- /dev/null +++ b/docs/coverage/lib/crosstalk-1.2.1/js/crosstalk.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","javascript/src/events.js","javascript/src/filter.js","javascript/src/filterset.js","javascript/src/group.js","javascript/src/index.js","javascript/src/input.js","javascript/src/input_checkboxgroup.js","javascript/src/input_selectize.js","javascript/src/input_slider.js","javascript/src/selection.js","javascript/src/util.js","javascript/src/var.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","Events","_classCallCheck","this","_types","_seq","eventType","listener","subs","sub","key","hasOwnProperty","arg","thisObj","util","id","FilterHandle","group","extraInfo","_eventRelay","_events2","default","_emitter","SubscriptionTracker","_group","_filterSet","_filterVar","_varOnChangeSub","_extraInfo","extend","sender","_id","setGroup","fsVar","result","_this","off","clear","_group2","var","get","_filterset2","set","on","trigger","removeAllListeners","_onChange","keys","update","value","_mergeExtraInfo","_util","naturalComparator","b","FilterSet","reset","_handles","_keys","_value","_activeHandles","handleId","slice","sort","_diffSortedLists","diffSortedLists","added","removed","_i","_updateValue","arguments","undefined","_allKeys","handleCount","Object","push","allKeys","groupName","groups","Group","_typeof","_vars","Array","isArray","_var2","global","__crosstalk_groups","name","_var3","_selection","_filter","_input","defaultGroup","var_","Shiny","addCustomMessageHandler","message","crosstalk","has","SelectionHandle","bind","register","reg","bindings","className","document","readyState","$","setTimeout","jQuery","forEach","binding","not","each","el","bindInstance","jsonEl","find","replace","data","JSON","parse","innerText","instance","factory","addClass","inputBinding","InputBinding","_$","scope","initialize","$el","hasClass","getId","getValue","setValue","receiveMessage","subscribe","callback","resume","unsubscribe","suspend","inputBindings","input","ctHandle","lastKnownKeys","checked","map","keyArray","items","dataframeToD3","opts","options","label","concat","valueField","labelField","searchField","select","selectize","strftime","padZeros","digits","str","toString","dataType","timeFormat","round","timeFormatter","utc","prettify","num","Date","timezone","factor","Math","pow","convert","val","date","getUTCFullYear","getUTCMonth","getUTCDate","type","from","to","ionRangeSlider","event","_getValue","_getValue2","_slicedToArray","values","_var","selectedKeys","checkSorted","list","target","_len","sources","_key","src","i_a","i_b","a_only","b_only","df","names","results","item","row","col","emitter","_subs","current_subs","_events","Var","_name","oldValue","evt","k","onInputChange"],"mappings":"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","file":"crosstalk.min.js","sourcesContent":["(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()","export default class Events {\n constructor() {\n this._types = {};\n this._seq = 0;\n }\n\n on(eventType, listener) {\n let subs = this._types[eventType];\n if (!subs) {\n subs = this._types[eventType] = {};\n }\n let sub = \"sub\" + (this._seq++);\n subs[sub] = listener;\n return sub;\n }\n\n // Returns false if no match, or string for sub name if matched\n off(eventType, listener) {\n let subs = this._types[eventType];\n if (typeof(listener) === \"function\") {\n for (let key in subs) {\n if (subs.hasOwnProperty(key)) {\n if (subs[key] === listener) {\n delete subs[key];\n return key;\n }\n }\n }\n return false;\n } else if (typeof(listener) === \"string\") {\n if (subs && subs[listener]) {\n delete subs[listener];\n return listener;\n }\n return false;\n } else {\n throw new Error(\"Unexpected type for listener\");\n }\n }\n\n trigger(eventType, arg, thisObj) {\n let subs = this._types[eventType];\n for (let key in subs) {\n if (subs.hasOwnProperty(key)) {\n subs[key].call(thisObj, arg);\n }\n }\n }\n}\n","import Events from \"./events\";\nimport FilterSet from \"./filterset\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\nfunction getFilterSet(group) {\n let fsVar = group.var(\"filterset\");\n let result = fsVar.get();\n if (!result) {\n result = new FilterSet();\n fsVar.set(result);\n }\n return result;\n}\n\nlet id = 1;\nfunction nextId() {\n return id++;\n}\n\n/**\n * Use this class to contribute to, and listen for changes to, the filter set\n * for the given group of widgets. Filter input controls should create one\n * `FilterHandle` and only call {@link FilterHandle#set}. Output widgets that\n * wish to displayed filtered data should create one `FilterHandle` and use\n * the {@link FilterHandle#filteredKeys} property and listen for change\n * events.\n *\n * If two (or more) `FilterHandle` instances in the same webpage share the\n * same group name, they will contribute to a single \"filter set\". Each\n * `FilterHandle` starts out with a `null` value, which means they take\n * nothing away from the set of data that should be shown. To make a\n * `FilterHandle` actually remove data from the filter set, set its value to\n * an array of keys which should be displayed. Crosstalk will aggregate the\n * various key arrays by finding their intersection; only keys that are\n * present in all non-null filter handles are considered part of the filter\n * set.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the {@link FilterHandle#setGroup} method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class FilterHandle {\n constructor(group, extraInfo) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The filterSet that we're tracking, if any. Can change over time.\n this._filterSet = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._filterVar = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this._id = \"filter\" + nextId();\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this FilterHandle. If `set()` was\n * previously called on this handle, switching groups will clear those keys\n * from the old group's filter set. These keys will not be applied to the new\n * group's filter set either. In other words, `setGroup()` effectively calls\n * `clear()` before switching groups.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._filterVar) {\n this._filterVar.off(\"change\", this._varOnChangeSub);\n this.clear();\n this._varOnChangeSub = null;\n this._filterVar = null;\n this._filterSet = null;\n }\n\n this._group = group;\n\n if (group) {\n group = grp(group);\n this._filterSet = getFilterSet(group);\n this._filterVar = grp(group).var(\"filter\");\n let sub = this._filterVar.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n","import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n","import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n","import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n","let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n","import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n","export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n","import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"]}
\ No newline at end of file diff --git a/docs/coverage/lib/crosstalk-1.2.1/scss/crosstalk.scss b/docs/coverage/lib/crosstalk-1.2.1/scss/crosstalk.scss new file mode 100644 index 00000000..35665616 --- /dev/null +++ b/docs/coverage/lib/crosstalk-1.2.1/scss/crosstalk.scss @@ -0,0 +1,75 @@ +/* Adjust margins outwards, so column contents line up with the edges of the + parent of container-fluid. */ +.container-fluid.crosstalk-bscols { + margin-left: -30px; + margin-right: -30px; + white-space: normal; +} + +/* But don't adjust the margins outwards if we're directly under the body, + i.e. we were the top-level of something at the console. */ +body > .container-fluid.crosstalk-bscols { + margin-left: auto; + margin-right: auto; +} + +.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: inline-block; + padding-right: 12px; + vertical-align: top; +} + +@media only screen and (max-width:480px) { + .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: block; + padding-right: inherit; + } +} + +/* Relevant BS3 styles to make filter_checkbox() look reasonable without Bootstrap */ +.crosstalk-input { + margin-bottom: 15px; /* a la .form-group */ + .control-label { + margin-bottom: 0; + vertical-align: middle; + } + input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px; + line-height: normal; + } + .checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; + } + .checkbox > label{ + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer; + } + .checkbox input[type="checkbox"], + .checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 2px; + margin-left: -20px; + } + .checkbox + .checkbox { + margin-top: -5px; + } + .checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer; + } + .checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; + } +} diff --git a/docs/coverage/lib/datatables-binding-0.33/datatables.js b/docs/coverage/lib/datatables-binding-0.33/datatables.js new file mode 100644 index 00000000..765b53cb --- /dev/null +++ b/docs/coverage/lib/datatables-binding-0.33/datatables.js @@ -0,0 +1,1539 @@ +(function() { + +// some helper functions: using a global object DTWidget so that it can be used +// in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's +// dynamic scoping, when 'code' is eval'ed, JavaScript does not know objects +// from the "parent frame", e.g. JS('DTWidget') will not work unless it was made +// a global object +var DTWidget = {}; + +// 123456666.7890 -> 123,456,666.7890 +var markInterval = function(d, digits, interval, mark, decMark, precision) { + x = precision ? d.toPrecision(digits) : d.toFixed(digits); + if (!/^-?[\d.]+$/.test(x)) return x; + var xv = x.split('.'); + if (xv.length > 2) return x; // should have at most one decimal point + xv[0] = xv[0].replace(new RegExp('\\B(?=(\\d{' + interval + '})+(?!\\d))', 'g'), mark); + return xv.join(decMark); +}; + +DTWidget.formatCurrency = function(data, currency, digits, interval, mark, decMark, before, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + var res = markInterval(d, digits, interval, mark, decMark); + res = before ? (/^-/.test(res) ? '-' + currency + res.replace(/^-/, '') : currency + res) : + res + currency; + return res; +}; + +DTWidget.formatString = function(data, prefix, suffix) { + var d = data; + if (d === null) return ''; + return prefix + d + suffix; +}; + +DTWidget.formatPercentage = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d * 100, digits, interval, mark, decMark) + '%'; +}; + +DTWidget.formatRound = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d, digits, interval, mark, decMark); +}; + +DTWidget.formatSignif = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d, digits, interval, mark, decMark, true); +}; + +DTWidget.formatDate = function(data, method, params) { + var d = data; + if (d === null) return ''; + // (new Date('2015-10-28')).toDateString() may return 2015-10-27 because the + // actual time created could be like 'Tue Oct 27 2015 19:00:00 GMT-0500 (CDT)', + // i.e. the date-only string is treated as UTC time instead of local time + if ((method === 'toDateString' || method === 'toLocaleDateString') && /^\d{4,}\D\d{2}\D\d{2}$/.test(d)) { + d = d.split(/\D/); + d = new Date(d[0], d[1] - 1, d[2]); + } else { + d = new Date(d); + } + return d[method].apply(d, params); +}; + +window.DTWidget = DTWidget; + +// A helper function to update the properties of existing filters +var setFilterProps = function(td, props) { + // Update enabled/disabled state + var $input = $(td).find('input').first(); + var searchable = $input.data('searchable'); + $input.prop('disabled', !searchable || props.disabled); + + // Based on the filter type, set its new values + var type = td.getAttribute('data-type'); + if (['factor', 'logical'].includes(type)) { + // Reformat the new dropdown options for use with selectize + var new_vals = props.params.options.map(function(item) { + return { text: item, value: item }; + }); + + // Find the selectize object + var dropdown = $(td).find('.selectized').eq(0)[0].selectize; + + // Note the current values + var old_vals = dropdown.getValue(); + + // Remove the existing values + dropdown.clearOptions(); + + // Add the new options + dropdown.addOption(new_vals); + + // Preserve the existing values + dropdown.setValue(old_vals); + + } else if (['number', 'integer', 'date', 'time'].includes(type)) { + // Apply internal scaling to new limits. Updating scale not yet implemented. + var slider = $(td).find('.noUi-target').eq(0); + var scale = Math.pow(10, Math.max(0, +slider.data('scale') || 0)); + var new_vals = [props.params.min * scale, props.params.max * scale]; + + // Note what the new limits will be just for this filter + var new_lims = new_vals.slice(); + + // Determine the current values and limits + var old_vals = slider.val().map(Number); + var old_lims = slider.noUiSlider('options').range; + old_lims = [old_lims.min, old_lims.max]; + + // Preserve the current values if filters have been applied; otherwise, apply no filtering + if (old_vals[0] != old_lims[0]) { + new_vals[0] = Math.max(old_vals[0], new_vals[0]); + } + + if (old_vals[1] != old_lims[1]) { + new_vals[1] = Math.min(old_vals[1], new_vals[1]); + } + + // Update the endpoints of the slider + slider.noUiSlider({ + start: new_vals, + range: {'min': new_lims[0], 'max': new_lims[1]} + }, true); + } +}; + +var transposeArray2D = function(a) { + return a.length === 0 ? a : HTMLWidgets.transposeArray2D(a); +}; + +var crosstalkPluginsInstalled = false; + +function maybeInstallCrosstalkPlugins() { + if (crosstalkPluginsInstalled) + return; + crosstalkPluginsInstalled = true; + + $.fn.dataTable.ext.afnFiltering.push( + function(oSettings, aData, iDataIndex) { + var ctfilter = oSettings.nTable.ctfilter; + if (ctfilter && !ctfilter[iDataIndex]) + return false; + + var ctselect = oSettings.nTable.ctselect; + if (ctselect && !ctselect[iDataIndex]) + return false; + + return true; + } + ); +} + +HTMLWidgets.widget({ + name: "datatables", + type: "output", + renderOnNullValue: true, + initialize: function(el, width, height) { + // in order that the type=number inputs return a number + $.valHooks.number = { + get: function(el) { + var value = parseFloat(el.value); + return isNaN(value) ? "" : value; + } + }; + $(el).html(' '); + return { + data: null, + ctfilterHandle: new crosstalk.FilterHandle(), + ctfilterSubscription: null, + ctselectHandle: new crosstalk.SelectionHandle(), + ctselectSubscription: null + }; + }, + renderValue: function(el, data, instance) { + if (el.offsetWidth === 0 || el.offsetHeight === 0) { + instance.data = data; + return; + } + instance.data = null; + var $el = $(el); + $el.empty(); + + if (data === null) { + $el.append(' '); + // clear previous Shiny inputs (if any) + for (var i in instance.clearInputs) instance.clearInputs[i](); + instance.clearInputs = {}; + return; + } + + var crosstalkOptions = data.crosstalkOptions; + if (!crosstalkOptions) crosstalkOptions = { + 'key': null, 'group': null + }; + if (crosstalkOptions.group) { + maybeInstallCrosstalkPlugins(); + instance.ctfilterHandle.setGroup(crosstalkOptions.group); + instance.ctselectHandle.setGroup(crosstalkOptions.group); + } + + // if we are in the viewer then we always want to fillContainer and + // and autoHideNavigation (unless the user has explicitly set these) + if (window.HTMLWidgets.viewerMode) { + if (!data.hasOwnProperty("fillContainer")) + data.fillContainer = true; + if (!data.hasOwnProperty("autoHideNavigation")) + data.autoHideNavigation = true; + } + + // propagate fillContainer to instance (so we have it in resize) + instance.fillContainer = data.fillContainer; + + var cells = data.data; + + if (cells instanceof Array) cells = transposeArray2D(cells); + + $el.append(data.container); + var $table = $el.find('table'); + if (data.class) $table.addClass(data.class); + if (data.caption) $table.prepend(data.caption); + + if (!data.selection) data.selection = { + mode: 'none', selected: null, target: 'row', selectable: null + }; + if (HTMLWidgets.shinyMode && data.selection.mode !== 'none' && + data.selection.target === 'row+column') { + if ($table.children('tfoot').length === 0) { + $table.append($('<tfoot>')); + $table.find('thead tr').clone().appendTo($table.find('tfoot')); + } + } + + // column filters + var filterRow; + switch (data.filter) { + case 'top': + $table.children('thead').append(data.filterHTML); + filterRow = $table.find('thead tr:last td'); + break; + case 'bottom': + if ($table.children('tfoot').length === 0) { + $table.append($('<tfoot>')); + } + $table.children('tfoot').prepend(data.filterHTML); + filterRow = $table.find('tfoot tr:first td'); + break; + } + + var options = { searchDelay: 1000 }; + if (cells !== null) $.extend(options, { + data: cells + }); + + // options for fillContainer + var bootstrapActive = typeof($.fn.popover) != 'undefined'; + if (instance.fillContainer) { + + // force scrollX/scrollY and turn off autoWidth + options.scrollX = true; + options.scrollY = "100px"; // can be any value, we'll adjust below + + // if we aren't paginating then move around the info/filter controls + // to save space at the bottom and rephrase the info callback + if (data.options.paging === false) { + + // we know how to do this cleanly for bootstrap, not so much + // for other themes/layouts + if (bootstrapActive) { + options.dom = "<'row'<'col-sm-4'i><'col-sm-8'f>>" + + "<'row'<'col-sm-12'tr>>"; + } + + options.fnInfoCallback = function(oSettings, iStart, iEnd, + iMax, iTotal, sPre) { + return Number(iTotal).toLocaleString() + " records"; + }; + } + } + + // auto hide navigation if requested + // Note, this only works on client-side processing mode as on server-side, + // cells (data.data) is null; In addition, we require the pageLength option + // being provided explicitly to enable this. Despite we may be able to deduce + // the default value of pageLength, it may complicate things so we'd rather + // put this responsiblity to users and warn them on the R side. + if (data.autoHideNavigation === true && data.options.paging !== false) { + // strip all nav if length >= cells + if ((cells instanceof Array) && data.options.pageLength >= cells.length) + options.dom = bootstrapActive ? "<'row'<'col-sm-12'tr>>" : "t"; + // alternatively lean things out for flexdashboard mobile portrait + else if (bootstrapActive && window.FlexDashboard && window.FlexDashboard.isMobilePhone()) + options.dom = "<'row'<'col-sm-12'f>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-12'p>>"; + } + + $.extend(true, options, data.options || {}); + + var searchCols = options.searchCols; + if (searchCols) { + searchCols = searchCols.map(function(x) { + return x === null ? '' : x.search; + }); + // FIXME: this means I don't respect the escapeRegex setting + delete options.searchCols; + } + + // server-side processing? + var server = options.serverSide === true; + + // use the dataSrc function to pre-process JSON data returned from R + var DT_rows_all = [], DT_rows_current = []; + if (server && HTMLWidgets.shinyMode && typeof options.ajax === 'object' && + /^session\/[\da-z]+\/dataobj/.test(options.ajax.url) && !options.ajax.dataSrc) { + options.ajax.dataSrc = function(json) { + DT_rows_all = $.makeArray(json.DT_rows_all); + DT_rows_current = $.makeArray(json.DT_rows_current); + var data = json.data; + if (!colReorderEnabled()) return data; + var table = $table.DataTable(), order = table.colReorder.order(), flag = true, i, j, row; + for (i = 0; i < order.length; ++i) if (order[i] !== i) flag = false; + if (flag) return data; + for (i = 0; i < data.length; ++i) { + row = data[i].slice(); + for (j = 0; j < order.length; ++j) data[i][j] = row[order[j]]; + } + return data; + }; + } + + var thiz = this; + if (instance.fillContainer) $table.on('init.dt', function(e) { + thiz.fillAvailableHeight(el, $(el).innerHeight()); + }); + // If the page contains serveral datatables and one of which enables colReorder, + // the table.colReorder.order() function will exist but throws error when called. + // So it seems like the only way to know if colReorder is enabled or not is to + // check the options. + var colReorderEnabled = function() { return "colReorder" in options; }; + var table = $table.DataTable(options); + $el.data('datatable', table); + + if ('rowGroup' in options) { + // Maintain RowGroup dataSrc when columns are reordered (#1109) + table.on('column-reorder', function(e, settings, details) { + var oldDataSrc = table.rowGroup().dataSrc(); + var newDataSrc = details.mapping[oldDataSrc]; + table.rowGroup().dataSrc(newDataSrc); + }); + } + + // Unregister previous Crosstalk event subscriptions, if they exist + if (instance.ctfilterSubscription) { + instance.ctfilterHandle.off("change", instance.ctfilterSubscription); + instance.ctfilterSubscription = null; + } + if (instance.ctselectSubscription) { + instance.ctselectHandle.off("change", instance.ctselectSubscription); + instance.ctselectSubscription = null; + } + + if (!crosstalkOptions.group) { + $table[0].ctfilter = null; + $table[0].ctselect = null; + } else { + var key = crosstalkOptions.key; + function keysToMatches(keys) { + if (!keys) { + return null; + } else { + var selectedKeys = {}; + for (var i = 0; i < keys.length; i++) { + selectedKeys[keys[i]] = true; + } + var matches = {}; + for (var j = 0; j < key.length; j++) { + if (selectedKeys[key[j]]) + matches[j] = true; + } + return matches; + } + } + + function applyCrosstalkFilter(e) { + $table[0].ctfilter = keysToMatches(e.value); + table.draw(); + } + instance.ctfilterSubscription = instance.ctfilterHandle.on("change", applyCrosstalkFilter); + applyCrosstalkFilter({value: instance.ctfilterHandle.filteredKeys}); + + function applyCrosstalkSelection(e) { + if (e.sender !== instance.ctselectHandle) { + table + .rows('.' + selClass, {search: 'applied'}) + .nodes() + .to$() + .removeClass(selClass); + if (selectedRows) + changeInput('rows_selected', selectedRows(), void 0, true); + } + + if (e.sender !== instance.ctselectHandle && e.value && e.value.length) { + var matches = keysToMatches(e.value); + + // persistent selection with plotly (& leaflet) + var ctOpts = crosstalk.var("plotlyCrosstalkOpts").get() || {}; + if (ctOpts.persistent === true) { + var matches = $.extend(matches, $table[0].ctselect); + } + + $table[0].ctselect = matches; + table.draw(); + } else { + if ($table[0].ctselect) { + $table[0].ctselect = null; + table.draw(); + } + } + } + instance.ctselectSubscription = instance.ctselectHandle.on("change", applyCrosstalkSelection); + // TODO: This next line doesn't seem to work when renderDataTable is used + applyCrosstalkSelection({value: instance.ctselectHandle.value}); + } + + var inArray = function(val, array) { + return $.inArray(val, $.makeArray(array)) > -1; + }; + + // search the i-th column + var searchColumn = function(i, value) { + var regex = false, ci = true; + if (options.search) { + regex = options.search.regex, + ci = options.search.caseInsensitive !== false; + } + // need to transpose the column index when colReorder is enabled + if (table.colReorder) i = table.colReorder.transpose(i); + return table.column(i).search(value, regex, !regex, ci); + }; + + if (data.filter !== 'none') { + if (!data.hasOwnProperty('filterSettings')) data.filterSettings = {}; + + filterRow.each(function(i, td) { + + var $td = $(td), type = $td.data('type'), filter; + var $input = $td.children('div').first().children('input'); + var disabled = $input.prop('disabled'); + var searchable = table.settings()[0].aoColumns[i].bSearchable; + $input.prop('disabled', !searchable || disabled); + $input.data('searchable', searchable); // for updating later + $input.on('input blur', function() { + $input.next('span').toggle(Boolean($input.val())); + }); + // Bootstrap sets pointer-events to none and we won't be able to click + // the clear button + $input.next('span').css('pointer-events', 'auto').hide().click(function() { + $(this).hide().prev('input').val('').trigger('input').focus(); + }); + var searchCol; // search string for this column + if (searchCols && searchCols[i]) { + searchCol = searchCols[i]; + $input.val(searchCol).trigger('input'); + } + var $x = $td.children('div').last(); + + // remove the overflow: hidden attribute of the scrollHead + // (otherwise the scrolling table body obscures the filters) + // The workaround and the discussion from + // https://github.com/rstudio/DT/issues/554#issuecomment-518007347 + // Otherwise the filter selection will not be anchored to the values + // when the columns number is many and scrollX is enabled. + var scrollHead = $(el).find('.dataTables_scrollHead,.dataTables_scrollFoot'); + var cssOverflowHead = scrollHead.css('overflow'); + var scrollBody = $(el).find('.dataTables_scrollBody'); + var cssOverflowBody = scrollBody.css('overflow'); + var scrollTable = $(el).find('.dataTables_scroll'); + var cssOverflowTable = scrollTable.css('overflow'); + if (cssOverflowHead === 'hidden') { + $x.on('show hide', function(e) { + if (e.type === 'show') { + scrollHead.css('overflow', 'visible'); + scrollBody.css('overflow', 'visible'); + scrollTable.css('overflow-x', 'scroll'); + } else { + scrollHead.css('overflow', cssOverflowHead); + scrollBody.css('overflow', cssOverflowBody); + scrollTable.css('overflow-x', cssOverflowTable); + } + }); + $x.css('z-index', 25); + } + + if (inArray(type, ['factor', 'logical'])) { + $input.on({ + click: function() { + $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus(); + }, + input: function() { + var v1 = JSON.stringify(filter[0].selectize.getValue()), v2 = $input.val(); + if (v1 === '[]') v1 = ''; + if (v1 !== v2) filter[0].selectize.setValue(v2 === '' ? [] : JSON.parse(v2)); + } + }); + var $input2 = $x.children('select'); + filter = $input2.selectize($.extend({ + options: $input2.data('options').map(function(v, i) { + return ({text: v, value: v}); + }), + plugins: ['remove_button'], + hideSelected: true, + onChange: function(value) { + if (value === null) value = []; // compatibility with jQuery 3.0 + $input.val(value.length ? JSON.stringify(value) : ''); + if (value.length) $input.trigger('input'); + $input.attr('title', $input.val()); + if (server) { + searchColumn(i, value.length ? JSON.stringify(value) : '').draw(); + return; + } + // turn off filter if nothing selected + $td.data('filter', value.length > 0); + table.draw(); // redraw table, and filters will be applied + } + }, data.filterSettings.select)); + filter[0].selectize.on('blur', function() { + $x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur'); + }); + filter.next('div').css('margin-bottom', 'auto'); + } else if (type === 'character') { + var fun = function() { + searchColumn(i, $input.val()).draw(); + }; + // throttle searching for server-side processing + var throttledFun = $.fn.dataTable.util.throttle(fun, options.searchDelay); + $input.on('input', function(e, immediate) { + // always bypass throttling when immediate = true (via the updateSearch method) + (immediate || !server) ? fun() : throttledFun(); + }); + } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { + var $x0 = $x; + $x = $x0.children('div').first(); + $x0.css({ + 'background-color': '#fff', + 'border': '1px #ddd solid', + 'border-radius': '4px', + 'padding': data.vertical ? '35px 20px': '20px 20px 10px 20px' + }); + var $spans = $x0.children('span').css({ + 'margin-top': data.vertical ? '0' : '10px', + 'white-space': 'nowrap' + }); + var $span1 = $spans.first(), $span2 = $spans.last(); + var r1 = +$x.data('min'), r2 = +$x.data('max'); + // when the numbers are too small or have many decimal places, the + // slider may have numeric precision problems (#150) + var scale = Math.pow(10, Math.max(0, +$x.data('scale') || 0)); + r1 = Math.round(r1 * scale); r2 = Math.round(r2 * scale); + var scaleBack = function(x, scale) { + if (scale === 1) return x; + var d = Math.round(Math.log(scale) / Math.log(10)); + // to avoid problems like 3.423/100 -> 0.034230000000000003 + return (x / scale).toFixed(d); + }; + var slider_min = function() { + return filter.noUiSlider('options').range.min; + }; + var slider_max = function() { + return filter.noUiSlider('options').range.max; + }; + $input.on({ + focus: function() { + $x0.show().trigger('show'); + // first, make sure the slider div leaves at least 20px between + // the two (slider value) span's + $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20)); + // then, if the input is really wide or slider is vertical, + // make the slider the same width as the input + if ($x0.outerWidth() < $input.outerWidth() || data.vertical) { + $x0.outerWidth($input.outerWidth()); + } + // make sure the slider div does not reach beyond the right margin + if ($(window).width() < $x0.offset().left + $x0.width()) { + $x0.offset({ + 'left': $input.offset().left + $input.outerWidth() - $x0.outerWidth() + }); + } + }, + blur: function() { + $x0.hide().trigger('hide'); + }, + input: function() { + if ($input.val() === '') filter.val([slider_min(), slider_max()]); + }, + change: function() { + var v = $input.val().replace(/\s/g, ''); + if (v === '') return; + v = v.split('...'); + if (v.length !== 2) { + $input.parent().addClass('has-error'); + return; + } + if (v[0] === '') v[0] = slider_min(); + if (v[1] === '') v[1] = slider_max(); + $input.parent().removeClass('has-error'); + // treat date as UTC time at midnight + var strTime = function(x) { + var s = type === 'date' ? 'T00:00:00Z' : ''; + var t = new Date(x + s).getTime(); + // add 10 minutes to date since it does not hurt the date, and + // it helps avoid the tricky floating point arithmetic problems, + // e.g. sometimes the date may be a few milliseconds earlier + // than the midnight due to precision problems in noUiSlider + return type === 'date' ? t + 3600000 : t; + }; + if (inArray(type, ['date', 'time'])) { + v[0] = strTime(v[0]); + v[1] = strTime(v[1]); + } + if (v[0] != slider_min()) v[0] *= scale; + if (v[1] != slider_max()) v[1] *= scale; + filter.val(v); + } + }); + var formatDate = function(d) { + d = scaleBack(d, scale); + if (type === 'number') return d; + if (type === 'integer') return parseInt(d); + var x = new Date(+d); + if (type === 'date') { + var pad0 = function(x) { + return ('0' + x).substr(-2, 2); + }; + return x.getUTCFullYear() + '-' + pad0(1 + x.getUTCMonth()) + + '-' + pad0(x.getUTCDate()); + } else { + return x.toISOString(); + } + }; + var opts = type === 'date' ? { step: 60 * 60 * 1000 } : + type === 'integer' ? { step: 1 } : {}; + + opts.orientation = data.vertical ? 'vertical': 'horizontal'; + opts.direction = data.vertical ? 'rtl': 'ltr'; + + filter = $x.noUiSlider($.extend({ + start: [r1, r2], + range: {min: r1, max: r2}, + connect: true + }, opts, data.filterSettings.slider)); + if (scale > 1) (function() { + var t1 = r1, t2 = r2; + var val = filter.val(); + while (val[0] > r1 || val[1] < r2) { + if (val[0] > r1) { + t1 -= val[0] - r1; + } + if (val[1] < r2) { + t2 += r2 - val[1]; + } + filter = $x.noUiSlider($.extend({ + start: [t1, t2], + range: {min: t1, max: t2}, + connect: true + }, opts, data.filterSettings.slider), true); + val = filter.val(); + } + r1 = t1; r2 = t2; + })(); + // format with active column renderer, if defined + var colDef = data.options.columnDefs.find(function(def) { + return (def.targets === i || inArray(i, def.targets)) && 'render' in def; + }); + var updateSliderText = function(v1, v2) { + // we only know how to use function renderers + if (colDef && typeof colDef.render === 'function') { + var restore = function(v) { + v = scaleBack(v, scale); + return inArray(type, ['date', 'time']) ? new Date(+v) : v; + } + $span1.text(colDef.render(restore(v1), 'display')); + $span2.text(colDef.render(restore(v2), 'display')); + } else { + $span1.text(formatDate(v1)); + $span2.text(formatDate(v2)); + } + }; + updateSliderText(r1, r2); + var updateSlider = function(e) { + var val = filter.val(); + // turn off filter if in full range + $td.data('filter', val[0] > slider_min() || val[1] < slider_max()); + var v1 = formatDate(val[0]), v2 = formatDate(val[1]), ival; + if ($td.data('filter')) { + ival = v1 + ' ... ' + v2; + $input.attr('title', ival).val(ival).trigger('input'); + } else { + $input.attr('title', '').val(''); + } + updateSliderText(val[0], val[1]); + if (e.type === 'slide') return; // no searching when sliding only + if (server) { + searchColumn(i, $td.data('filter') ? ival : '').draw(); + return; + } + table.draw(); + }; + filter.on({ + set: updateSlider, + slide: updateSlider + }); + } + + // server-side processing will be handled by R (or whatever server + // language you use); the following code is only needed for client-side + // processing + if (server) { + // if a search string has been pre-set, search now + if (searchCol) $input.trigger('input').trigger('change'); + return; + } + + var customFilter = function(settings, data, dataIndex) { + // there is no way to attach a search function to a specific table, + // and we need to make sure a global search function is not applied to + // all tables (i.e. a range filter in a previous table should not be + // applied to the current table); we use the settings object to + // determine if we want to perform searching on the current table, + // since settings.sTableId will be different to different tables + if (table.settings()[0] !== settings) return true; + // no filter on this column or no need to filter this column + if (typeof filter === 'undefined' || !$td.data('filter')) return true; + + var r = filter.val(), v, r0, r1; + var i_data = function(i) { + if (!colReorderEnabled()) return i; + var order = table.colReorder.order(), k; + for (k = 0; k < order.length; ++k) if (order[k] === i) return k; + return i; // in theory it will never be here... + } + v = data[i_data(i)]; + if (type === 'number' || type === 'integer') { + v = parseFloat(v); + // how to handle NaN? currently exclude these rows + if (isNaN(v)) return(false); + r0 = parseFloat(scaleBack(r[0], scale)) + r1 = parseFloat(scaleBack(r[1], scale)); + if (v >= r0 && v <= r1) return true; + } else if (type === 'date' || type === 'time') { + v = new Date(v); + r0 = new Date(r[0] / scale); r1 = new Date(r[1] / scale); + if (v >= r0 && v <= r1) return true; + } else if (type === 'factor') { + if (r.length === 0 || inArray(v, r)) return true; + } else if (type === 'logical') { + if (r.length === 0) return true; + if (inArray(v === '' ? 'na' : v, r)) return true; + } + return false; + }; + + $.fn.dataTable.ext.search.push(customFilter); + + // search for the preset search strings if it is non-empty + if (searchCol) $input.trigger('input').trigger('change'); + + }); + + } + + // highlight search keywords + var highlight = function() { + var body = $(table.table().body()); + // removing the old highlighting first + body.unhighlight(); + + // don't highlight the "not found" row, so we get the rows using the api + if (table.rows({ filter: 'applied' }).data().length === 0) return; + // highlight global search keywords + body.highlight($.trim(table.search()).split(/\s+/)); + // then highlight keywords from individual column filters + if (filterRow) filterRow.each(function(i, td) { + var $td = $(td), type = $td.data('type'); + if (type !== 'character') return; + var $input = $td.children('div').first().children('input'); + var column = table.column(i).nodes().to$(), + val = $.trim($input.val()); + if (type !== 'character' || val === '') return; + column.highlight(val.split(/\s+/)); + }); + }; + + if (options.searchHighlight) { + table + .on('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth', highlight) + .on('destroy', function() { + // remove event handler + table.off('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth'); + }); + + // Set the option for escaping regex characters in our search string. This will be used + // for all future matching. + jQuery.fn.highlight.options.escapeRegex = (!options.search || !options.search.regex); + + // initial highlight for state saved conditions and initial states + highlight(); + } + + // run the callback function on the table instance + if (typeof data.callback === 'function') data.callback(table); + + // double click to edit the cell, row, column, or all cells + if (data.editable) table.on('dblclick.dt', 'tbody td', function(e) { + // only bring up the editor when the cell itself is dbclicked, and ignore + // other dbclick events bubbled up (e.g. from the <input>) + if (e.target !== this) return; + var target = [], immediate = false; + switch (data.editable.target) { + case 'cell': + target = [this]; + immediate = true; // edit will take effect immediately + break; + case 'row': + target = table.cells(table.cell(this).index().row, '*').nodes(); + break; + case 'column': + target = table.cells('*', table.cell(this).index().column).nodes(); + break; + case 'all': + target = table.cells().nodes(); + break; + default: + throw 'The editable parameter must be "cell", "row", "column", or "all"'; + } + var disableCols = data.editable.disable ? data.editable.disable.columns : null; + var numericCols = data.editable.numeric; + var areaCols = data.editable.area; + var dateCols = data.editable.date; + for (var i = 0; i < target.length; i++) { + (function(cell, current) { + var $cell = $(cell), html = $cell.html(); + var _cell = table.cell(cell), value = _cell.data(), index = _cell.index().column; + var $input; + if (inArray(index, numericCols)) { + $input = $('<input type="number">'); + } else if (inArray(index, areaCols)) { + $input = $('<textarea></textarea>'); + } else if (inArray(index, dateCols)) { + $input = $('<input type="date">'); + } else { + $input = $('<input type="text">'); + } + if (!immediate) { + $cell.data('input', $input).data('html', html); + $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel'); + } + $input.val(value); + if (inArray(index, disableCols)) { + $input.attr('readonly', '').css('filter', 'invert(25%)'); + } + $cell.empty().append($input); + if (cell === current) $input.focus(); + $input.css('width', '100%'); + + if (immediate) $input.on('blur', function(e) { + var valueNew = $input.val(); + if (valueNew !== value) { + _cell.data(valueNew); + if (HTMLWidgets.shinyMode) { + changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: 'event'}); + } + // for server-side processing, users have to call replaceData() to update the table + if (!server) table.draw(false); + } else { + $cell.html(html); + } + }).on('keyup', function(e) { + // hit Escape to cancel editing + if (e.keyCode === 27) $input.trigger('blur'); + }); + + // bulk edit (row, column, or all) + if (!immediate) $input.on('keyup', function(e) { + var removeInput = function($cell, restore) { + $cell.data('input').remove(); + if (restore) $cell.html($cell.data('html')); + } + if (e.keyCode === 27) { + for (var i = 0; i < target.length; i++) { + removeInput($(target[i]), true); + } + } else if (e.keyCode === 13 && e.ctrlKey) { + // Ctrl + Enter + var cell, $cell, _cell, cellData = []; + for (var i = 0; i < target.length; i++) { + cell = target[i]; $cell = $(cell); _cell = table.cell(cell); + _cell.data($cell.data('input').val()); + HTMLWidgets.shinyMode && cellData.push(cellInfo(cell)); + removeInput($cell, false); + } + if (HTMLWidgets.shinyMode) { + changeInput('cell_edit', cellData, 'DT.cellInfo', null, {priority: "event"}); + } + if (!server) table.draw(false); + } + }); + })(target[i], this); + } + }); + + // interaction with shiny + if (!HTMLWidgets.shinyMode && !crosstalkOptions.group) return; + + var methods = {}; + var shinyData = {}; + + methods.updateCaption = function(caption) { + if (!caption) return; + $table.children('caption').replaceWith(caption); + } + + // register clear functions to remove input values when the table is removed + instance.clearInputs = {}; + + var changeInput = function(id, value, type, noCrosstalk, opts) { + var event = id; + id = el.id + '_' + id; + if (type) id = id + ':' + type; + // do not update if the new value is the same as old value + if (event !== 'cell_edit' && !/_clicked$/.test(event) && shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(value)) + return; + shinyData[id] = JSON.stringify(value); + if (HTMLWidgets.shinyMode && Shiny.setInputValue) { + Shiny.setInputValue(id, value, opts); + if (!instance.clearInputs[id]) instance.clearInputs[id] = function() { + Shiny.setInputValue(id, null); + } + } + + // HACK + if (event === "rows_selected" && !noCrosstalk) { + if (crosstalkOptions.group) { + var keys = crosstalkOptions.key; + var selectedKeys = null; + if (value) { + selectedKeys = []; + for (var i = 0; i < value.length; i++) { + // The value array's contents use 1-based row numbers, so we must + // convert to 0-based before indexing into the keys array. + selectedKeys.push(keys[value[i] - 1]); + } + } + instance.ctselectHandle.set(selectedKeys); + } + } + }; + + var addOne = function(x) { + return x.map(function(i) { return 1 + i; }); + }; + + var unique = function(x) { + var ux = []; + $.each(x, function(i, el){ + if ($.inArray(el, ux) === -1) ux.push(el); + }); + return ux; + } + + // change the row index of a cell + var tweakCellIndex = function(cell) { + var info = cell.index(); + // some cell may not be valid. e.g, #759 + // when using the RowGroup extension, datatables will + // generate the row label and the cells are not part of + // the data thus contain no row/col info + if (info === undefined) + return {row: null, col: null}; + if (server) { + info.row = DT_rows_current[info.row]; + } else { + info.row += 1; + } + return {row: info.row, col: info.column}; + } + + var cleanSelectedValues = function() { + changeInput('rows_selected', []); + changeInput('columns_selected', []); + changeInput('cells_selected', transposeArray2D([]), 'shiny.matrix'); + } + // #828 we should clean the selection on the server-side when the table reloads + cleanSelectedValues(); + + // a flag to indicates if select extension is initialized or not + var flagSelectExt = table.settings()[0]._select !== undefined; + // the Select extension should only be used in the client mode and + // when the selection.mode is set to none + if (data.selection.mode === 'none' && !server && flagSelectExt) { + var updateRowsSelected = function() { + var rows = table.rows({selected: true}); + var selected = []; + $.each(rows.indexes().toArray(), function(i, v) { + selected.push(v + 1); + }); + changeInput('rows_selected', selected); + } + var updateColsSelected = function() { + var columns = table.columns({selected: true}); + changeInput('columns_selected', columns.indexes().toArray()); + } + var updateCellsSelected = function() { + var cells = table.cells({selected: true}); + var selected = []; + cells.every(function() { + var row = this.index().row; + var col = this.index().column; + selected = selected.concat([[row + 1, col]]); + }); + changeInput('cells_selected', transposeArray2D(selected), 'shiny.matrix'); + } + table.on('select deselect', function(e, dt, type, indexes) { + updateRowsSelected(); + updateColsSelected(); + updateCellsSelected(); + }) + updateRowsSelected(); + updateColsSelected(); + updateCellsSelected(); + } + + var selMode = data.selection.mode, selTarget = data.selection.target; + var selDisable = data.selection.selectable === false; + if (inArray(selMode, ['single', 'multiple'])) { + var selClass = inArray(data.style, ['bootstrap', 'bootstrap4']) ? 'active' : 'selected'; + // selected1: row indices; selected2: column indices + var initSel = function(x) { + if (x === null || typeof x === 'boolean' || selTarget === 'cell') { + return {rows: [], cols: []}; + } else if (selTarget === 'row') { + return {rows: $.makeArray(x), cols: []}; + } else if (selTarget === 'column') { + return {rows: [], cols: $.makeArray(x)}; + } else if (selTarget === 'row+column') { + return {rows: $.makeArray(x.rows), cols: $.makeArray(x.cols)}; + } + } + var selected = data.selection.selected; + var selected1 = initSel(selected).rows, selected2 = initSel(selected).cols; + // selectable should contain either all positive or all non-positive values, not both + // positive values indicate "selectable" while non-positive values means "nonselectable" + // the assertion is performed on R side. (only column indicides could be zero which indicates + // the row name) + var selectable = data.selection.selectable; + var selectable1 = initSel(selectable).rows, selectable2 = initSel(selectable).cols; + + // After users reorder the rows or filter the table, we cannot use the table index + // directly. Instead, we need this function to find out the rows between the two clicks. + // If user filter the table again between the start click and the end click, the behavior + // would be undefined, but it should not be a problem. + var shiftSelRowsIndex = function(start, end) { + var indexes = server ? DT_rows_all : table.rows({ search: 'applied' }).indexes().toArray(); + start = indexes.indexOf(start); end = indexes.indexOf(end); + // if start is larger than end, we need to swap + if (start > end) { + var tmp = end; end = start; start = tmp; + } + return indexes.slice(start, end + 1); + } + + var serverRowIndex = function(clientRowIndex) { + return server ? DT_rows_current[clientRowIndex] : clientRowIndex + 1; + } + + // row, column, or cell selection + var lastClickedRow; + if (inArray(selTarget, ['row', 'row+column'])) { + // Get the current selected rows. It will also + // update the selected1's value based on the current row selection state + // Note we can't put this function inside selectRows() directly, + // the reason is method.selectRows() will override selected1's value but this + // function will add rows to selected1 (keep the existing selection), which is + // inconsistent with column and cell selection. + var selectedRows = function() { + var rows = table.rows('.' + selClass); + var idx = rows.indexes().toArray(); + if (!server) { + selected1 = addOne(idx); + return selected1; + } + idx = idx.map(function(i) { + return DT_rows_current[i]; + }); + selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx; + return selected1; + } + // Change selected1's value based on selectable1, then refresh the row state + var onlyKeepSelectableRows = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected1 = []; + return; + } + if (selectable1.length === 0) return; + var nonselectable = selectable1[0] <= 0; + if (nonselectable) { + // should make selectable1 positive + selected1 = $(selected1).not(selectable1.map(function(i) { return -i; })).get(); + } else { + selected1 = $(selected1).filter(selectable1).get(); + } + } + // Change selected1's value based on selectable1, then + // refresh the row selection state according to values in selected1 + var selectRows = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableRows(); + table.$('tr.' + selClass).removeClass(selClass); + if (selected1.length === 0) return; + if (server) { + table.rows({page: 'current'}).every(function() { + if (inArray(DT_rows_current[this.index()], selected1)) { + $(this.node()).addClass(selClass); + } + }); + } else { + var selected0 = selected1.map(function(i) { return i - 1; }); + $(table.rows(selected0).nodes()).addClass(selClass); + } + } + table.on('mousedown.dt', 'tbody tr', function(e) { + var $this = $(this), thisRow = table.row(this); + if (selMode === 'multiple') { + if (e.shiftKey && lastClickedRow !== undefined) { + // select or de-select depends on the last clicked row's status + var flagSel = !$this.hasClass(selClass); + var crtClickedRow = serverRowIndex(thisRow.index()); + if (server) { + var rowsIndex = shiftSelRowsIndex(lastClickedRow, crtClickedRow); + // update current page's selClass + rowsIndex.map(function(i) { + var rowIndex = DT_rows_current.indexOf(i); + if (rowIndex >= 0) { + var row = table.row(rowIndex).nodes().to$(); + var flagRowSel = !row.hasClass(selClass); + if (flagSel === flagRowSel) row.toggleClass(selClass); + } + }); + // update selected1 + if (flagSel) { + selected1 = unique(selected1.concat(rowsIndex)); + } else { + selected1 = selected1.filter(function(index) { + return !inArray(index, rowsIndex); + }); + } + } else { + // js starts from 0 + shiftSelRowsIndex(lastClickedRow - 1, crtClickedRow - 1).map(function(value) { + var row = table.row(value).nodes().to$(); + var flagRowSel = !row.hasClass(selClass); + if (flagSel === flagRowSel) row.toggleClass(selClass); + }); + } + e.preventDefault(); + } else { + $this.toggleClass(selClass); + } + } else { + if ($this.hasClass(selClass)) { + $this.removeClass(selClass); + } else { + table.$('tr.' + selClass).removeClass(selClass); + $this.addClass(selClass); + } + } + if (server && !$this.hasClass(selClass)) { + var id = DT_rows_current[thisRow.index()]; + // remove id from selected1 since its class .selected has been removed + if (inArray(id, selected1)) selected1.splice($.inArray(id, selected1), 1); + } + selectedRows(); // update selected1's value based on selClass + selectRows(false); // only keep the selectable rows + changeInput('rows_selected', selected1); + changeInput('row_last_clicked', serverRowIndex(thisRow.index()), null, null, {priority: 'event'}); + lastClickedRow = serverRowIndex(thisRow.index()); + }); + selectRows(false); // in case users have specified pre-selected rows + // restore selected rows after the table is redrawn (e.g. sort/search/page); + // client-side tables will preserve the selections automatically; for + // server-side tables, we have to *real* row indices are in `selected1` + changeInput('rows_selected', selected1); + if (server) table.on('draw.dt', function(e) { selectRows(false); }); + methods.selectRows = function(selected, ignoreSelectable) { + selected1 = $.makeArray(selected); + selectRows(ignoreSelectable); + changeInput('rows_selected', selected1); + } + } + + if (inArray(selTarget, ['column', 'row+column'])) { + if (selTarget === 'row+column') { + $(table.columns().footer()).css('cursor', 'pointer'); + } + // update selected2's value based on selectable2 + var onlyKeepSelectableCols = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected2 = []; + return; + } + if (selectable2.length === 0) return; + var nonselectable = selectable2[0] <= 0; + if (nonselectable) { + // need to make selectable2 positive + selected2 = $(selected2).not(selectable2.map(function(i) { return -i; })).get(); + } else { + selected2 = $(selected2).filter(selectable2).get(); + } + } + // update selected2 and then + // refresh the col selection state according to values in selected2 + var selectCols = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableCols(); + // if selected2 is not a valide index (e.g., larger than the column number) + // table.columns(selected2) will fail and result in a blank table + // this is different from the table.rows(), where the out-of-range indexes + // doesn't affect at all + selected2 = $(selected2).filter(table.columns().indexes()).get(); + table.columns().nodes().flatten().to$().removeClass(selClass); + if (selected2.length > 0) + table.columns(selected2).nodes().flatten().to$().addClass(selClass); + } + var callback = function() { + var colIdx = selTarget === 'column' ? table.cell(this).index().column : + $.inArray(this, table.columns().footer()), + thisCol = $(table.column(colIdx).nodes()); + if (colIdx === -1) return; + if (thisCol.hasClass(selClass)) { + thisCol.removeClass(selClass); + selected2.splice($.inArray(colIdx, selected2), 1); + } else { + if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); + thisCol.addClass(selClass); + selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx])); + } + selectCols(false); // update selected2 based on selectable + changeInput('columns_selected', selected2); + } + if (selTarget === 'column') { + $(table.table().body()).on('click.dt', 'td', callback); + } else { + $(table.table().footer()).on('click.dt', 'tr th', callback); + } + selectCols(false); // in case users have specified pre-selected columns + changeInput('columns_selected', selected2); + if (server) table.on('draw.dt', function(e) { selectCols(false); }); + methods.selectColumns = function(selected, ignoreSelectable) { + selected2 = $.makeArray(selected); + selectCols(ignoreSelectable); + changeInput('columns_selected', selected2); + } + } + + if (selTarget === 'cell') { + var selected3 = [], selectable3 = []; + if (selected !== null) selected3 = selected; + if (selectable !== null && typeof selectable !== 'boolean') selectable3 = selectable; + var findIndex = function(ij, sel) { + for (var i = 0; i < sel.length; i++) { + if (ij[0] === sel[i][0] && ij[1] === sel[i][1]) return i; + } + return -1; + } + // Change selected3's value based on selectable3, then refresh the cell state + var onlyKeepSelectableCells = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected3 = []; + return; + } + if (selectable3.length === 0) return; + var nonselectable = selectable3[0][0] <= 0; + var out = []; + if (nonselectable) { + selected3.map(function(ij) { + // should make selectable3 positive + if (findIndex([-ij[0], -ij[1]], selectable3) === -1) { out.push(ij); } + }); + } else { + selected3.map(function(ij) { + if (findIndex(ij, selectable3) > -1) { out.push(ij); } + }); + } + selected3 = out; + } + // Change selected3's value based on selectable3, then + // refresh the cell selection state according to values in selected3 + var selectCells = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableCells(); + table.$('td.' + selClass).removeClass(selClass); + if (selected3.length === 0) return; + if (server) { + table.cells({page: 'current'}).every(function() { + var info = tweakCellIndex(this); + if (findIndex([info.row, info.col], selected3) > -1) + $(this.node()).addClass(selClass); + }); + } else { + selected3.map(function(ij) { + $(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass); + }); + } + }; + table.on('click.dt', 'tbody td', function() { + var $this = $(this), info = tweakCellIndex(table.cell(this)); + if ($this.hasClass(selClass)) { + $this.removeClass(selClass); + selected3.splice(findIndex([info.row, info.col], selected3), 1); + } else { + if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); + $this.addClass(selClass); + selected3 = selMode === 'single' ? [[info.row, info.col]] : + unique(selected3.concat([[info.row, info.col]])); + } + selectCells(false); // must call this to update selected3 based on selectable3 + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + }); + selectCells(false); // in case users have specified pre-selected columns + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + + if (server) table.on('draw.dt', function(e) { selectCells(false); }); + methods.selectCells = function(selected, ignoreSelectable) { + selected3 = selected ? selected : []; + selectCells(ignoreSelectable); + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + } + } + } + + // expose some table info to Shiny + var updateTableInfo = function(e, settings) { + // TODO: is anyone interested in the page info? + // changeInput('page_info', table.page.info()); + var updateRowInfo = function(id, modifier) { + var idx; + if (server) { + idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all; + } else { + var rows = table.rows($.extend({ + search: 'applied', + page: 'all' + }, modifier)); + idx = addOne(rows.indexes().toArray()); + } + changeInput('rows' + '_' + id, idx); + }; + updateRowInfo('current', {page: 'current'}); + updateRowInfo('all', {}); + } + table.on('draw.dt', updateTableInfo); + updateTableInfo(); + + // state info + table.on('draw.dt column-visibility.dt', function() { + changeInput('state', table.state()); + }); + changeInput('state', table.state()); + + // search info + var updateSearchInfo = function() { + changeInput('search', table.search()); + if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) { + return $(td).find('input').first().val(); + })); + } + table.on('draw.dt', updateSearchInfo); + updateSearchInfo(); + + var cellInfo = function(thiz) { + var info = tweakCellIndex(table.cell(thiz)); + info.value = table.cell(thiz).data(); + return info; + } + // the current cell clicked on + table.on('click.dt', 'tbody td', function() { + changeInput('cell_clicked', cellInfo(this), null, null, {priority: 'event'}); + }) + changeInput('cell_clicked', {}); + + // do not trigger table selection when clicking on links unless they have classes + table.on('mousedown.dt', 'tbody td a', function(e) { + if (this.className === '') e.stopPropagation(); + }); + + methods.addRow = function(data, rowname, resetPaging) { + var n = table.columns().indexes().length, d = n - data.length; + if (d === 1) { + data = rowname.concat(data) + } else if (d !== 0) { + console.log(data); + console.log(table.columns().indexes()); + throw 'New data must be of the same length as current data (' + n + ')'; + }; + table.row.add(data).draw(resetPaging); + } + + methods.updateSearch = function(keywords) { + if (keywords.global !== null) + $(table.table().container()).find('input[type=search]').first() + .val(keywords.global).trigger('input'); + var columns = keywords.columns; + if (!filterRow || columns === null) return; + filterRow.toArray().map(function(td, i) { + var v = typeof columns === 'string' ? columns : columns[i]; + if (typeof v === 'undefined') { + console.log('The search keyword for column ' + i + ' is undefined') + return; + } + // Update column search string and values on linked filter widgets. + // 'input' for factor and char filters, 'change' for numeric filters. + $(td).find('input').first().val(v).trigger('input', [true]).trigger('change'); + }); + table.draw(); + } + + methods.hideCols = function(hide, reset) { + if (reset) table.columns().visible(true, false); + table.columns(hide).visible(false); + } + + methods.showCols = function(show, reset) { + if (reset) table.columns().visible(false, false); + table.columns(show).visible(true); + } + + methods.colReorder = function(order, origOrder) { + table.colReorder.order(order, origOrder); + } + + methods.selectPage = function(page) { + if (table.page.info().pages < page || page < 1) { + throw 'Selected page is out of range'; + }; + table.page(page - 1).draw(false); + } + + methods.reloadData = function(resetPaging, clearSelection) { + // empty selections first if necessary + if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]); + if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]); + if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]); + table.ajax.reload(null, resetPaging); + } + + // update table filters (set new limits of sliders) + methods.updateFilters = function(newProps) { + // loop through each filter in the filter row + filterRow.each(function(i, td) { + var k = i; + if (filterRow.length > newProps.length) { + if (i === 0) return; // first column is row names + k = i - 1; + } + // Update the filters to reflect the updated data. + // Allow "falsy" (e.g. NULL) to signify a no-op. + if (newProps[k]) { + setFilterProps(td, newProps[k]); + } + }); + }; + + table.shinyMethods = methods; + }, + resize: function(el, width, height, instance) { + if (instance.data) this.renderValue(el, instance.data, instance); + + // dynamically adjust height if fillContainer = TRUE + if (instance.fillContainer) + this.fillAvailableHeight(el, height); + + this.adjustWidth(el); + }, + + // dynamically set the scroll body to fill available height + // (used with fillContainer = TRUE) + fillAvailableHeight: function(el, availableHeight) { + + // see how much of the table is occupied by header/footer elements + // and use that to compute a target scroll body height + var dtWrapper = $(el).find('div.dataTables_wrapper'); + var dtScrollBody = $(el).find($('div.dataTables_scrollBody')); + var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight(); + var scrollBodyHeight = availableHeight - framingHeight; + + // we need to set `max-height` to none as datatables library now sets this + // to a fixed height, disabling the ability to resize to fill the window, + // as it will be set to a fixed 100px under such circumstances, e.g., RStudio IDE, + // or FlexDashboard + // see https://github.com/rstudio/DT/issues/951#issuecomment-1026464509 + dtScrollBody.css('max-height', 'none'); + // set the height + dtScrollBody.height(scrollBodyHeight + 'px'); + }, + + // adjust the width of columns; remove the hard-coded widths on table and the + // scroll header when scrollX/Y are enabled + adjustWidth: function(el) { + var $el = $(el), table = $el.data('datatable'); + if (table) table.columns.adjust(); + $el.find('.dataTables_scrollHeadInner').css('width', '') + .children('table').css('margin-left', ''); + } +}); + + if (!HTMLWidgets.shinyMode) return; + + Shiny.addCustomMessageHandler('datatable-calls', function(data) { + var id = data.id; + var el = document.getElementById(id); + var table = el ? $(el).data('datatable') : null; + if (!table) { + console.log("Couldn't find table with id " + id); + return; + } + + var methods = table.shinyMethods, call = data.call; + if (methods[call.method]) { + methods[call.method].apply(table, call.args); + } else { + console.log("Unknown method " + call.method); + } + }); + +})(); diff --git a/docs/coverage/lib/datatables-css-0.0.0/datatables-crosstalk.css b/docs/coverage/lib/datatables-css-0.0.0/datatables-crosstalk.css new file mode 100644 index 00000000..bd1159c8 --- /dev/null +++ b/docs/coverage/lib/datatables-css-0.0.0/datatables-crosstalk.css @@ -0,0 +1,32 @@ +.dt-crosstalk-fade { + opacity: 0.2; +} + +html body div.DTS div.dataTables_scrollBody { + background: none; +} + + +/* +Fix https://github.com/rstudio/DT/issues/563 +If the `table.display` is set to "block" (e.g., pkgdown), the browser will display +datatable objects strangely. The search panel and the page buttons will still be +in full-width but the table body will be "compact" and shorter. +In therory, having this attributes will affect `dom="t"` +with `display: block` users. But in reality, there should be no one. +We may remove the below lines in the future if the upstream agree to have this there. +See https://github.com/DataTables/DataTablesSrc/issues/160 +*/ + +table.dataTable { + display: table; +} + + +/* +When DTOutput(fill = TRUE), it receives a .html-fill-item class (via htmltools::bindFillRole()), which effectively amounts to `flex: 1 1 auto`. That's mostly fine, but the case where `fillContainer=TRUE`+`height:auto`+`flex-basis:auto` and the container (e.g., a bslib::card()) doesn't have a defined height is a bit problematic since the table wants to fit the parent but the parent wants to fit the table, which results pretty small table height (maybe because there is a minimum height somewhere?). It seems better in this case to impose a 400px height default for the table, which we can do by setting `flex-basis` to 400px (the table is still allowed to grow/shrink when the container has an opinionated height). +*/ + +.html-fill-container > .html-fill-item.datatables { + flex-basis: 400px; +} diff --git a/docs/coverage/lib/dt-core-1.13.6/css/jquery.dataTables.extra.css b/docs/coverage/lib/dt-core-1.13.6/css/jquery.dataTables.extra.css new file mode 100644 index 00000000..b2dd141f --- /dev/null +++ b/docs/coverage/lib/dt-core-1.13.6/css/jquery.dataTables.extra.css @@ -0,0 +1,28 @@ +/* Selected rows/cells */ +table.dataTable tr.selected td, table.dataTable td.selected { + background-color: #b0bed9 !important; +} +/* In case of scrollX/Y or FixedHeader */ +.dataTables_scrollBody .dataTables_sizing { + visibility: hidden; +} + +/* The datatables' theme CSS file doesn't define +the color but with white background. It leads to an issue that +when the HTML's body color is set to 'white', the user can't +see the text since the background is white. One case happens in the +RStudio's IDE when inline viewing the DT table inside an Rmd file, +if the IDE theme is set to "Cobalt". + +See https://github.com/rstudio/DT/issues/447 for more info + +This fixes should have little side-effects because all the other elements +of the default theme use the #333 font color. + +TODO: The upstream may use relative colors for both the table background +and the color. It means the table can display well without this patch +then. At that time, we need to remove the below CSS attributes. +*/ +div.datatables { + color: #333; +} diff --git a/docs/coverage/lib/dt-core-1.13.6/css/jquery.dataTables.min.css b/docs/coverage/lib/dt-core-1.13.6/css/jquery.dataTables.min.css new file mode 100644 index 00000000..ad59f843 --- /dev/null +++ b/docs/coverage/lib/dt-core-1.13.6/css/jquery.dataTables.min.css @@ -0,0 +1 @@ +:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0, 0, 0, 0.5);content:"â–º"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"â–¼"}html.dark table.dataTable td.dt-control:before{color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255, 255, 255, 0.5)}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"â–²";content:"â–²"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"â–¼";content:"â–¼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border>tbody>tr>th,table.dataTable.row-border>tbody>tr>td,table.dataTable.display>tbody>tr>th,table.dataTable.display>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border>tbody>tr:first-child>th,table.dataTable.row-border>tbody>tr:first-child>td,table.dataTable.display>tbody>tr:first-child>th,table.dataTable.display>tbody>tr:first-child>td{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0262ef}table.dataTable.cell-border>tbody>tr>th,table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr>th:first-child,table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr:first-child>th,table.dataTable.cell-border>tbody>tr:first-child>td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 1) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.954)}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.947)}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.962)}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(0, 0, 0, 0.05);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.05)), color-stop(100%, rgba(0, 0, 0, 0.05)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89, 91, 94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89, 91, 94)}html.dark table.dataTable.row-border>tbody>tr>th,html.dark table.dataTable.row-border>tbody>tr>td,html.dark table.dataTable.display>tbody>tr>th,html.dark table.dataTable.display>tbody>tr>td{border-top:1px solid rgb(64, 67, 70)}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0257d5}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64, 67, 70);border-right:1px solid rgb(64, 67, 70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64, 67, 70)}html.dark .dataTables_wrapper .dataTables_filter input,html.dark .dataTables_wrapper .dataTables_length select{border:1px solid rgba(255, 255, 255, 0.2);background-color:var(--dt-html-background)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{border:1px solid rgb(89, 91, 94);background:rgba(255, 255, 255, 0.15)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{color:#666 !important}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:hover{border:1px solid rgb(53, 53, 53);background:rgb(53, 53, 53)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:active{background:#3a3a3a} diff --git a/docs/coverage/lib/dt-core-1.13.6/js/jquery.dataTables.min.js b/docs/coverage/lib/dt-core-1.13.6/js/jquery.dataTables.min.js new file mode 100644 index 00000000..f786b0da --- /dev/null +++ b/docs/coverage/lib/dt-core-1.13.6/js/jquery.dataTables.min.js @@ -0,0 +1,4 @@ +/*! DataTables 1.13.6 + * ©2008-2023 SpryMedia Ltd - datatables.net/license + */ +!function(n){"use strict";var a;"function"==typeof define&&define.amd?define(["jquery"],function(t){return n(t,window,document)}):"object"==typeof exports?(a=require("jquery"),"undefined"==typeof window?module.exports=function(t,e){return t=t||window,e=e||a(t),n(e,t,t.document)}:n(a,window,window.document)):window.DataTable=n(jQuery,window,document)}(function(P,j,v,H){"use strict";function d(t){var e=parseInt(t,10);return!isNaN(e)&&isFinite(t)?e:null}function l(t,e,n){var a=typeof t,r="string"==a;return"number"==a||"bigint"==a||!!h(t)||(e&&r&&(t=$(t,e)),n&&r&&(t=t.replace(q,"")),!isNaN(parseFloat(t))&&isFinite(t))}function a(t,e,n){var a;return!!h(t)||(h(a=t)||"string"==typeof a)&&!!l(t.replace(V,"").replace(/<script/i,""),e,n)||null}function m(t,e,n,a){var r=[],o=0,i=e.length;if(a!==H)for(;o<i;o++)t[e[o]][n]&&r.push(t[e[o]][n][a]);else for(;o<i;o++)r.push(t[e[o]][n]);return r}function f(t,e){var n,a=[];e===H?(e=0,n=t):(n=e,e=t);for(var r=e;r<n;r++)a.push(r);return a}function _(t){for(var e=[],n=0,a=t.length;n<a;n++)t[n]&&e.push(t[n]);return e}function s(t,e){return-1!==this.indexOf(t,e=e===H?0:e)}var p,e,t,w=function(t,v){if(w.factory(t,v))return w;if(this instanceof w)return P(t).DataTable(v);v=t,this.$=function(t,e){return this.api(!0).$(t,e)},this._=function(t,e){return this.api(!0).rows(t,e).data()},this.api=function(t){return new B(t?ge(this[p.iApiIndex]):this)},this.fnAddData=function(t,e){var n=this.api(!0),t=(Array.isArray(t)&&(Array.isArray(t[0])||P.isPlainObject(t[0]))?n.rows:n.row).add(t);return e!==H&&!e||n.draw(),t.flatten().toArray()},this.fnAdjustColumnSizing=function(t){var e=this.api(!0).columns.adjust(),n=e.settings()[0],a=n.oScroll;t===H||t?e.draw(!1):""===a.sX&&""===a.sY||Qt(n)},this.fnClearTable=function(t){var e=this.api(!0).clear();t!==H&&!t||e.draw()},this.fnClose=function(t){this.api(!0).row(t).child.hide()},this.fnDeleteRow=function(t,e,n){var a=this.api(!0),t=a.rows(t),r=t.settings()[0],o=r.aoData[t[0][0]];return t.remove(),e&&e.call(this,r,o),n!==H&&!n||a.draw(),o},this.fnDestroy=function(t){this.api(!0).destroy(t)},this.fnDraw=function(t){this.api(!0).draw(t)},this.fnFilter=function(t,e,n,a,r,o){var i=this.api(!0);(null===e||e===H?i:i.column(e)).search(t,n,a,o),i.draw()},this.fnGetData=function(t,e){var n,a=this.api(!0);return t!==H?(n=t.nodeName?t.nodeName.toLowerCase():"",e!==H||"td"==n||"th"==n?a.cell(t,e).data():a.row(t).data()||null):a.data().toArray()},this.fnGetNodes=function(t){var e=this.api(!0);return t!==H?e.row(t).node():e.rows().nodes().flatten().toArray()},this.fnGetPosition=function(t){var e=this.api(!0),n=t.nodeName.toUpperCase();return"TR"==n?e.row(t).index():"TD"==n||"TH"==n?[(n=e.cell(t).index()).row,n.columnVisible,n.column]:null},this.fnIsOpen=function(t){return this.api(!0).row(t).child.isShown()},this.fnOpen=function(t,e,n){return this.api(!0).row(t).child(e,n).show().child()[0]},this.fnPageChange=function(t,e){t=this.api(!0).page(t);e!==H&&!e||t.draw(!1)},this.fnSetColumnVis=function(t,e,n){t=this.api(!0).column(t).visible(e);n!==H&&!n||t.columns.adjust().draw()},this.fnSettings=function(){return ge(this[p.iApiIndex])},this.fnSort=function(t){this.api(!0).order(t).draw()},this.fnSortListener=function(t,e,n){this.api(!0).order.listener(t,e,n)},this.fnUpdate=function(t,e,n,a,r){var o=this.api(!0);return(n===H||null===n?o.row(e):o.cell(e,n)).data(t),r!==H&&!r||o.columns.adjust(),a!==H&&!a||o.draw(),0},this.fnVersionCheck=p.fnVersionCheck;var e,y=this,D=v===H,_=this.length;for(e in D&&(v={}),this.oApi=this.internal=p.internal,w.ext.internal)e&&(this[e]=$e(e));return this.each(function(){var r=1<_?be({},v,!0):v,o=0,t=this.getAttribute("id"),i=!1,e=w.defaults,l=P(this);if("table"!=this.nodeName.toLowerCase())W(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{K(e),Q(e.column),C(e,e,!0),C(e.column,e.column,!0),C(e,P.extend(r,l.data()),!0);for(var n=w.settings,o=0,s=n.length;o<s;o++){var a=n[o];if(a.nTable==this||a.nTHead&&a.nTHead.parentNode==this||a.nTFoot&&a.nTFoot.parentNode==this){var u=(r.bRetrieve!==H?r:e).bRetrieve,c=(r.bDestroy!==H?r:e).bDestroy;if(D||u)return a.oInstance;if(c){a.oInstance.fnDestroy();break}return void W(a,0,"Cannot reinitialise DataTable",3)}if(a.sTableId==this.id){n.splice(o,1);break}}null!==t&&""!==t||(t="DataTables_Table_"+w.ext._unique++,this.id=t);var f,d,h=P.extend(!0,{},w.models.oSettings,{sDestroyWidth:l[0].style.width,sInstance:t,sTableId:t}),p=(h.nTable=this,h.oApi=y.internal,h.oInit=r,n.push(h),h.oInstance=1===y.length?y:l.dataTable(),K(r),Z(r.oLanguage),r.aLengthMenu&&!r.iDisplayLength&&(r.iDisplayLength=(Array.isArray(r.aLengthMenu[0])?r.aLengthMenu[0]:r.aLengthMenu)[0]),r=be(P.extend(!0,{},e),r),F(h.oFeatures,r,["bPaginate","bLengthChange","bFilter","bSort","bSortMulti","bInfo","bProcessing","bAutoWidth","bSortClasses","bServerSide","bDeferRender"]),F(h,r,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]),F(h.oScroll,r,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]),F(h.oLanguage,r,"fnInfoCallback"),L(h,"aoDrawCallback",r.fnDrawCallback,"user"),L(h,"aoServerParams",r.fnServerParams,"user"),L(h,"aoStateSaveParams",r.fnStateSaveParams,"user"),L(h,"aoStateLoadParams",r.fnStateLoadParams,"user"),L(h,"aoStateLoaded",r.fnStateLoaded,"user"),L(h,"aoRowCallback",r.fnRowCallback,"user"),L(h,"aoRowCreatedCallback",r.fnCreatedRow,"user"),L(h,"aoHeaderCallback",r.fnHeaderCallback,"user"),L(h,"aoFooterCallback",r.fnFooterCallback,"user"),L(h,"aoInitComplete",r.fnInitComplete,"user"),L(h,"aoPreDrawCallback",r.fnPreDrawCallback,"user"),h.rowIdFn=A(r.rowId),tt(h),h.oClasses),g=(P.extend(p,w.ext.classes,r.oClasses),l.addClass(p.sTable),h.iInitDisplayStart===H&&(h.iInitDisplayStart=r.iDisplayStart,h._iDisplayStart=r.iDisplayStart),null!==r.iDeferLoading&&(h.bDeferLoading=!0,t=Array.isArray(r.iDeferLoading),h._iRecordsDisplay=t?r.iDeferLoading[0]:r.iDeferLoading,h._iRecordsTotal=t?r.iDeferLoading[1]:r.iDeferLoading),h.oLanguage),t=(P.extend(!0,g,r.oLanguage),g.sUrl?(P.ajax({dataType:"json",url:g.sUrl,success:function(t){C(e.oLanguage,t),Z(t),P.extend(!0,g,t,h.oInit.oLanguage),R(h,null,"i18n",[h]),Jt(h)},error:function(){Jt(h)}}),i=!0):R(h,null,"i18n",[h]),null===r.asStripeClasses&&(h.asStripeClasses=[p.sStripeOdd,p.sStripeEven]),h.asStripeClasses),b=l.children("tbody").find("tr").eq(0),m=(-1!==P.inArray(!0,P.map(t,function(t,e){return b.hasClass(t)}))&&(P("tbody tr",this).removeClass(t.join(" ")),h.asDestroyStripes=t.slice()),[]),t=this.getElementsByTagName("thead");if(0!==t.length&&(wt(h.aoHeader,t[0]),m=Ct(h)),null===r.aoColumns)for(f=[],o=0,s=m.length;o<s;o++)f.push(null);else f=r.aoColumns;for(o=0,s=f.length;o<s;o++)nt(h,m?m[o]:null);st(h,r.aoColumnDefs,f,function(t,e){at(h,t,e)}),b.length&&(d=function(t,e){return null!==t.getAttribute("data-"+e)?e:null},P(b[0]).children("th, td").each(function(t,e){var n,a=h.aoColumns[t];a||W(h,0,"Incorrect column count",18),a.mData===t&&(n=d(e,"sort")||d(e,"order"),e=d(e,"filter")||d(e,"search"),null===n&&null===e||(a.mData={_:t+".display",sort:null!==n?t+".@data-"+n:H,type:null!==n?t+".@data-"+n:H,filter:null!==e?t+".@data-"+e:H},a._isArrayHost=!0,at(h,t)))}));var S=h.oFeatures,t=function(){if(r.aaSorting===H){var t=h.aaSorting;for(o=0,s=t.length;o<s;o++)t[o][1]=h.aoColumns[o].asSorting[0]}ce(h),S.bSort&&L(h,"aoDrawCallback",function(){var t,n;h.bSorted&&(t=I(h),n={},P.each(t,function(t,e){n[e.src]=e.dir}),R(h,null,"order",[h,t,n]),le(h))}),L(h,"aoDrawCallback",function(){(h.bSorted||"ssp"===E(h)||S.bDeferRender)&&ce(h)},"sc");var e=l.children("caption").each(function(){this._captionSide=P(this).css("caption-side")}),n=l.children("thead"),a=(0===n.length&&(n=P("<thead/>").appendTo(l)),h.nTHead=n[0],l.children("tbody")),n=(0===a.length&&(a=P("<tbody/>").insertAfter(n)),h.nTBody=a[0],l.children("tfoot"));if(0===(n=0===n.length&&0<e.length&&(""!==h.oScroll.sX||""!==h.oScroll.sY)?P("<tfoot/>").appendTo(l):n).length||0===n.children().length?l.addClass(p.sNoFooter):0<n.length&&(h.nTFoot=n[0],wt(h.aoFooter,h.nTFoot)),r.aaData)for(o=0;o<r.aaData.length;o++)x(h,r.aaData[o]);else!h.bDeferLoading&&"dom"!=E(h)||ut(h,P(h.nTBody).children("tr"));h.aiDisplay=h.aiDisplayMaster.slice(),!(h.bInitialised=!0)===i&&Jt(h)};L(h,"aoDrawCallback",de,"state_save"),r.bStateSave?(S.bStateSave=!0,he(h,0,t)):t()}}),y=null,this},c={},U=/[\r\n\u2028]/g,V=/<.*?>/g,X=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,J=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"].join("|\\")+")","g"),q=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,h=function(t){return!t||!0===t||"-"===t},$=function(t,e){return c[e]||(c[e]=new RegExp(Ot(e),"g")),"string"==typeof t&&"."!==e?t.replace(/\./g,"").replace(c[e],"."):t},N=function(t,e,n){var a=[],r=0,o=t.length;if(n!==H)for(;r<o;r++)t[r]&&t[r][e]&&a.push(t[r][e][n]);else for(;r<o;r++)t[r]&&a.push(t[r][e]);return a},G=function(t){if(!(t.length<2))for(var e=t.slice().sort(),n=e[0],a=1,r=e.length;a<r;a++){if(e[a]===n)return!1;n=e[a]}return!0},z=function(t){if(G(t))return t.slice();var e,n,a,r=[],o=t.length,i=0;t:for(n=0;n<o;n++){for(e=t[n],a=0;a<i;a++)if(r[a]===e)continue t;r.push(e),i++}return r},Y=function(t,e){if(Array.isArray(e))for(var n=0;n<e.length;n++)Y(t,e[n]);else t.push(e);return t};function i(n){var a,r,o={};P.each(n,function(t,e){(a=t.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(a[1]+" ")&&(r=t.replace(a[0],a[2].toLowerCase()),o[r]=t,"o"===a[1])&&i(n[t])}),n._hungarianMap=o}function C(n,a,r){var o;n._hungarianMap||i(n),P.each(a,function(t,e){(o=n._hungarianMap[t])===H||!r&&a[o]!==H||("o"===o.charAt(0)?(a[o]||(a[o]={}),P.extend(!0,a[o],a[t]),C(n[o],a[o],r)):a[o]=a[t])})}function Z(t){var e,n=w.defaults.oLanguage,a=n.sDecimal;a&&Me(a),t&&(e=t.sZeroRecords,!t.sEmptyTable&&e&&"No data available in table"===n.sEmptyTable&&F(t,t,"sZeroRecords","sEmptyTable"),!t.sLoadingRecords&&e&&"Loading..."===n.sLoadingRecords&&F(t,t,"sZeroRecords","sLoadingRecords"),t.sInfoThousands&&(t.sThousands=t.sInfoThousands),e=t.sDecimal)&&a!==e&&Me(e)}Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),Array.prototype.includes||(Array.prototype.includes=s),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),String.prototype.includes||(String.prototype.includes=s),w.util={throttle:function(a,t){var r,o,i=t!==H?t:200;return function(){var t=this,e=+new Date,n=arguments;r&&e<r+i?(clearTimeout(o),o=setTimeout(function(){r=H,a.apply(t,n)},i)):(r=e,a.apply(t,n))}},escapeRegex:function(t){return t.replace(J,"\\$1")},set:function(a){var d;return P.isPlainObject(a)?w.util.set(a._):null===a?function(){}:"function"==typeof a?function(t,e,n){a(t,"set",e,n)}:"string"!=typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("(")?function(t,e){t[a]=e}:(d=function(t,e,n){for(var a,r,o,i,l=dt(n),n=l[l.length-1],s=0,u=l.length-1;s<u;s++){if("__proto__"===l[s]||"constructor"===l[s])throw new Error("Cannot set prototype values");if(a=l[s].match(ft),r=l[s].match(g),a){if(l[s]=l[s].replace(ft,""),t[l[s]]=[],(a=l.slice()).splice(0,s+1),i=a.join("."),Array.isArray(e))for(var c=0,f=e.length;c<f;c++)d(o={},e[c],i),t[l[s]].push(o);else t[l[s]]=e;return}r&&(l[s]=l[s].replace(g,""),t=t[l[s]](e)),null!==t[l[s]]&&t[l[s]]!==H||(t[l[s]]={}),t=t[l[s]]}n.match(g)?t[n.replace(g,"")](e):t[n.replace(ft,"")]=e},function(t,e){return d(t,e,a)})},get:function(r){var o,d;return P.isPlainObject(r)?(o={},P.each(r,function(t,e){e&&(o[t]=w.util.get(e))}),function(t,e,n,a){var r=o[e]||o._;return r!==H?r(t,e,n,a):t}):null===r?function(t){return t}:"function"==typeof r?function(t,e,n,a){return r(t,e,n,a)}:"string"!=typeof r||-1===r.indexOf(".")&&-1===r.indexOf("[")&&-1===r.indexOf("(")?function(t,e){return t[r]}:(d=function(t,e,n){var a,r,o;if(""!==n)for(var i=dt(n),l=0,s=i.length;l<s;l++){if(f=i[l].match(ft),a=i[l].match(g),f){if(i[l]=i[l].replace(ft,""),""!==i[l]&&(t=t[i[l]]),r=[],i.splice(0,l+1),o=i.join("."),Array.isArray(t))for(var u=0,c=t.length;u<c;u++)r.push(d(t[u],e,o));var f=f[0].substring(1,f[0].length-1);t=""===f?r:r.join(f);break}if(a)i[l]=i[l].replace(g,""),t=t[i[l]]();else{if(null===t||null===t[i[l]])return null;if(t===H||t[i[l]]===H)return H;t=t[i[l]]}}return t},function(t,e){return d(t,e,r)})}};var r=function(t,e,n){t[e]!==H&&(t[n]=t[e])};function K(t){r(t,"ordering","bSort"),r(t,"orderMulti","bSortMulti"),r(t,"orderClasses","bSortClasses"),r(t,"orderCellsTop","bSortCellsTop"),r(t,"order","aaSorting"),r(t,"orderFixed","aaSortingFixed"),r(t,"paging","bPaginate"),r(t,"pagingType","sPaginationType"),r(t,"pageLength","iDisplayLength"),r(t,"searching","bFilter"),"boolean"==typeof t.sScrollX&&(t.sScrollX=t.sScrollX?"100%":""),"boolean"==typeof t.scrollX&&(t.scrollX=t.scrollX?"100%":"");var e=t.aoSearchCols;if(e)for(var n=0,a=e.length;n<a;n++)e[n]&&C(w.models.oSearch,e[n])}function Q(t){r(t,"orderable","bSortable"),r(t,"orderData","aDataSort"),r(t,"orderSequence","asSorting"),r(t,"orderDataType","sortDataType");var e=t.aDataSort;"number"!=typeof e||Array.isArray(e)||(t.aDataSort=[e])}function tt(t){var e,n,a,r;w.__browser||(w.__browser=e={},r=(a=(n=P("<div/>").css({position:"fixed",top:0,left:-1*P(j).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(P("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(P("<div/>").css({width:"100%",height:10}))).appendTo("body")).children()).children(),e.barWidth=a[0].offsetWidth-a[0].clientWidth,e.bScrollOversize=100===r[0].offsetWidth&&100!==a[0].clientWidth,e.bScrollbarLeft=1!==Math.round(r.offset().left),e.bBounding=!!n[0].getBoundingClientRect().width,n.remove()),P.extend(t.oBrowser,w.__browser),t.oScroll.iBarWidth=w.__browser.barWidth}function et(t,e,n,a,r,o){var i,l=a,s=!1;for(n!==H&&(i=n,s=!0);l!==r;)t.hasOwnProperty(l)&&(i=s?e(i,t[l],l,t):t[l],s=!0,l+=o);return i}function nt(t,e){var n=w.defaults.column,a=t.aoColumns.length,n=P.extend({},w.models.oColumn,n,{nTh:e||v.createElement("th"),sTitle:n.sTitle||(e?e.innerHTML:""),aDataSort:n.aDataSort||[a],mData:n.mData||a,idx:a}),n=(t.aoColumns.push(n),t.aoPreSearchCols);n[a]=P.extend({},w.models.oSearch,n[a]),at(t,a,P(e).data())}function at(t,e,n){function a(t){return"string"==typeof t&&-1!==t.indexOf("@")}var e=t.aoColumns[e],r=t.oClasses,o=P(e.nTh),i=(!e.sWidthOrig&&(e.sWidthOrig=o.attr("width")||null,u=(o.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/))&&(e.sWidthOrig=u[1]),n!==H&&null!==n&&(Q(n),C(w.defaults.column,n,!0),n.mDataProp===H||n.mData||(n.mData=n.mDataProp),n.sType&&(e._sManualType=n.sType),n.className&&!n.sClass&&(n.sClass=n.className),n.sClass&&o.addClass(n.sClass),u=e.sClass,P.extend(e,n),F(e,n,"sWidth","sWidthOrig"),u!==e.sClass&&(e.sClass=u+" "+e.sClass),n.iDataSort!==H&&(e.aDataSort=[n.iDataSort]),F(e,n,"aDataSort"),e.ariaTitle||(e.ariaTitle=o.attr("aria-label"))),e.mData),l=A(i),s=e.mRender?A(e.mRender):null,u=(e._bAttrSrc=P.isPlainObject(i)&&(a(i.sort)||a(i.type)||a(i.filter)),e._setter=null,e.fnGetData=function(t,e,n){var a=l(t,e,H,n);return s&&e?s(a,e,t,n):a},e.fnSetData=function(t,e,n){return b(i)(t,e,n)},"number"==typeof i||e._isArrayHost||(t._rowReadObject=!0),t.oFeatures.bSort||(e.bSortable=!1,o.addClass(r.sSortableNone)),-1!==P.inArray("asc",e.asSorting)),n=-1!==P.inArray("desc",e.asSorting);e.bSortable&&(u||n)?u&&!n?(e.sSortingClass=r.sSortableAsc,e.sSortingClassJUI=r.sSortJUIAscAllowed):!u&&n?(e.sSortingClass=r.sSortableDesc,e.sSortingClassJUI=r.sSortJUIDescAllowed):(e.sSortingClass=r.sSortable,e.sSortingClassJUI=r.sSortJUI):(e.sSortingClass=r.sSortableNone,e.sSortingClassJUI="")}function O(t){if(!1!==t.oFeatures.bAutoWidth){var e=t.aoColumns;ee(t);for(var n=0,a=e.length;n<a;n++)e[n].nTh.style.width=e[n].sWidth}var r=t.oScroll;""===r.sY&&""===r.sX||Qt(t),R(t,null,"column-sizing",[t])}function rt(t,e){t=it(t,"bVisible");return"number"==typeof t[e]?t[e]:null}function ot(t,e){t=it(t,"bVisible"),e=P.inArray(e,t);return-1!==e?e:null}function T(t){var n=0;return P.each(t.aoColumns,function(t,e){e.bVisible&&"none"!==P(e.nTh).css("display")&&n++}),n}function it(t,n){var a=[];return P.map(t.aoColumns,function(t,e){t[n]&&a.push(e)}),a}function lt(t){for(var e,n,a,r,o,i,l,s=t.aoColumns,u=t.aoData,c=w.ext.type.detect,f=0,d=s.length;f<d;f++)if(l=[],!(o=s[f]).sType&&o._sManualType)o.sType=o._sManualType;else if(!o.sType){for(e=0,n=c.length;e<n;e++){for(a=0,r=u.length;a<r&&(l[a]===H&&(l[a]=S(t,a,f,"type")),(i=c[e](l[a],t))||e===c.length-1)&&("html"!==i||h(l[a]));a++);if(i){o.sType=i;break}}o.sType||(o.sType="string")}}function st(t,e,n,a){var r,o,i,l,s=t.aoColumns;if(e)for(r=e.length-1;0<=r;r--)for(var u,c=(u=e[r]).target!==H?u.target:u.targets!==H?u.targets:u.aTargets,f=0,d=(c=Array.isArray(c)?c:[c]).length;f<d;f++)if("number"==typeof c[f]&&0<=c[f]){for(;s.length<=c[f];)nt(t);a(c[f],u)}else if("number"==typeof c[f]&&c[f]<0)a(s.length+c[f],u);else if("string"==typeof c[f])for(i=0,l=s.length;i<l;i++)"_all"!=c[f]&&!P(s[i].nTh).hasClass(c[f])||a(i,u);if(n)for(r=0,o=n.length;r<o;r++)a(r,n[r])}function x(t,e,n,a){for(var r=t.aoData.length,o=P.extend(!0,{},w.models.oRow,{src:n?"dom":"data",idx:r}),i=(o._aData=e,t.aoData.push(o),t.aoColumns),l=0,s=i.length;l<s;l++)i[l].sType=null;t.aiDisplayMaster.push(r);e=t.rowIdFn(e);return e!==H&&(t.aIds[e]=o),!n&&t.oFeatures.bDeferRender||St(t,r,n,a),r}function ut(n,t){var a;return(t=t instanceof P?t:P(t)).map(function(t,e){return a=mt(n,e),x(n,a.data,e,a.cells)})}function S(t,e,n,a){"search"===a?a="filter":"order"===a&&(a="sort");var r=t.iDraw,o=t.aoColumns[n],i=t.aoData[e]._aData,l=o.sDefaultContent,s=o.fnGetData(i,a,{settings:t,row:e,col:n});if(s===H)return t.iDrawError!=r&&null===l&&(W(t,0,"Requested unknown parameter "+("function"==typeof o.mData?"{function}":"'"+o.mData+"'")+" for row "+e+", column "+n,4),t.iDrawError=r),l;if(s!==i&&null!==s||null===l||a===H){if("function"==typeof s)return s.call(i)}else s=l;return null===s&&"display"===a?"":"filter"===a&&(e=w.ext.type.search)[o.sType]?e[o.sType](s):s}function ct(t,e,n,a){var r=t.aoColumns[n],o=t.aoData[e]._aData;r.fnSetData(o,a,{settings:t,row:e,col:n})}var ft=/\[.*?\]$/,g=/\(\)$/;function dt(t){return P.map(t.match(/(\\.|[^\.])+/g)||[""],function(t){return t.replace(/\\\./g,".")})}var A=w.util.get,b=w.util.set;function ht(t){return N(t.aoData,"_aData")}function pt(t){t.aoData.length=0,t.aiDisplayMaster.length=0,t.aiDisplay.length=0,t.aIds={}}function gt(t,e,n){for(var a=-1,r=0,o=t.length;r<o;r++)t[r]==e?a=r:t[r]>e&&t[r]--;-1!=a&&n===H&&t.splice(a,1)}function bt(n,a,t,e){function r(t,e){for(;t.childNodes.length;)t.removeChild(t.firstChild);t.innerHTML=S(n,a,e,"display")}var o,i,l=n.aoData[a];if("dom"!==t&&(t&&"auto"!==t||"dom"!==l.src)){var s=l.anCells;if(s)if(e!==H)r(s[e],e);else for(o=0,i=s.length;o<i;o++)r(s[o],o)}else l._aData=mt(n,l,e,e===H?H:l._aData).data;l._aSortData=null,l._aFilterData=null;var u=n.aoColumns;if(e!==H)u[e].sType=null;else{for(o=0,i=u.length;o<i;o++)u[o].sType=null;vt(n,l)}}function mt(t,e,n,a){function r(t,e){var n;"string"==typeof t&&-1!==(n=t.indexOf("@"))&&(n=t.substring(n+1),b(t)(a,e.getAttribute(n)))}function o(t){n!==H&&n!==f||(l=d[f],s=t.innerHTML.trim(),l&&l._bAttrSrc?(b(l.mData._)(a,s),r(l.mData.sort,t),r(l.mData.type,t),r(l.mData.filter,t)):h?(l._setter||(l._setter=b(l.mData)),l._setter(a,s)):a[f]=s),f++}var i,l,s,u=[],c=e.firstChild,f=0,d=t.aoColumns,h=t._rowReadObject;a=a!==H?a:h?{}:[];if(c)for(;c;)"TD"!=(i=c.nodeName.toUpperCase())&&"TH"!=i||(o(c),u.push(c)),c=c.nextSibling;else for(var p=0,g=(u=e.anCells).length;p<g;p++)o(u[p]);var e=e.firstChild?e:e.nTr;return e&&(e=e.getAttribute("id"))&&b(t.rowId)(a,e),{data:a,cells:u}}function St(t,e,n,a){var r,o,i,l,s,u,c=t.aoData[e],f=c._aData,d=[];if(null===c.nTr){for(r=n||v.createElement("tr"),c.nTr=r,c.anCells=d,r._DT_RowIndex=e,vt(t,c),l=0,s=t.aoColumns.length;l<s;l++)i=t.aoColumns[l],(o=(u=!n)?v.createElement(i.sCellType):a[l])||W(t,0,"Incorrect column count",18),o._DT_CellIndex={row:e,column:l},d.push(o),!u&&(!i.mRender&&i.mData===l||P.isPlainObject(i.mData)&&i.mData._===l+".display")||(o.innerHTML=S(t,e,l,"display")),i.sClass&&(o.className+=" "+i.sClass),i.bVisible&&!n?r.appendChild(o):!i.bVisible&&n&&o.parentNode.removeChild(o),i.fnCreatedCell&&i.fnCreatedCell.call(t.oInstance,o,S(t,e,l),f,e,l);R(t,"aoRowCreatedCallback",null,[r,f,e,d])}}function vt(t,e){var n=e.nTr,a=e._aData;n&&((t=t.rowIdFn(a))&&(n.id=t),a.DT_RowClass&&(t=a.DT_RowClass.split(" "),e.__rowc=e.__rowc?z(e.__rowc.concat(t)):t,P(n).removeClass(e.__rowc.join(" ")).addClass(a.DT_RowClass)),a.DT_RowAttr&&P(n).attr(a.DT_RowAttr),a.DT_RowData)&&P(n).data(a.DT_RowData)}function yt(t){var e,n,a,r=t.nTHead,o=t.nTFoot,i=0===P("th, td",r).length,l=t.oClasses,s=t.aoColumns;for(i&&(n=P("<tr/>").appendTo(r)),c=0,f=s.length;c<f;c++)a=s[c],e=P(a.nTh).addClass(a.sClass),i&&e.appendTo(n),t.oFeatures.bSort&&(e.addClass(a.sSortingClass),!1!==a.bSortable)&&(e.attr("tabindex",t.iTabIndex).attr("aria-controls",t.sTableId),ue(t,a.nTh,c)),a.sTitle!=e[0].innerHTML&&e.html(a.sTitle),ve(t,"header")(t,e,a,l);if(i&&wt(t.aoHeader,r),P(r).children("tr").children("th, td").addClass(l.sHeaderTH),P(o).children("tr").children("th, td").addClass(l.sFooterTH),null!==o)for(var u=t.aoFooter[0],c=0,f=u.length;c<f;c++)(a=s[c])?(a.nTf=u[c].cell,a.sClass&&P(a.nTf).addClass(a.sClass)):W(t,0,"Incorrect column count",18)}function Dt(t,e,n){var a,r,o,i,l,s,u,c,f,d=[],h=[],p=t.aoColumns.length;if(e){for(n===H&&(n=!1),a=0,r=e.length;a<r;a++){for(d[a]=e[a].slice(),d[a].nTr=e[a].nTr,o=p-1;0<=o;o--)t.aoColumns[o].bVisible||n||d[a].splice(o,1);h.push([])}for(a=0,r=d.length;a<r;a++){if(u=d[a].nTr)for(;s=u.firstChild;)u.removeChild(s);for(o=0,i=d[a].length;o<i;o++)if(f=c=1,h[a][o]===H){for(u.appendChild(d[a][o].cell),h[a][o]=1;d[a+c]!==H&&d[a][o].cell==d[a+c][o].cell;)h[a+c][o]=1,c++;for(;d[a][o+f]!==H&&d[a][o].cell==d[a][o+f].cell;){for(l=0;l<c;l++)h[a+l][o+f]=1;f++}P(d[a][o].cell).attr("rowspan",c).attr("colspan",f)}}}}function y(t,e){n="ssp"==E(s=t),(l=s.iInitDisplayStart)!==H&&-1!==l&&(s._iDisplayStart=!n&&l>=s.fnRecordsDisplay()?0:l,s.iInitDisplayStart=-1);var n=R(t,"aoPreDrawCallback","preDraw",[t]);if(-1!==P.inArray(!1,n))D(t,!1);else{var a=[],r=0,o=t.asStripeClasses,i=o.length,l=t.oLanguage,s="ssp"==E(t),u=t.aiDisplay,n=t._iDisplayStart,c=t.fnDisplayEnd();if(t.bDrawing=!0,t.bDeferLoading)t.bDeferLoading=!1,t.iDraw++,D(t,!1);else if(s){if(!t.bDestroying&&!e)return void xt(t)}else t.iDraw++;if(0!==u.length)for(var f=s?t.aoData.length:c,d=s?0:n;d<f;d++){var h,p=u[d],g=t.aoData[p],b=(null===g.nTr&&St(t,p),g.nTr);0!==i&&(h=o[r%i],g._sRowStripe!=h)&&(P(b).removeClass(g._sRowStripe).addClass(h),g._sRowStripe=h),R(t,"aoRowCallback",null,[b,g._aData,r,d,p]),a.push(b),r++}else{e=l.sZeroRecords;1==t.iDraw&&"ajax"==E(t)?e=l.sLoadingRecords:l.sEmptyTable&&0===t.fnRecordsTotal()&&(e=l.sEmptyTable),a[0]=P("<tr/>",{class:i?o[0]:""}).append(P("<td />",{valign:"top",colSpan:T(t),class:t.oClasses.sRowEmpty}).html(e))[0]}R(t,"aoHeaderCallback","header",[P(t.nTHead).children("tr")[0],ht(t),n,c,u]),R(t,"aoFooterCallback","footer",[P(t.nTFoot).children("tr")[0],ht(t),n,c,u]);s=P(t.nTBody);s.children().detach(),s.append(P(a)),R(t,"aoDrawCallback","draw",[t]),t.bSorted=!1,t.bFiltered=!1,t.bDrawing=!1}}function u(t,e){var n=t.oFeatures,a=n.bSort,n=n.bFilter;a&&ie(t),n?Rt(t,t.oPreviousSearch):t.aiDisplay=t.aiDisplayMaster.slice(),!0!==e&&(t._iDisplayStart=0),t._drawHold=e,y(t),t._drawHold=!1}function _t(t){for(var e,n,a,r,o,i,l,s=t.oClasses,u=P(t.nTable),u=P("<div/>").insertBefore(u),c=t.oFeatures,f=P("<div/>",{id:t.sTableId+"_wrapper",class:s.sWrapper+(t.nTFoot?"":" "+s.sNoFooter)}),d=(t.nHolding=u[0],t.nTableWrapper=f[0],t.nTableReinsertBefore=t.nTable.nextSibling,t.sDom.split("")),h=0;h<d.length;h++){if(e=null,"<"==(n=d[h])){if(a=P("<div/>")[0],"'"==(r=d[h+1])||'"'==r){for(o="",i=2;d[h+i]!=r;)o+=d[h+i],i++;"H"==o?o=s.sJUIHeader:"F"==o&&(o=s.sJUIFooter),-1!=o.indexOf(".")?(l=o.split("."),a.id=l[0].substr(1,l[0].length-1),a.className=l[1]):"#"==o.charAt(0)?a.id=o.substr(1,o.length-1):a.className=o,h+=i}f.append(a),f=P(a)}else if(">"==n)f=f.parent();else if("l"==n&&c.bPaginate&&c.bLengthChange)e=Gt(t);else if("f"==n&&c.bFilter)e=Lt(t);else if("r"==n&&c.bProcessing)e=Zt(t);else if("t"==n)e=Kt(t);else if("i"==n&&c.bInfo)e=Ut(t);else if("p"==n&&c.bPaginate)e=zt(t);else if(0!==w.ext.feature.length)for(var p=w.ext.feature,g=0,b=p.length;g<b;g++)if(n==p[g].cFeature){e=p[g].fnInit(t);break}e&&((l=t.aanFeatures)[n]||(l[n]=[]),l[n].push(e),f.append(e))}u.replaceWith(f),t.nHolding=null}function wt(t,e){var n,a,r,o,i,l,s,u,c,f,d=P(e).children("tr");for(t.splice(0,t.length),r=0,l=d.length;r<l;r++)t.push([]);for(r=0,l=d.length;r<l;r++)for(a=(n=d[r]).firstChild;a;){if("TD"==a.nodeName.toUpperCase()||"TH"==a.nodeName.toUpperCase())for(u=(u=+a.getAttribute("colspan"))&&0!=u&&1!=u?u:1,c=(c=+a.getAttribute("rowspan"))&&0!=c&&1!=c?c:1,s=function(t,e,n){for(var a=t[e];a[n];)n++;return n}(t,r,0),f=1==u,i=0;i<u;i++)for(o=0;o<c;o++)t[r+o][s+i]={cell:a,unique:f},t[r+o].nTr=n;a=a.nextSibling}}function Ct(t,e,n){var a=[];n||(n=t.aoHeader,e&&wt(n=[],e));for(var r=0,o=n.length;r<o;r++)for(var i=0,l=n[r].length;i<l;i++)!n[r][i].unique||a[i]&&t.bSortCellsTop||(a[i]=n[r][i].cell);return a}function Tt(r,t,n){function e(t){var e=r.jqXHR?r.jqXHR.status:null;(null===t||"number"==typeof e&&204==e)&&Ft(r,t={},[]),(e=t.error||t.sError)&&W(r,0,e),r.json=t,R(r,null,"xhr",[r,t,r.jqXHR]),n(t)}R(r,"aoServerParams","serverParams",[t]),t&&Array.isArray(t)&&(a={},o=/(.*?)\[\]$/,P.each(t,function(t,e){var n=e.name.match(o);n?(n=n[0],a[n]||(a[n]=[]),a[n].push(e.value)):a[e.name]=e.value}),t=a);var a,o,i,l=r.ajax,s=r.oInstance,u=(P.isPlainObject(l)&&l.data&&(u="function"==typeof(i=l.data)?i(t,r):i,t="function"==typeof i&&u?u:P.extend(!0,t,u),delete l.data),{data:t,success:e,dataType:"json",cache:!1,type:r.sServerMethod,error:function(t,e,n){var a=R(r,null,"xhr",[r,null,r.jqXHR]);-1===P.inArray(!0,a)&&("parsererror"==e?W(r,0,"Invalid JSON response",1):4===t.readyState&&W(r,0,"Ajax error",7)),D(r,!1)}});r.oAjaxData=t,R(r,null,"preXhr",[r,t]),r.fnServerData?r.fnServerData.call(s,r.sAjaxSource,P.map(t,function(t,e){return{name:e,value:t}}),e,r):r.sAjaxSource||"string"==typeof l?r.jqXHR=P.ajax(P.extend(u,{url:l||r.sAjaxSource})):"function"==typeof l?r.jqXHR=l.call(s,t,e,r):(r.jqXHR=P.ajax(P.extend(u,l)),l.data=i)}function xt(e){e.iDraw++,D(e,!0);var n=e._drawHold;Tt(e,At(e),function(t){e._drawHold=n,It(e,t),e._drawHold=!1})}function At(t){for(var e,n,a,r=t.aoColumns,o=r.length,i=t.oFeatures,l=t.oPreviousSearch,s=t.aoPreSearchCols,u=[],c=I(t),f=t._iDisplayStart,d=!1!==i.bPaginate?t._iDisplayLength:-1,h=function(t,e){u.push({name:t,value:e})},p=(h("sEcho",t.iDraw),h("iColumns",o),h("sColumns",N(r,"sName").join(",")),h("iDisplayStart",f),h("iDisplayLength",d),{draw:t.iDraw,columns:[],order:[],start:f,length:d,search:{value:l.sSearch,regex:l.bRegex}}),g=0;g<o;g++)n=r[g],a=s[g],e="function"==typeof n.mData?"function":n.mData,p.columns.push({data:e,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:a.sSearch,regex:a.bRegex}}),h("mDataProp_"+g,e),i.bFilter&&(h("sSearch_"+g,a.sSearch),h("bRegex_"+g,a.bRegex),h("bSearchable_"+g,n.bSearchable)),i.bSort&&h("bSortable_"+g,n.bSortable);i.bFilter&&(h("sSearch",l.sSearch),h("bRegex",l.bRegex)),i.bSort&&(P.each(c,function(t,e){p.order.push({column:e.col,dir:e.dir}),h("iSortCol_"+t,e.col),h("sSortDir_"+t,e.dir)}),h("iSortingCols",c.length));f=w.ext.legacy.ajax;return null===f?t.sAjaxSource?u:p:f?u:p}function It(t,n){function e(t,e){return n[t]!==H?n[t]:n[e]}var a=Ft(t,n),r=e("sEcho","draw"),o=e("iTotalRecords","recordsTotal"),i=e("iTotalDisplayRecords","recordsFiltered");if(r!==H){if(+r<t.iDraw)return;t.iDraw=+r}a=a||[],pt(t),t._iRecordsTotal=parseInt(o,10),t._iRecordsDisplay=parseInt(i,10);for(var l=0,s=a.length;l<s;l++)x(t,a[l]);t.aiDisplay=t.aiDisplayMaster.slice(),y(t,!0),t._bInitComplete||qt(t,n),D(t,!1)}function Ft(t,e,n){t=P.isPlainObject(t.ajax)&&t.ajax.dataSrc!==H?t.ajax.dataSrc:t.sAjaxDataProp;if(!n)return"data"===t?e.aaData||e[t]:""!==t?A(t)(e):e;b(t)(e,n)}function Lt(n){function e(t){i.f;var e=this.value||"";o.return&&"Enter"!==t.key||e!=o.sSearch&&(Rt(n,{sSearch:e,bRegex:o.bRegex,bSmart:o.bSmart,bCaseInsensitive:o.bCaseInsensitive,return:o.return}),n._iDisplayStart=0,y(n))}var t=n.oClasses,a=n.sTableId,r=n.oLanguage,o=n.oPreviousSearch,i=n.aanFeatures,l='<input type="search" class="'+t.sFilterInput+'"/>',s=(s=r.sSearch).match(/_INPUT_/)?s.replace("_INPUT_",l):s+l,l=P("<div/>",{id:i.f?null:a+"_filter",class:t.sFilter}).append(P("<label/>").append(s)),t=null!==n.searchDelay?n.searchDelay:"ssp"===E(n)?400:0,u=P("input",l).val(o.sSearch).attr("placeholder",r.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",t?ne(e,t):e).on("mouseup.DT",function(t){setTimeout(function(){e.call(u[0],t)},10)}).on("keypress.DT",function(t){if(13==t.keyCode)return!1}).attr("aria-controls",a);return P(n.nTable).on("search.dt.DT",function(t,e){if(n===e)try{u[0]!==v.activeElement&&u.val(o.sSearch)}catch(t){}}),l[0]}function Rt(t,e,n){function a(t){o.sSearch=t.sSearch,o.bRegex=t.bRegex,o.bSmart=t.bSmart,o.bCaseInsensitive=t.bCaseInsensitive,o.return=t.return}function r(t){return t.bEscapeRegex!==H?!t.bEscapeRegex:t.bRegex}var o=t.oPreviousSearch,i=t.aoPreSearchCols;if(lt(t),"ssp"!=E(t)){Ht(t,e.sSearch,n,r(e),e.bSmart,e.bCaseInsensitive),a(e);for(var l=0;l<i.length;l++)jt(t,i[l].sSearch,l,r(i[l]),i[l].bSmart,i[l].bCaseInsensitive);Pt(t)}else a(e);t.bFiltered=!0,R(t,null,"search",[t])}function Pt(t){for(var e,n,a=w.ext.search,r=t.aiDisplay,o=0,i=a.length;o<i;o++){for(var l=[],s=0,u=r.length;s<u;s++)n=r[s],e=t.aoData[n],a[o](t,e._aFilterData,n,e._aData,s)&&l.push(n);r.length=0,P.merge(r,l)}}function jt(t,e,n,a,r,o){if(""!==e){for(var i,l=[],s=t.aiDisplay,u=Nt(e,a,r,o),c=0;c<s.length;c++)i=t.aoData[s[c]]._aFilterData[n],u.test(i)&&l.push(s[c]);t.aiDisplay=l}}function Ht(t,e,n,a,r,o){var i,l,s,u=Nt(e,a,r,o),r=t.oPreviousSearch.sSearch,o=t.aiDisplayMaster,c=[];if(0!==w.ext.search.length&&(n=!0),l=Wt(t),e.length<=0)t.aiDisplay=o.slice();else{for((l||n||a||r.length>e.length||0!==e.indexOf(r)||t.bSorted)&&(t.aiDisplay=o.slice()),i=t.aiDisplay,s=0;s<i.length;s++)u.test(t.aoData[i[s]]._sFilterRow)&&c.push(i[s]);t.aiDisplay=c}}function Nt(t,e,n,a){return t=e?t:Ot(t),n&&(t="^(?=.*?"+P.map(t.match(/["\u201C][^"\u201D]+["\u201D]|[^ ]+/g)||[""],function(t){var e;return'"'===t.charAt(0)?t=(e=t.match(/^"(.*)"$/))?e[1]:t:"“"===t.charAt(0)&&(t=(e=t.match(/^\u201C(.*)\u201D$/))?e[1]:t),t.replace('"',"")}).join(")(?=.*?")+").*$"),new RegExp(t,a?"i":"")}var Ot=w.util.escapeRegex,kt=P("<div>")[0],Mt=kt.textContent!==H;function Wt(t){for(var e,n,a,r,o,i=t.aoColumns,l=!1,s=0,u=t.aoData.length;s<u;s++)if(!(o=t.aoData[s])._aFilterData){for(a=[],e=0,n=i.length;e<n;e++)i[e].bSearchable?"string"!=typeof(r=null===(r=S(t,s,e,"filter"))?"":r)&&r.toString&&(r=r.toString()):r="",r.indexOf&&-1!==r.indexOf("&")&&(kt.innerHTML=r,r=Mt?kt.textContent:kt.innerText),r.replace&&(r=r.replace(/[\r\n\u2028]/g,"")),a.push(r);o._aFilterData=a,o._sFilterRow=a.join(" "),l=!0}return l}function Et(t){return{search:t.sSearch,smart:t.bSmart,regex:t.bRegex,caseInsensitive:t.bCaseInsensitive}}function Bt(t){return{sSearch:t.search,bSmart:t.smart,bRegex:t.regex,bCaseInsensitive:t.caseInsensitive}}function Ut(t){var e=t.sTableId,n=t.aanFeatures.i,a=P("<div/>",{class:t.oClasses.sInfo,id:n?null:e+"_info"});return n||(t.aoDrawCallback.push({fn:Vt,sName:"information"}),a.attr("role","status").attr("aria-live","polite"),P(t.nTable).attr("aria-describedby",e+"_info")),a[0]}function Vt(t){var e,n,a,r,o,i,l=t.aanFeatures.i;0!==l.length&&(i=t.oLanguage,e=t._iDisplayStart+1,n=t.fnDisplayEnd(),a=t.fnRecordsTotal(),o=(r=t.fnRecordsDisplay())?i.sInfo:i.sInfoEmpty,r!==a&&(o+=" "+i.sInfoFiltered),o=Xt(t,o+=i.sInfoPostFix),null!==(i=i.fnInfoCallback)&&(o=i.call(t.oInstance,t,e,n,a,r,o)),P(l).html(o))}function Xt(t,e){var n=t.fnFormatNumber,a=t._iDisplayStart+1,r=t._iDisplayLength,o=t.fnRecordsDisplay(),i=-1===r;return e.replace(/_START_/g,n.call(t,a)).replace(/_END_/g,n.call(t,t.fnDisplayEnd())).replace(/_MAX_/g,n.call(t,t.fnRecordsTotal())).replace(/_TOTAL_/g,n.call(t,o)).replace(/_PAGE_/g,n.call(t,i?1:Math.ceil(a/r))).replace(/_PAGES_/g,n.call(t,i?1:Math.ceil(o/r)))}function Jt(n){var a,t,e,r=n.iInitDisplayStart,o=n.aoColumns,i=n.oFeatures,l=n.bDeferLoading;if(n.bInitialised){for(_t(n),yt(n),Dt(n,n.aoHeader),Dt(n,n.aoFooter),D(n,!0),i.bAutoWidth&&ee(n),a=0,t=o.length;a<t;a++)(e=o[a]).sWidth&&(e.nTh.style.width=M(e.sWidth));R(n,null,"preInit",[n]),u(n);i=E(n);"ssp"==i&&!l||("ajax"==i?Tt(n,[],function(t){var e=Ft(n,t);for(a=0;a<e.length;a++)x(n,e[a]);n.iInitDisplayStart=r,u(n),D(n,!1),qt(n,t)}):(D(n,!1),qt(n)))}else setTimeout(function(){Jt(n)},200)}function qt(t,e){t._bInitComplete=!0,(e||t.oInit.aaData)&&O(t),R(t,null,"plugin-init",[t,e]),R(t,"aoInitComplete","init",[t,e])}function $t(t,e){e=parseInt(e,10);t._iDisplayLength=e,Se(t),R(t,null,"length",[t,e])}function Gt(a){for(var t=a.oClasses,e=a.sTableId,n=a.aLengthMenu,r=Array.isArray(n[0]),o=r?n[0]:n,i=r?n[1]:n,l=P("<select/>",{name:e+"_length","aria-controls":e,class:t.sLengthSelect}),s=0,u=o.length;s<u;s++)l[0][s]=new Option("number"==typeof i[s]?a.fnFormatNumber(i[s]):i[s],o[s]);var c=P("<div><label/></div>").addClass(t.sLength);return a.aanFeatures.l||(c[0].id=e+"_length"),c.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",l[0].outerHTML)),P("select",c).val(a._iDisplayLength).on("change.DT",function(t){$t(a,P(this).val()),y(a)}),P(a.nTable).on("length.dt.DT",function(t,e,n){a===e&&P("select",c).val(n)}),c[0]}function zt(t){function c(t){y(t)}var e=t.sPaginationType,f=w.ext.pager[e],d="function"==typeof f,e=P("<div/>").addClass(t.oClasses.sPaging+e)[0],h=t.aanFeatures;return d||f.fnInit(t,e,c),h.p||(e.id=t.sTableId+"_paginate",t.aoDrawCallback.push({fn:function(t){if(d)for(var e=t._iDisplayStart,n=t._iDisplayLength,a=t.fnRecordsDisplay(),r=-1===n,o=r?0:Math.ceil(e/n),i=r?1:Math.ceil(a/n),l=f(o,i),s=0,u=h.p.length;s<u;s++)ve(t,"pageButton")(t,h.p[s],s,l,o,i);else f.fnUpdate(t,c)},sName:"pagination"})),e}function Yt(t,e,n){var a=t._iDisplayStart,r=t._iDisplayLength,o=t.fnRecordsDisplay(),o=(0===o||-1===r?a=0:"number"==typeof e?o<(a=e*r)&&(a=0):"first"==e?a=0:"previous"==e?(a=0<=r?a-r:0)<0&&(a=0):"next"==e?a+r<o&&(a+=r):"last"==e?a=Math.floor((o-1)/r)*r:W(t,0,"Unknown paging action: "+e,5),t._iDisplayStart!==a);return t._iDisplayStart=a,o?(R(t,null,"page",[t]),n&&y(t)):R(t,null,"page-nc",[t]),o}function Zt(t){return P("<div/>",{id:t.aanFeatures.r?null:t.sTableId+"_processing",class:t.oClasses.sProcessing,role:"status"}).html(t.oLanguage.sProcessing).append("<div><div></div><div></div><div></div><div></div></div>").insertBefore(t.nTable)[0]}function D(t,e){t.oFeatures.bProcessing&&P(t.aanFeatures.r).css("display",e?"block":"none"),R(t,null,"processing",[t,e])}function Kt(t){var e,n,a,r,o,i,l,s,u,c,f,d,h=P(t.nTable),p=t.oScroll;return""===p.sX&&""===p.sY?t.nTable:(e=p.sX,n=p.sY,a=t.oClasses,o=(r=h.children("caption")).length?r[0]._captionSide:null,s=P(h[0].cloneNode(!1)),i=P(h[0].cloneNode(!1)),u=function(t){return t?M(t):null},(l=h.children("tfoot")).length||(l=null),s=P(f="<div/>",{class:a.sScrollWrapper}).append(P(f,{class:a.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollHeadInner}).css({"box-sizing":"content-box",width:p.sXInner||"100%"}).append(s.removeAttr("id").css("margin-left",0).append("top"===o?r:null).append(h.children("thead"))))).append(P(f,{class:a.sScrollBody}).css({position:"relative",overflow:"auto",width:u(e)}).append(h)),l&&s.append(P(f,{class:a.sScrollFoot}).css({overflow:"hidden",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollFootInner}).append(i.removeAttr("id").css("margin-left",0).append("bottom"===o?r:null).append(h.children("tfoot"))))),u=s.children(),c=u[0],f=u[1],d=l?u[2]:null,e&&P(f).on("scroll.DT",function(t){var e=this.scrollLeft;c.scrollLeft=e,l&&(d.scrollLeft=e)}),P(f).css("max-height",n),p.bCollapse||P(f).css("height",n),t.nScrollHead=c,t.nScrollBody=f,t.nScrollFoot=d,t.aoDrawCallback.push({fn:Qt,sName:"scrolling"}),s[0])}function Qt(n){function t(t){(t=t.style).paddingTop="0",t.paddingBottom="0",t.borderTopWidth="0",t.borderBottomWidth="0",t.height=0}var e,a,r,o,i,l=n.oScroll,s=l.sX,u=l.sXInner,c=l.sY,l=l.iBarWidth,f=P(n.nScrollHead),d=f[0].style,h=f.children("div"),p=h[0].style,h=h.children("table"),g=n.nScrollBody,b=P(g),m=g.style,S=P(n.nScrollFoot).children("div"),v=S.children("table"),y=P(n.nTHead),D=P(n.nTable),_=D[0],w=_.style,C=n.nTFoot?P(n.nTFoot):null,T=n.oBrowser,x=T.bScrollOversize,A=(N(n.aoColumns,"nTh"),[]),I=[],F=[],L=[],R=g.scrollHeight>g.clientHeight;n.scrollBarVis!==R&&n.scrollBarVis!==H?(n.scrollBarVis=R,O(n)):(n.scrollBarVis=R,D.children("thead, tfoot").remove(),C&&(R=C.clone().prependTo(D),i=C.find("tr"),a=R.find("tr"),R.find("[id]").removeAttr("id")),R=y.clone().prependTo(D),y=y.find("tr"),e=R.find("tr"),R.find("th, td").removeAttr("tabindex"),R.find("[id]").removeAttr("id"),s||(m.width="100%",f[0].style.width="100%"),P.each(Ct(n,R),function(t,e){r=rt(n,t),e.style.width=n.aoColumns[r].sWidth}),C&&k(function(t){t.style.width=""},a),f=D.outerWidth(),""===s?(w.width="100%",x&&(D.find("tbody").height()>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(D.outerWidth()-l)),f=D.outerWidth()):""!==u&&(w.width=M(u),f=D.outerWidth()),k(t,e),k(function(t){var e=j.getComputedStyle?j.getComputedStyle(t).width:M(P(t).width());F.push(t.innerHTML),A.push(e)},e),k(function(t,e){t.style.width=A[e]},y),P(e).css("height",0),C&&(k(t,a),k(function(t){L.push(t.innerHTML),I.push(M(P(t).css("width")))},a),k(function(t,e){t.style.width=I[e]},i),P(a).height(0)),k(function(t,e){t.innerHTML='<div class="dataTables_sizing">'+F[e]+"</div>",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=A[e]},e),C&&k(function(t,e){t.innerHTML='<div class="dataTables_sizing">'+L[e]+"</div>",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=I[e]},a),Math.round(D.outerWidth())<Math.round(f)?(o=g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y")?f+l:f,x&&(g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(o-l)),""!==s&&""===u||W(n,1,"Possible column misalignment",6)):o="100%",m.width=M(o),d.width=M(o),C&&(n.nScrollFoot.style.width=M(o)),c||x&&(m.height=M(_.offsetHeight+l)),R=D.outerWidth(),h[0].style.width=M(R),p.width=M(R),y=D.height()>g.clientHeight||"scroll"==b.css("overflow-y"),p[i="padding"+(T.bScrollbarLeft?"Left":"Right")]=y?l+"px":"0px",C&&(v[0].style.width=M(R),S[0].style.width=M(R),S[0].style[i]=y?l+"px":"0px"),D.children("colgroup").insertBefore(D.children("thead")),b.trigger("scroll"),!n.bSorted&&!n.bFiltered||n._drawHold||(g.scrollTop=0))}function k(t,e,n){for(var a,r,o=0,i=0,l=e.length;i<l;){for(a=e[i].firstChild,r=n?n[i].firstChild:null;a;)1===a.nodeType&&(n?t(a,r,o):t(a,o),o++),a=a.nextSibling,r=n?r.nextSibling:null;i++}}var te=/<.*?>/g;function ee(t){var e,n,a=t.nTable,r=t.aoColumns,o=t.oScroll,i=o.sY,l=o.sX,o=o.sXInner,s=r.length,u=it(t,"bVisible"),c=P("th",t.nTHead),f=a.getAttribute("width"),d=a.parentNode,h=!1,p=t.oBrowser,g=p.bScrollOversize,b=a.style.width;for(b&&-1!==b.indexOf("%")&&(f=b),D=0;D<u.length;D++)null!==(e=r[u[D]]).sWidth&&(e.sWidth=ae(e.sWidthOrig,d),h=!0);if(g||!h&&!l&&!i&&s==T(t)&&s==c.length)for(D=0;D<s;D++){var m=rt(t,D);null!==m&&(r[m].sWidth=M(c.eq(D).width()))}else{var b=P(a).clone().css("visibility","hidden").removeAttr("id"),S=(b.find("tbody tr").remove(),P("<tr/>").appendTo(b.find("tbody")));for(b.find("thead, tfoot").remove(),b.append(P(t.nTHead).clone()).append(P(t.nTFoot).clone()),b.find("tfoot th, tfoot td").css("width",""),c=Ct(t,b.find("thead")[0]),D=0;D<u.length;D++)e=r[u[D]],c[D].style.width=null!==e.sWidthOrig&&""!==e.sWidthOrig?M(e.sWidthOrig):"",e.sWidthOrig&&l&&P(c[D]).append(P("<div/>").css({width:e.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(t.aoData.length)for(D=0;D<u.length;D++)e=r[n=u[D]],P(re(t,n)).clone(!1).append(e.sContentPadding).appendTo(S);P("[name]",b).removeAttr("name");for(var v=P("<div/>").css(l||i?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(b).appendTo(d),y=(l&&o?b.width(o):l?(b.css("width","auto"),b.removeAttr("width"),b.width()<d.clientWidth&&f&&b.width(d.clientWidth)):i?b.width(d.clientWidth):f&&b.width(f),0),D=0;D<u.length;D++){var _=P(c[D]),w=_.outerWidth()-_.width(),_=p.bBounding?Math.ceil(c[D].getBoundingClientRect().width):_.outerWidth();y+=_,r[u[D]].sWidth=M(_-w)}a.style.width=M(y),v.remove()}f&&(a.style.width=M(f)),!f&&!l||t._reszEvt||(o=function(){P(j).on("resize.DT-"+t.sInstance,ne(function(){O(t)}))},g?setTimeout(o,1e3):o(),t._reszEvt=!0)}var ne=w.util.throttle;function ae(t,e){return t?(e=(t=P("<div/>").css("width",M(t)).appendTo(e||v.body))[0].offsetWidth,t.remove(),e):0}function re(t,e){var n,a=oe(t,e);return a<0?null:(n=t.aoData[a]).nTr?n.anCells[e]:P("<td/>").html(S(t,a,e,"display"))[0]}function oe(t,e){for(var n,a=-1,r=-1,o=0,i=t.aoData.length;o<i;o++)(n=(n=(n=S(t,o,e,"display")+"").replace(te,"")).replace(/ /g," ")).length>a&&(a=n.length,r=o);return r}function M(t){return null===t?"0px":"number"==typeof t?t<0?"0px":t+"px":t.match(/\d$/)?t+"px":t}function I(t){function e(t){t.length&&!Array.isArray(t[0])?h.push(t):P.merge(h,t)}var n,a,r,o,i,l,s,u=[],c=t.aoColumns,f=t.aaSortingFixed,d=P.isPlainObject(f),h=[];for(Array.isArray(f)&&e(f),d&&f.pre&&e(f.pre),e(t.aaSorting),d&&f.post&&e(f.post),n=0;n<h.length;n++)for(r=(o=c[s=h[n][a=0]].aDataSort).length;a<r;a++)l=c[i=o[a]].sType||"string",h[n]._idx===H&&(h[n]._idx=P.inArray(h[n][1],c[i].asSorting)),u.push({src:s,col:i,dir:h[n][1],index:h[n]._idx,type:l,formatter:w.ext.type.order[l+"-pre"]});return u}function ie(t){var e,n,a,r,c,f=[],u=w.ext.type.order,d=t.aoData,o=(t.aoColumns,0),i=t.aiDisplayMaster;for(lt(t),e=0,n=(c=I(t)).length;e<n;e++)(r=c[e]).formatter&&o++,fe(t,r.col);if("ssp"!=E(t)&&0!==c.length){for(e=0,a=i.length;e<a;e++)f[i[e]]=e;o===c.length?i.sort(function(t,e){for(var n,a,r,o,i=c.length,l=d[t]._aSortData,s=d[e]._aSortData,u=0;u<i;u++)if(0!=(r=(n=l[(o=c[u]).col])<(a=s[o.col])?-1:a<n?1:0))return"asc"===o.dir?r:-r;return(n=f[t])<(a=f[e])?-1:a<n?1:0}):i.sort(function(t,e){for(var n,a,r,o=c.length,i=d[t]._aSortData,l=d[e]._aSortData,s=0;s<o;s++)if(n=i[(r=c[s]).col],a=l[r.col],0!==(r=(u[r.type+"-"+r.dir]||u["string-"+r.dir])(n,a)))return r;return(n=f[t])<(a=f[e])?-1:a<n?1:0})}t.bSorted=!0}function le(t){for(var e=t.aoColumns,n=I(t),a=t.oLanguage.oAria,r=0,o=e.length;r<o;r++){var i=e[r],l=i.asSorting,s=i.ariaTitle||i.sTitle.replace(/<.*?>/g,""),u=i.nTh;u.removeAttribute("aria-sort"),i=i.bSortable?s+("asc"===(0<n.length&&n[0].col==r&&(u.setAttribute("aria-sort","asc"==n[0].dir?"ascending":"descending"),l[n[0].index+1])||l[0])?a.sSortAscending:a.sSortDescending):s,u.setAttribute("aria-label",i)}}function se(t,e,n,a){function r(t,e){var n=t._idx;return(n=n===H?P.inArray(t[1],s):n)+1<s.length?n+1:e?null:0}var o,i=t.aoColumns[e],l=t.aaSorting,s=i.asSorting;"number"==typeof l[0]&&(l=t.aaSorting=[l]),n&&t.oFeatures.bSortMulti?-1!==(i=P.inArray(e,N(l,"0")))?null===(o=null===(o=r(l[i],!0))&&1===l.length?0:o)?l.splice(i,1):(l[i][1]=s[o],l[i]._idx=o):(l.push([e,s[0],0]),l[l.length-1]._idx=0):l.length&&l[0][0]==e?(o=r(l[0]),l.length=1,l[0][1]=s[o],l[0]._idx=o):(l.length=0,l.push([e,s[0]]),l[0]._idx=0),u(t),"function"==typeof a&&a(t)}function ue(e,t,n,a){var r=e.aoColumns[n];me(t,{},function(t){!1!==r.bSortable&&(e.oFeatures.bProcessing?(D(e,!0),setTimeout(function(){se(e,n,t.shiftKey,a),"ssp"!==E(e)&&D(e,!1)},0)):se(e,n,t.shiftKey,a))})}function ce(t){var e,n,a,r=t.aLastSort,o=t.oClasses.sSortColumn,i=I(t),l=t.oFeatures;if(l.bSort&&l.bSortClasses){for(e=0,n=r.length;e<n;e++)a=r[e].src,P(N(t.aoData,"anCells",a)).removeClass(o+(e<2?e+1:3));for(e=0,n=i.length;e<n;e++)a=i[e].src,P(N(t.aoData,"anCells",a)).addClass(o+(e<2?e+1:3))}t.aLastSort=i}function fe(t,e){for(var n,a,r,o=t.aoColumns[e],i=w.ext.order[o.sSortDataType],l=(i&&(n=i.call(t.oInstance,t,e,ot(t,e))),w.ext.type.order[o.sType+"-pre"]),s=0,u=t.aoData.length;s<u;s++)(a=t.aoData[s])._aSortData||(a._aSortData=[]),a._aSortData[e]&&!i||(r=i?n[s]:S(t,s,e,"sort"),a._aSortData[e]=l?l(r):r)}function de(n){var t;n._bLoadingState||(t={time:+new Date,start:n._iDisplayStart,length:n._iDisplayLength,order:P.extend(!0,[],n.aaSorting),search:Et(n.oPreviousSearch),columns:P.map(n.aoColumns,function(t,e){return{visible:t.bVisible,search:Et(n.aoPreSearchCols[e])}})},n.oSavedState=t,R(n,"aoStateSaveParams","stateSaveParams",[n,t]),n.oFeatures.bStateSave&&!n.bDestroying&&n.fnStateSaveCallback.call(n.oInstance,n,t))}function he(e,t,n){var a;if(e.oFeatures.bStateSave)return(a=e.fnStateLoadCallback.call(e.oInstance,e,function(t){pe(e,t,n)}))!==H&&pe(e,a,n),!0;n()}function pe(n,t,e){var a,r,o=n.aoColumns,i=(n._bLoadingState=!0,n._bInitComplete?new w.Api(n):null);if(t&&t.time){var l=R(n,"aoStateLoadParams","stateLoadParams",[n,t]);if(-1!==P.inArray(!1,l))n._bLoadingState=!1;else{l=n.iStateDuration;if(0<l&&t.time<+new Date-1e3*l)n._bLoadingState=!1;else if(t.columns&&o.length!==t.columns.length)n._bLoadingState=!1;else{if(n.oLoadedState=P.extend(!0,{},t),t.length!==H&&(i?i.page.len(t.length):n._iDisplayLength=t.length),t.start!==H&&(null===i?(n._iDisplayStart=t.start,n.iInitDisplayStart=t.start):Yt(n,t.start/n._iDisplayLength)),t.order!==H&&(n.aaSorting=[],P.each(t.order,function(t,e){n.aaSorting.push(e[0]>=o.length?[0,e[1]]:e)})),t.search!==H&&P.extend(n.oPreviousSearch,Bt(t.search)),t.columns){for(a=0,r=t.columns.length;a<r;a++){var s=t.columns[a];s.visible!==H&&(i?i.column(a).visible(s.visible,!1):o[a].bVisible=s.visible),s.search!==H&&P.extend(n.aoPreSearchCols[a],Bt(s.search))}i&&i.columns.adjust()}n._bLoadingState=!1,R(n,"aoStateLoaded","stateLoaded",[n,t])}}}else n._bLoadingState=!1;e()}function ge(t){var e=w.settings,t=P.inArray(t,N(e,"nTable"));return-1!==t?e[t]:null}function W(t,e,n,a){if(n="DataTables warning: "+(t?"table id="+t.sTableId+" - ":"")+n,a&&(n+=". For more information about this error, please see http://datatables.net/tn/"+a),e)j.console&&console.log&&console.log(n);else{e=w.ext,e=e.sErrMode||e.errMode;if(t&&R(t,null,"error",[t,a,n]),"alert"==e)alert(n);else{if("throw"==e)throw new Error(n);"function"==typeof e&&e(t,a,n)}}}function F(n,a,t,e){Array.isArray(t)?P.each(t,function(t,e){Array.isArray(e)?F(n,a,e[0],e[1]):F(n,a,e)}):(e===H&&(e=t),a[t]!==H&&(n[e]=a[t]))}function be(t,e,n){var a,r;for(r in e)e.hasOwnProperty(r)&&(a=e[r],P.isPlainObject(a)?(P.isPlainObject(t[r])||(t[r]={}),P.extend(!0,t[r],a)):n&&"data"!==r&&"aaData"!==r&&Array.isArray(a)?t[r]=a.slice():t[r]=a);return t}function me(e,t,n){P(e).on("click.DT",t,function(t){P(e).trigger("blur"),n(t)}).on("keypress.DT",t,function(t){13===t.which&&(t.preventDefault(),n(t))}).on("selectstart.DT",function(){return!1})}function L(t,e,n,a){n&&t[e].push({fn:n,sName:a})}function R(n,t,e,a){var r=[];return t&&(r=P.map(n[t].slice().reverse(),function(t,e){return t.fn.apply(n.oInstance,a)})),null!==e&&(t=P.Event(e+".dt"),(e=P(n.nTable)).trigger(t,a),0===e.parents("body").length&&P("body").trigger(t,a),r.push(t.result)),r}function Se(t){var e=t._iDisplayStart,n=t.fnDisplayEnd(),a=t._iDisplayLength;n<=e&&(e=n-a),e-=e%a,t._iDisplayStart=e=-1===a||e<0?0:e}function ve(t,e){var t=t.renderer,n=w.ext.renderer[e];return P.isPlainObject(t)&&t[e]?n[t[e]]||n._:"string"==typeof t&&n[t]||n._}function E(t){return t.oFeatures.bServerSide?"ssp":t.ajax||t.sAjaxSource?"ajax":"dom"}function ye(t,n){var a;return Array.isArray(t)?P.map(t,function(t){return ye(t,n)}):"number"==typeof t?[n[t]]:(a=P.map(n,function(t,e){return t.nTable}),P(a).filter(t).map(function(t){var e=P.inArray(this,a);return n[e]}).toArray())}function De(r,o,t){var e,n;t&&(e=new B(r)).one("draw",function(){t(e.ajax.json())}),"ssp"==E(r)?u(r,o):(D(r,!0),(n=r.jqXHR)&&4!==n.readyState&&n.abort(),Tt(r,[],function(t){pt(r);for(var e=Ft(r,t),n=0,a=e.length;n<a;n++)x(r,e[n]);u(r,o),D(r,!1)}))}function _e(t,e,n,a,r){for(var o,i,l,s,u=[],c=typeof e,f=0,d=(e=e&&"string"!=c&&"function"!=c&&e.length!==H?e:[e]).length;f<d;f++)for(l=0,s=(i=e[f]&&e[f].split&&!e[f].match(/[\[\(:]/)?e[f].split(","):[e[f]]).length;l<s;l++)(o=n("string"==typeof i[l]?i[l].trim():i[l]))&&o.length&&(u=u.concat(o));var h=p.selector[t];if(h.length)for(f=0,d=h.length;f<d;f++)u=h[f](a,r,u);return z(u)}function we(t){return(t=t||{}).filter&&t.search===H&&(t.search=t.filter),P.extend({search:"none",order:"current",page:"all"},t)}function Ce(t){for(var e=0,n=t.length;e<n;e++)if(0<t[e].length)return t[0]=t[e],t[0].length=1,t.length=1,t.context=[t.context[e]],t;return t.length=0,t}function Te(o,t,e,n){function i(t,e){var n;if(Array.isArray(t)||t instanceof P)for(var a=0,r=t.length;a<r;a++)i(t[a],e);else t.nodeName&&"tr"===t.nodeName.toLowerCase()?l.push(t):(n=P("<tr><td></td></tr>").addClass(e),P("td",n).addClass(e).html(t)[0].colSpan=T(o),l.push(n[0]))}var l=[];i(e,n),t._details&&t._details.detach(),t._details=P(l),t._detailsShow&&t._details.insertAfter(t.nTr)}function xe(t,e){var n=t.context;if(n.length&&t.length){var a=n[0].aoData[t[0]];if(a._details){(a._detailsShow=e)?(a._details.insertAfter(a.nTr),P(a.nTr).addClass("dt-hasChild")):(a._details.detach(),P(a.nTr).removeClass("dt-hasChild")),R(n[0],null,"childRow",[e,t.row(t[0])]);var s=n[0],r=new B(s),a=".dt.DT_details",e="draw"+a,t="column-sizing"+a,a="destroy"+a,u=s.aoData;if(r.off(e+" "+t+" "+a),N(u,"_details").length>0){r.on(e,function(t,e){if(s!==e)return;r.rows({page:"current"}).eq(0).each(function(t){var e=u[t];if(e._detailsShow)e._details.insertAfter(e.nTr)})});r.on(t,function(t,e,n,a){if(s!==e)return;var r,o=T(e);for(var i=0,l=u.length;i<l;i++){r=u[i];if(r._details)r._details.children("td[colspan]").attr("colspan",o)}});r.on(a,function(t,e){if(s!==e)return;for(var n=0,a=u.length;n<a;n++)if(u[n]._details)Re(r,n)})}Le(n)}}}function Ae(t,e,n,a,r){for(var o=[],i=0,l=r.length;i<l;i++)o.push(S(t,r[i],e));return o}var Ie=[],o=Array.prototype,B=function(t,e){if(!(this instanceof B))return new B(t,e);function n(t){var e,n,a,r;t=t,a=w.settings,r=P.map(a,function(t,e){return t.nTable}),(t=t?t.nTable&&t.oApi?[t]:t.nodeName&&"table"===t.nodeName.toLowerCase()?-1!==(e=P.inArray(t,r))?[a[e]]:null:t&&"function"==typeof t.settings?t.settings().toArray():("string"==typeof t?n=P(t):t instanceof P&&(n=t),n?n.map(function(t){return-1!==(e=P.inArray(this,r))?a[e]:null}).toArray():void 0):[])&&o.push.apply(o,t)}var o=[];if(Array.isArray(t))for(var a=0,r=t.length;a<r;a++)n(t[a]);else n(t);this.context=z(o),e&&P.merge(this,e),this.selector={rows:null,cols:null,opts:null},B.extend(this,this,Ie)},Fe=(w.Api=B,P.extend(B.prototype,{any:function(){return 0!==this.count()},concat:o.concat,context:[],count:function(){return this.flatten().length},each:function(t){for(var e=0,n=this.length;e<n;e++)t.call(this,this[e],e,this);return this},eq:function(t){var e=this.context;return e.length>t?new B(e[t],this[t]):null},filter:function(t){var e=[];if(o.filter)e=o.filter.call(this,t,this);else for(var n=0,a=this.length;n<a;n++)t.call(this,this[n],n,this)&&e.push(this[n]);return new B(this.context,e)},flatten:function(){var t=[];return new B(this.context,t.concat.apply(t,this.toArray()))},join:o.join,indexOf:o.indexOf||function(t,e){for(var n=e||0,a=this.length;n<a;n++)if(this[n]===t)return n;return-1},iterator:function(t,e,n,a){var r,o,i,l,s,u,c,f,d=[],h=this.context,p=this.selector;for("string"==typeof t&&(a=n,n=e,e=t,t=!1),o=0,i=h.length;o<i;o++){var g=new B(h[o]);if("table"===e)(r=n.call(g,h[o],o))!==H&&d.push(r);else if("columns"===e||"rows"===e)(r=n.call(g,h[o],this[o],o))!==H&&d.push(r);else if("column"===e||"column-rows"===e||"row"===e||"cell"===e)for(c=this[o],"column-rows"===e&&(u=Fe(h[o],p.opts)),l=0,s=c.length;l<s;l++)f=c[l],(r="cell"===e?n.call(g,h[o],f.row,f.column,o,l):n.call(g,h[o],f,o,l,u))!==H&&d.push(r)}return d.length||a?((t=(a=new B(h,t?d.concat.apply([],d):d)).selector).rows=p.rows,t.cols=p.cols,t.opts=p.opts,a):this},lastIndexOf:o.lastIndexOf||function(t,e){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(t){var e=[];if(o.map)e=o.map.call(this,t,this);else for(var n=0,a=this.length;n<a;n++)e.push(t.call(this,this[n],n));return new B(this.context,e)},pluck:function(t){var e=w.util.get(t);return this.map(function(t){return e(t)})},pop:o.pop,push:o.push,reduce:o.reduce||function(t,e){return et(this,t,e,0,this.length,1)},reduceRight:o.reduceRight||function(t,e){return et(this,t,e,this.length-1,-1,-1)},reverse:o.reverse,selector:null,shift:o.shift,slice:function(){return new B(this.context,this)},sort:o.sort,splice:o.splice,toArray:function(){return o.slice.call(this)},to$:function(){return P(this)},toJQuery:function(){return P(this)},unique:function(){return new B(this.context,z(this))},unshift:o.unshift}),B.extend=function(t,e,n){if(n.length&&e&&(e instanceof B||e.__dt_wrapper))for(var a,r=0,o=n.length;r<o;r++)e[(a=n[r]).name]="function"===a.type?function(e,n,a){return function(){var t=n.apply(e,arguments);return B.extend(t,t,a.methodExt),t}}(t,a.val,a):"object"===a.type?{}:a.val,e[a.name].__dt_wrapper=!0,B.extend(t,e[a.name],a.propExt)},B.register=e=function(t,e){if(Array.isArray(t))for(var n=0,a=t.length;n<a;n++)B.register(t[n],e);else for(var r=t.split("."),o=Ie,i=0,l=r.length;i<l;i++){var s,u,c=function(t,e){for(var n=0,a=t.length;n<a;n++)if(t[n].name===e)return t[n];return null}(o,u=(s=-1!==r[i].indexOf("()"))?r[i].replace("()",""):r[i]);c||o.push(c={name:u,val:{},methodExt:[],propExt:[],type:"object"}),i===l-1?(c.val=e,c.type="function"==typeof e?"function":P.isPlainObject(e)?"object":"other"):o=s?c.methodExt:c.propExt}},B.registerPlural=t=function(t,e,n){B.register(t,n),B.register(e,function(){var t=n.apply(this,arguments);return t===this?this:t instanceof B?t.length?Array.isArray(t[0])?new B(t.context,t[0]):t[0]:H:t})},e("tables()",function(t){return t!==H&&null!==t?new B(ye(t,this.context)):this}),e("table()",function(t){var t=this.tables(t),e=t.context;return e.length?new B(e[0]):t}),t("tables().nodes()","table().node()",function(){return this.iterator("table",function(t){return t.nTable},1)}),t("tables().body()","table().body()",function(){return this.iterator("table",function(t){return t.nTBody},1)}),t("tables().header()","table().header()",function(){return this.iterator("table",function(t){return t.nTHead},1)}),t("tables().footer()","table().footer()",function(){return this.iterator("table",function(t){return t.nTFoot},1)}),t("tables().containers()","table().container()",function(){return this.iterator("table",function(t){return t.nTableWrapper},1)}),e("draw()",function(e){return this.iterator("table",function(t){"page"===e?y(t):u(t,!1===(e="string"==typeof e?"full-hold"!==e:e))})}),e("page()",function(e){return e===H?this.page.info().page:this.iterator("table",function(t){Yt(t,e)})}),e("page.info()",function(t){var e,n,a,r,o;return 0===this.context.length?H:(n=(e=this.context[0])._iDisplayStart,a=e.oFeatures.bPaginate?e._iDisplayLength:-1,r=e.fnRecordsDisplay(),{page:(o=-1===a)?0:Math.floor(n/a),pages:o?1:Math.ceil(r/a),start:n,end:e.fnDisplayEnd(),length:a,recordsTotal:e.fnRecordsTotal(),recordsDisplay:r,serverSide:"ssp"===E(e)})}),e("page.len()",function(e){return e===H?0!==this.context.length?this.context[0]._iDisplayLength:H:this.iterator("table",function(t){$t(t,e)})}),e("ajax.json()",function(){var t=this.context;if(0<t.length)return t[0].json}),e("ajax.params()",function(){var t=this.context;if(0<t.length)return t[0].oAjaxData}),e("ajax.reload()",function(e,n){return this.iterator("table",function(t){De(t,!1===n,e)})}),e("ajax.url()",function(e){var t=this.context;return e===H?0===t.length?H:(t=t[0]).ajax?P.isPlainObject(t.ajax)?t.ajax.url:t.ajax:t.sAjaxSource:this.iterator("table",function(t){P.isPlainObject(t.ajax)?t.ajax.url=e:t.ajax=e})}),e("ajax.url().load()",function(e,n){return this.iterator("table",function(t){De(t,!1===n,e)})}),function(t,e){var n,a=[],r=t.aiDisplay,o=t.aiDisplayMaster,i=e.search,l=e.order,e=e.page;if("ssp"==E(t))return"removed"===i?[]:f(0,o.length);if("current"==e)for(u=t._iDisplayStart,c=t.fnDisplayEnd();u<c;u++)a.push(r[u]);else if("current"==l||"applied"==l){if("none"==i)a=o.slice();else if("applied"==i)a=r.slice();else if("removed"==i){for(var s={},u=0,c=r.length;u<c;u++)s[r[u]]=null;a=P.map(o,function(t){return s.hasOwnProperty(t)?null:t})}}else if("index"==l||"original"==l)for(u=0,c=t.aoData.length;u<c;u++)("none"==i||-1===(n=P.inArray(u,r))&&"removed"==i||0<=n&&"applied"==i)&&a.push(u);return a}),Le=(e("rows()",function(e,n){e===H?e="":P.isPlainObject(e)&&(n=e,e=""),n=we(n);var t=this.iterator("table",function(t){return _e("row",e,function(n){var t=d(n),a=r.aoData;if(null!==t&&!o)return[t];if(i=i||Fe(r,o),null!==t&&-1!==P.inArray(t,i))return[t];if(null===n||n===H||""===n)return i;if("function"==typeof n)return P.map(i,function(t){var e=a[t];return n(t,e._aData,e.nTr)?t:null});if(n.nodeName)return t=n._DT_RowIndex,e=n._DT_CellIndex,t!==H?a[t]&&a[t].nTr===n?[t]:[]:e?a[e.row]&&a[e.row].nTr===n.parentNode?[e.row]:[]:(t=P(n).closest("*[data-dt-row]")).length?[t.data("dt-row")]:[];if("string"==typeof n&&"#"===n.charAt(0)){var e=r.aIds[n.replace(/^#/,"")];if(e!==H)return[e.idx]}t=_(m(r.aoData,i,"nTr"));return P(t).filter(n).map(function(){return this._DT_RowIndex}).toArray()},r=t,o=n);var r,o,i},1);return t.selector.rows=e,t.selector.opts=n,t}),e("rows().nodes()",function(){return this.iterator("row",function(t,e){return t.aoData[e].nTr||H},1)}),e("rows().data()",function(){return this.iterator(!0,"rows",function(t,e){return m(t.aoData,e,"_aData")},1)}),t("rows().cache()","row().cache()",function(n){return this.iterator("row",function(t,e){t=t.aoData[e];return"search"===n?t._aFilterData:t._aSortData},1)}),t("rows().invalidate()","row().invalidate()",function(n){return this.iterator("row",function(t,e){bt(t,e,n)})}),t("rows().indexes()","row().index()",function(){return this.iterator("row",function(t,e){return e},1)}),t("rows().ids()","row().id()",function(t){for(var e=[],n=this.context,a=0,r=n.length;a<r;a++)for(var o=0,i=this[a].length;o<i;o++){var l=n[a].rowIdFn(n[a].aoData[this[a][o]]._aData);e.push((!0===t?"#":"")+l)}return new B(n,e)}),t("rows().remove()","row().remove()",function(){var f=this;return this.iterator("row",function(t,e,n){var a,r,o,i,l,s,u=t.aoData,c=u[e];for(u.splice(e,1),a=0,r=u.length;a<r;a++)if(s=(l=u[a]).anCells,null!==l.nTr&&(l.nTr._DT_RowIndex=a),null!==s)for(o=0,i=s.length;o<i;o++)s[o]._DT_CellIndex.row=a;gt(t.aiDisplayMaster,e),gt(t.aiDisplay,e),gt(f[n],e,!1),0<t._iRecordsDisplay&&t._iRecordsDisplay--,Se(t);n=t.rowIdFn(c._aData);n!==H&&delete t.aIds[n]}),this.iterator("table",function(t){for(var e=0,n=t.aoData.length;e<n;e++)t.aoData[e].idx=e}),this}),e("rows.add()",function(o){var t=this.iterator("table",function(t){for(var e,n=[],a=0,r=o.length;a<r;a++)(e=o[a]).nodeName&&"TR"===e.nodeName.toUpperCase()?n.push(ut(t,e)[0]):n.push(x(t,e));return n},1),e=this.rows(-1);return e.pop(),P.merge(e,t),e}),e("row()",function(t,e){return Ce(this.rows(t,e))}),e("row().data()",function(t){var e,n=this.context;return t===H?n.length&&this.length?n[0].aoData[this[0]]._aData:H:((e=n[0].aoData[this[0]])._aData=t,Array.isArray(t)&&e.nTr&&e.nTr.id&&b(n[0].rowId)(t,e.nTr.id),bt(n[0],this[0],"data"),this)}),e("row().node()",function(){var t=this.context;return t.length&&this.length&&t[0].aoData[this[0]].nTr||null}),e("row.add()",function(e){e instanceof P&&e.length&&(e=e[0]);var t=this.iterator("table",function(t){return e.nodeName&&"TR"===e.nodeName.toUpperCase()?ut(t,e)[0]:x(t,e)});return this.row(t[0])}),P(v).on("plugin-init.dt",function(t,e){var n=new B(e),a="on-plugin-init",r="stateSaveParams."+a,o="destroy. "+a,a=(n.on(r,function(t,e,n){for(var a=e.rowIdFn,r=e.aoData,o=[],i=0;i<r.length;i++)r[i]._detailsShow&&o.push("#"+a(r[i]._aData));n.childRows=o}),n.on(o,function(){n.off(r+" "+o)}),n.state.loaded());a&&a.childRows&&n.rows(P.map(a.childRows,function(t){return t.replace(/:/g,"\\:")})).every(function(){R(e,null,"requestChild",[this])})}),w.util.throttle(function(t){de(t[0])},500)),Re=function(t,e){var n=t.context;n.length&&(e=n[0].aoData[e!==H?e:t[0]])&&e._details&&(e._details.remove(),e._detailsShow=H,e._details=H,P(e.nTr).removeClass("dt-hasChild"),Le(n))},Pe="row().child",je=Pe+"()",He=(e(je,function(t,e){var n=this.context;return t===H?n.length&&this.length?n[0].aoData[this[0]]._details:H:(!0===t?this.child.show():!1===t?Re(this):n.length&&this.length&&Te(n[0],n[0].aoData[this[0]],t,e),this)}),e([Pe+".show()",je+".show()"],function(t){return xe(this,!0),this}),e([Pe+".hide()",je+".hide()"],function(){return xe(this,!1),this}),e([Pe+".remove()",je+".remove()"],function(){return Re(this),this}),e(Pe+".isShown()",function(){var t=this.context;return t.length&&this.length&&t[0].aoData[this[0]]._detailsShow||!1}),/^([^:]+):(name|visIdx|visible)$/),Ne=(e("columns()",function(n,a){n===H?n="":P.isPlainObject(n)&&(a=n,n=""),a=we(a);var t=this.iterator("table",function(t){return e=n,l=a,s=(i=t).aoColumns,u=N(s,"sName"),c=N(s,"nTh"),_e("column",e,function(n){var a,t=d(n);if(""===n)return f(s.length);if(null!==t)return[0<=t?t:s.length+t];if("function"==typeof n)return a=Fe(i,l),P.map(s,function(t,e){return n(e,Ae(i,e,0,0,a),c[e])?e:null});var r="string"==typeof n?n.match(He):"";if(r)switch(r[2]){case"visIdx":case"visible":var e,o=parseInt(r[1],10);return o<0?[(e=P.map(s,function(t,e){return t.bVisible?e:null}))[e.length+o]]:[rt(i,o)];case"name":return P.map(u,function(t,e){return t===r[1]?e:null});default:return[]}return n.nodeName&&n._DT_CellIndex?[n._DT_CellIndex.column]:(t=P(c).filter(n).map(function(){return P.inArray(this,c)}).toArray()).length||!n.nodeName?t:(t=P(n).closest("*[data-dt-column]")).length?[t.data("dt-column")]:[]},i,l);var i,e,l,s,u,c},1);return t.selector.cols=n,t.selector.opts=a,t}),t("columns().header()","column().header()",function(t,e){return this.iterator("column",function(t,e){return t.aoColumns[e].nTh},1)}),t("columns().footer()","column().footer()",function(t,e){return this.iterator("column",function(t,e){return t.aoColumns[e].nTf},1)}),t("columns().data()","column().data()",function(){return this.iterator("column-rows",Ae,1)}),t("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(t,e){return t.aoColumns[e].mData},1)}),t("columns().cache()","column().cache()",function(o){return this.iterator("column-rows",function(t,e,n,a,r){return m(t.aoData,r,"search"===o?"_aFilterData":"_aSortData",e)},1)}),t("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(t,e,n,a,r){return m(t.aoData,r,"anCells",e)},1)}),t("columns().visible()","column().visible()",function(f,n){var e=this,t=this.iterator("column",function(t,e){if(f===H)return t.aoColumns[e].bVisible;var n,a,r=e,e=f,o=t.aoColumns,i=o[r],l=t.aoData;if(e===H)i.bVisible;else if(i.bVisible!==e){if(e)for(var s=P.inArray(!0,N(o,"bVisible"),r+1),u=0,c=l.length;u<c;u++)a=l[u].nTr,n=l[u].anCells,a&&a.insertBefore(n[r],n[s]||null);else P(N(t.aoData,"anCells",r)).detach();i.bVisible=e}});return f!==H&&this.iterator("table",function(t){Dt(t,t.aoHeader),Dt(t,t.aoFooter),t.aiDisplay.length||P(t.nTBody).find("td[colspan]").attr("colspan",T(t)),de(t),e.iterator("column",function(t,e){R(t,null,"column-visibility",[t,e,f,n])}),n!==H&&!n||e.columns.adjust()}),t}),t("columns().indexes()","column().index()",function(n){return this.iterator("column",function(t,e){return"visible"===n?ot(t,e):e},1)}),e("columns.adjust()",function(){return this.iterator("table",function(t){O(t)},1)}),e("column.index()",function(t,e){var n;if(0!==this.context.length)return n=this.context[0],"fromVisible"===t||"toData"===t?rt(n,e):"fromData"===t||"toVisible"===t?ot(n,e):void 0}),e("column()",function(t,e){return Ce(this.columns(t,e))}),e("cells()",function(g,t,b){var a,r,o,i,l,s,e;return P.isPlainObject(g)&&(g.row===H?(b=g,g=null):(b=t,t=null)),P.isPlainObject(t)&&(b=t,t=null),null===t||t===H?this.iterator("table",function(t){return a=t,t=g,e=we(b),f=a.aoData,d=Fe(a,e),n=_(m(f,d,"anCells")),h=P(Y([],n)),p=a.aoColumns.length,_e("cell",t,function(t){var e,n="function"==typeof t;if(null===t||t===H||n){for(o=[],i=0,l=d.length;i<l;i++)for(r=d[i],s=0;s<p;s++)u={row:r,column:s},(!n||(c=f[r],t(u,S(a,r,s),c.anCells?c.anCells[s]:null)))&&o.push(u);return o}return P.isPlainObject(t)?t.column!==H&&t.row!==H&&-1!==P.inArray(t.row,d)?[t]:[]:(e=h.filter(t).map(function(t,e){return{row:e._DT_CellIndex.row,column:e._DT_CellIndex.column}}).toArray()).length||!t.nodeName?e:(c=P(t).closest("*[data-dt-row]")).length?[{row:c.data("dt-row"),column:c.data("dt-column")}]:[]},a,e);var a,e,r,o,i,l,s,u,c,f,d,n,h,p}):(e=b?{page:b.page,order:b.order,search:b.search}:{},a=this.columns(t,e),r=this.rows(g,e),e=this.iterator("table",function(t,e){var n=[];for(o=0,i=r[e].length;o<i;o++)for(l=0,s=a[e].length;l<s;l++)n.push({row:r[e][o],column:a[e][l]});return n},1),e=b&&b.selected?this.cells(e,b):e,P.extend(e.selector,{cols:t,rows:g,opts:b}),e)}),t("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(t,e,n){t=t.aoData[e];return t&&t.anCells?t.anCells[n]:H},1)}),e("cells().data()",function(){return this.iterator("cell",function(t,e,n){return S(t,e,n)},1)}),t("cells().cache()","cell().cache()",function(a){return a="search"===a?"_aFilterData":"_aSortData",this.iterator("cell",function(t,e,n){return t.aoData[e][a][n]},1)}),t("cells().render()","cell().render()",function(a){return this.iterator("cell",function(t,e,n){return S(t,e,n,a)},1)}),t("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(t,e,n){return{row:e,column:n,columnVisible:ot(t,n)}},1)}),t("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(t,e,n){bt(t,e,a,n)})}),e("cell()",function(t,e,n){return Ce(this.cells(t,e,n))}),e("cell().data()",function(t){var e=this.context,n=this[0];return t===H?e.length&&n.length?S(e[0],n[0].row,n[0].column):H:(ct(e[0],n[0].row,n[0].column,t),bt(e[0],n[0].row,"data",n[0].column),this)}),e("order()",function(e,t){var n=this.context;return e===H?0!==n.length?n[0].aaSorting:H:("number"==typeof e?e=[[e,t]]:e.length&&!Array.isArray(e[0])&&(e=Array.prototype.slice.call(arguments)),this.iterator("table",function(t){t.aaSorting=e.slice()}))}),e("order.listener()",function(e,n,a){return this.iterator("table",function(t){ue(t,e,n,a)})}),e("order.fixed()",function(e){var t;return e?this.iterator("table",function(t){t.aaSortingFixed=P.extend(!0,{},e)}):(t=(t=this.context).length?t[0].aaSortingFixed:H,Array.isArray(t)?{pre:t}:t)}),e(["columns().order()","column().order()"],function(a){var r=this;return this.iterator("table",function(t,e){var n=[];P.each(r[e],function(t,e){n.push([e,a])}),t.aaSorting=n})}),e("search()",function(e,n,a,r){var t=this.context;return e===H?0!==t.length?t[0].oPreviousSearch.sSearch:H:this.iterator("table",function(t){t.oFeatures.bFilter&&Rt(t,P.extend({},t.oPreviousSearch,{sSearch:e+"",bRegex:null!==n&&n,bSmart:null===a||a,bCaseInsensitive:null===r||r}),1)})}),t("columns().search()","column().search()",function(a,r,o,i){return this.iterator("column",function(t,e){var n=t.aoPreSearchCols;if(a===H)return n[e].sSearch;t.oFeatures.bFilter&&(P.extend(n[e],{sSearch:a+"",bRegex:null!==r&&r,bSmart:null===o||o,bCaseInsensitive:null===i||i}),Rt(t,t.oPreviousSearch,1))})}),e("state()",function(){return this.context.length?this.context[0].oSavedState:null}),e("state.clear()",function(){return this.iterator("table",function(t){t.fnStateSaveCallback.call(t.oInstance,t,{})})}),e("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null}),e("state.save()",function(){return this.iterator("table",function(t){de(t)})}),w.use=function(t,e){"lib"===e||t.fn?P=t:"win"==e||t.document?v=(j=t).document:"datetime"!==e&&"DateTime"!==t.type||(w.DateTime=t)},w.factory=function(t,e){var n=!1;return t&&t.document&&(v=(j=t).document),e&&e.fn&&e.fn.jquery&&(P=e,n=!0),n},w.versionCheck=w.fnVersionCheck=function(t){for(var e,n,a=w.version.split("."),r=t.split("."),o=0,i=r.length;o<i;o++)if((e=parseInt(a[o],10)||0)!==(n=parseInt(r[o],10)||0))return n<e;return!0},w.isDataTable=w.fnIsDataTable=function(t){var r=P(t).get(0),o=!1;return t instanceof w.Api||(P.each(w.settings,function(t,e){var n=e.nScrollHead?P("table",e.nScrollHead)[0]:null,a=e.nScrollFoot?P("table",e.nScrollFoot)[0]:null;e.nTable!==r&&n!==r&&a!==r||(o=!0)}),o)},w.tables=w.fnTables=function(e){var t=!1,n=(P.isPlainObject(e)&&(t=e.api,e=e.visible),P.map(w.settings,function(t){if(!e||P(t.nTable).is(":visible"))return t.nTable}));return t?new B(n):n},w.camelToHungarian=C,e("$()",function(t,e){e=this.rows(e).nodes(),e=P(e);return P([].concat(e.filter(t).toArray(),e.find(t).toArray()))}),P.each(["on","one","off"],function(t,n){e(n+"()",function(){var t=Array.prototype.slice.call(arguments),e=(t[0]=P.map(t[0].split(/\s/),function(t){return t.match(/\.dt\b/)?t:t+".dt"}).join(" "),P(this.tables().nodes()));return e[n].apply(e,t),this})}),e("clear()",function(){return this.iterator("table",function(t){pt(t)})}),e("settings()",function(){return new B(this.context,this.context)}),e("init()",function(){var t=this.context;return t.length?t[0].oInit:null}),e("data()",function(){return this.iterator("table",function(t){return N(t.aoData,"_aData")}).flatten()}),e("destroy()",function(c){return c=c||!1,this.iterator("table",function(e){var n,t=e.oClasses,a=e.nTable,r=e.nTBody,o=e.nTHead,i=e.nTFoot,l=P(a),r=P(r),s=P(e.nTableWrapper),u=P.map(e.aoData,function(t){return t.nTr}),i=(e.bDestroying=!0,R(e,"aoDestroyCallback","destroy",[e]),c||new B(e).columns().visible(!0),s.off(".DT").find(":not(tbody *)").off(".DT"),P(j).off(".DT-"+e.sInstance),a!=o.parentNode&&(l.children("thead").detach(),l.append(o)),i&&a!=i.parentNode&&(l.children("tfoot").detach(),l.append(i)),e.aaSorting=[],e.aaSortingFixed=[],ce(e),P(u).removeClass(e.asStripeClasses.join(" ")),P("th, td",o).removeClass(t.sSortable+" "+t.sSortableAsc+" "+t.sSortableDesc+" "+t.sSortableNone),r.children().detach(),r.append(u),e.nTableWrapper.parentNode),o=c?"remove":"detach",u=(l[o](),s[o](),!c&&i&&(i.insertBefore(a,e.nTableReinsertBefore),l.css("width",e.sDestroyWidth).removeClass(t.sTable),n=e.asDestroyStripes.length)&&r.children().each(function(t){P(this).addClass(e.asDestroyStripes[t%n])}),P.inArray(e,w.settings));-1!==u&&w.settings.splice(u,1)})}),P.each(["column","row","cell"],function(t,s){e(s+"s().every()",function(o){var i=this.selector.opts,l=this;return this.iterator(s,function(t,e,n,a,r){o.call(l[s](e,"cell"===s?n:i,"cell"===s?i:H),e,n,a,r)})})}),e("i18n()",function(t,e,n){var a=this.context[0],t=A(t)(a.oLanguage);return t===H&&(t=e),"string"==typeof(t=n!==H&&P.isPlainObject(t)?t[n]!==H?t[n]:t._:t)?t.replace("%d",n):t}),w.version="1.13.6",w.settings=[],w.models={},w.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0,return:!1},w.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1},w.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null},w.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(t){try{return JSON.parse((-1===t.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+t.sInstance+"_"+location.pathname))}catch(t){return{}}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(t,e){try{(-1===t.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+t.sInstance+"_"+location.pathname,JSON.stringify(e))}catch(t){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:P.extend({},w.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"},i(w.defaults),w.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null},i(w.defaults.column),w.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,jqXHR:null,json:H,oAjaxData:H,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==E(this)?+this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==E(this)?+this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var t=this._iDisplayLength,e=this._iDisplayStart,n=e+t,a=this.aiDisplay.length,r=this.oFeatures,o=r.bPaginate;return r.bServerSide?!1===o||-1===t?e+a:Math.min(e+t,this._iRecordsDisplay):!o||a<n||-1===t?a:n},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null},w.ext=p={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:w.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:w.version},P.extend(p,{afnFiltering:p.search,aTypes:p.type.detect,ofnSearch:p.type.search,oSort:p.type.order,afnSortData:p.order,aoFeatures:p.feature,oApi:p.internal,oStdClasses:p.classes,oPagination:p.pager}),P.extend(w.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_desc_disabled",sSortableDesc:"sorting_asc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""}),w.ext.pager);function Oe(t,e){var n=[],a=Ne.numbers_length,r=Math.floor(a/2);return e<=a?n=f(0,e):t<=r?((n=f(0,a-2)).push("ellipsis"),n.push(e-1)):((e-1-r<=t?n=f(e-(a-2),e):((n=f(t-r+2,t+r-1)).push("ellipsis"),n.push(e-1),n)).splice(0,0,"ellipsis"),n.splice(0,0,0)),n.DT_el="span",n}P.extend(Ne,{simple:function(t,e){return["previous","next"]},full:function(t,e){return["first","previous","next","last"]},numbers:function(t,e){return[Oe(t,e)]},simple_numbers:function(t,e){return["previous",Oe(t,e),"next"]},full_numbers:function(t,e){return["first","previous",Oe(t,e),"next","last"]},first_last_numbers:function(t,e){return["first",Oe(t,e),"last"]},_numbers:Oe,numbers_length:7}),P.extend(!0,w.ext.renderer,{pageButton:{_:function(u,t,c,e,f,d){function h(t,e){for(var n,a=b.sPageButtonDisabled,r=function(t){Yt(u,t.data.action,!0)},o=0,i=e.length;o<i;o++)if(n=e[o],Array.isArray(n)){var l=P("<"+(n.DT_el||"div")+"/>").appendTo(t);h(l,n)}else{var s=!1;switch(p=null,g=n){case"ellipsis":t.append('<span class="ellipsis">…</span>');break;case"first":p=m.sFirst,0===f&&(s=!0);break;case"previous":p=m.sPrevious,0===f&&(s=!0);break;case"next":p=m.sNext,0!==d&&f!==d-1||(s=!0);break;case"last":p=m.sLast,0!==d&&f!==d-1||(s=!0);break;default:p=u.fnFormatNumber(n+1),g=f===n?b.sPageButtonActive:""}null!==p&&(l=u.oInit.pagingTag||"a",s&&(g+=" "+a),me(P("<"+l+">",{class:b.sPageButton+" "+g,"aria-controls":u.sTableId,"aria-disabled":s?"true":null,"aria-label":S[n],role:"link","aria-current":g===b.sPageButtonActive?"page":null,"data-dt-idx":n,tabindex:s?-1:u.iTabIndex,id:0===c&&"string"==typeof n?u.sTableId+"_"+n:null}).html(p).appendTo(t),{action:n},r))}}var p,g,n,b=u.oClasses,m=u.oLanguage.oPaginate,S=u.oLanguage.oAria.paginate||{};try{n=P(t).find(v.activeElement).data("dt-idx")}catch(t){}h(P(t).empty(),e),n!==H&&P(t).find("[data-dt-idx="+n+"]").trigger("focus")}}}),P.extend(w.ext.type.detect,[function(t,e){e=e.oLanguage.sDecimal;return l(t,e)?"num"+e:null},function(t,e){var n;return(!t||t instanceof Date||X.test(t))&&(null!==(n=Date.parse(t))&&!isNaN(n)||h(t))?"date":null},function(t,e){e=e.oLanguage.sDecimal;return l(t,e,!0)?"num-fmt"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e)?"html-num"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e,!0)?"html-num-fmt"+e:null},function(t,e){return h(t)||"string"==typeof t&&-1!==t.indexOf("<")?"html":null}]),P.extend(w.ext.type.search,{html:function(t){return h(t)?t:"string"==typeof t?t.replace(U," ").replace(V,""):""},string:function(t){return!h(t)&&"string"==typeof t?t.replace(U," "):t}});function ke(t,e,n,a){var r;return 0===t||t&&"-"!==t?"number"==(r=typeof t)||"bigint"==r?t:+(t=(t=e?$(t,e):t).replace&&(n&&(t=t.replace(n,"")),a)?t.replace(a,""):t):-1/0}function Me(n){P.each({num:function(t){return ke(t,n)},"num-fmt":function(t){return ke(t,n,q)},"html-num":function(t){return ke(t,n,V)},"html-num-fmt":function(t){return ke(t,n,V,q)}},function(t,e){p.type.order[t+n+"-pre"]=e,t.match(/^html\-/)&&(p.type.search[t+n]=p.type.search.html)})}P.extend(p.type.order,{"date-pre":function(t){t=Date.parse(t);return isNaN(t)?-1/0:t},"html-pre":function(t){return h(t)?"":t.replace?t.replace(/<.*?>/g,"").toLowerCase():t+""},"string-pre":function(t){return h(t)?"":"string"==typeof t?t.toLowerCase():t.toString?t.toString():""},"string-asc":function(t,e){return t<e?-1:e<t?1:0},"string-desc":function(t,e){return t<e?1:e<t?-1:0}}),Me(""),P.extend(!0,w.ext.renderer,{header:{_:function(r,o,i,l){P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass))})},jqueryui:function(r,o,i,l){P("<div/>").addClass(l.sSortJUIWrapper).append(o.contents()).append(P("<span/>").addClass(l.sSortIcon+" "+i.sSortingClassJUI)).appendTo(o),P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass),o.find("span."+l.sSortIcon).removeClass(l.sSortJUIAsc+" "+l.sSortJUIDesc+" "+l.sSortJUI+" "+l.sSortJUIAscAllowed+" "+l.sSortJUIDescAllowed).addClass("asc"==a[e]?l.sSortJUIAsc:"desc"==a[e]?l.sSortJUIDesc:i.sSortingClassJUI))})}}});function We(t){return"string"==typeof(t=Array.isArray(t)?t.join(","):t)?t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):t}function Ee(t,e,n,a,r){return j.moment?t[e](r):j.luxon?t[n](r):a?t[a](r):t}var Be=!1;function Ue(t,e,n){var a;if(j.moment){if(!(a=j.moment.utc(t,e,n,!0)).isValid())return null}else if(j.luxon){if(!(a=e&&"string"==typeof t?j.luxon.DateTime.fromFormat(t,e):j.luxon.DateTime.fromISO(t)).isValid)return null;a.setLocale(n)}else e?(Be||alert("DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17"),Be=!0):a=new Date(t);return a}function Ve(s){return function(a,r,o,i){0===arguments.length?(o="en",a=r=null):1===arguments.length?(o="en",r=a,a=null):2===arguments.length&&(o=r,r=a,a=null);var l="datetime-"+r;return w.ext.type.order[l]||(w.ext.type.detect.unshift(function(t){return t===l&&l}),w.ext.type.order[l+"-asc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:t<e?-1:1},w.ext.type.order[l+"-desc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:e<t?-1:1}),function(t,e){var n;return null!==t&&t!==H||(t="--now"===i?(n=new Date,new Date(Date.UTC(n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds()))):""),"type"===e?l:""===t?"sort"!==e?"":Ue("0000-01-01 00:00:00",null,o):!(null===r||a!==r||"sort"===e||"type"===e||t instanceof Date)||null===(n=Ue(t,a,o))?t:"sort"===e?n:(t=null===r?Ee(n,"toDate","toJSDate","")[s]():Ee(n,"format","toFormat","toISOString",r),"display"===e?We(t):t)}}}var Xe=",",Je=".";if(j.Intl!==H)try{for(var qe=(new Intl.NumberFormat).formatToParts(100000.1),n=0;n<qe.length;n++)"group"===qe[n].type?Xe=qe[n].value:"decimal"===qe[n].type&&(Je=qe[n].value)}catch(t){}function $e(e){return function(){var t=[ge(this[w.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return w.ext.internal[e].apply(this,t)}}return w.datetime=function(n,a){var r="datetime-detect-"+n;a=a||"en",w.ext.type.order[r]||(w.ext.type.detect.unshift(function(t){var e=Ue(t,n,a);return!(""!==t&&!e)&&r}),w.ext.type.order[r+"-pre"]=function(t){return Ue(t,n,a)||0})},w.render={date:Ve("toLocaleDateString"),datetime:Ve("toLocaleString"),time:Ve("toLocaleTimeString"),number:function(a,r,o,i,l){return null!==a&&a!==H||(a=Xe),null!==r&&r!==H||(r=Je),{display:function(t){if("number"!=typeof t&&"string"!=typeof t)return t;if(""===t||null===t)return t;var e=t<0?"-":"",n=parseFloat(t);if(isNaN(n))return We(t);n=n.toFixed(o),t=Math.abs(n);n=parseInt(t,10),t=o?r+(t-n).toFixed(o).substring(2):"";return(e=0===n&&0===parseFloat(t)?"":e)+(i||"")+n.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+t+(l||"")}}},text:function(){return{display:We,filter:We}}},P.extend(w.ext.internal,{_fnExternApiFunc:$e,_fnBuildAjax:Tt,_fnAjaxUpdate:xt,_fnAjaxParameters:At,_fnAjaxUpdateDraw:It,_fnAjaxDataSrc:Ft,_fnAddColumn:nt,_fnColumnOptions:at,_fnAdjustColumnSizing:O,_fnVisibleToColumnIndex:rt,_fnColumnIndexToVisible:ot,_fnVisbleColumns:T,_fnGetColumns:it,_fnColumnTypes:lt,_fnApplyColumnDefs:st,_fnHungarianMap:i,_fnCamelToHungarian:C,_fnLanguageCompat:Z,_fnBrowserDetect:tt,_fnAddData:x,_fnAddTr:ut,_fnNodeToDataIndex:function(t,e){return e._DT_RowIndex!==H?e._DT_RowIndex:null},_fnNodeToColumnIndex:function(t,e,n){return P.inArray(n,t.aoData[e].anCells)},_fnGetCellData:S,_fnSetCellData:ct,_fnSplitObjNotation:dt,_fnGetObjectDataFn:A,_fnSetObjectDataFn:b,_fnGetDataMaster:ht,_fnClearTable:pt,_fnDeleteIndex:gt,_fnInvalidate:bt,_fnGetRowElements:mt,_fnCreateTr:St,_fnBuildHead:yt,_fnDrawHead:Dt,_fnDraw:y,_fnReDraw:u,_fnAddOptionsHtml:_t,_fnDetectHeader:wt,_fnGetUniqueThs:Ct,_fnFeatureHtmlFilter:Lt,_fnFilterComplete:Rt,_fnFilterCustom:Pt,_fnFilterColumn:jt,_fnFilter:Ht,_fnFilterCreateSearch:Nt,_fnEscapeRegex:Ot,_fnFilterData:Wt,_fnFeatureHtmlInfo:Ut,_fnUpdateInfo:Vt,_fnInfoMacros:Xt,_fnInitialise:Jt,_fnInitComplete:qt,_fnLengthChange:$t,_fnFeatureHtmlLength:Gt,_fnFeatureHtmlPaginate:zt,_fnPageChange:Yt,_fnFeatureHtmlProcessing:Zt,_fnProcessingDisplay:D,_fnFeatureHtmlTable:Kt,_fnScrollDraw:Qt,_fnApplyToChildren:k,_fnCalculateColumnWidths:ee,_fnThrottle:ne,_fnConvertToWidth:ae,_fnGetWidestNode:re,_fnGetMaxLenString:oe,_fnStringToCss:M,_fnSortFlatten:I,_fnSort:ie,_fnSortAria:le,_fnSortListener:se,_fnSortAttachListener:ue,_fnSortingClasses:ce,_fnSortData:fe,_fnSaveState:de,_fnLoadState:he,_fnImplementState:pe,_fnSettingsFromNode:ge,_fnLog:W,_fnMap:F,_fnBindAction:me,_fnCallbackReg:L,_fnCallbackFire:R,_fnLengthOverflow:Se,_fnRenderer:ve,_fnDataSource:E,_fnRowAttributes:vt,_fnExtend:be,_fnCalculateEnd:function(){}}),((P.fn.dataTable=w).$=P).fn.dataTableSettings=w.settings,P.fn.dataTableExt=w.ext,P.fn.DataTable=function(t){return P(this).dataTable(t).api()},P.each(w,function(t,e){P.fn.DataTable[t]=e}),w});
\ No newline at end of file diff --git a/docs/coverage/lib/highlight.js-6.2/LICENSE b/docs/coverage/lib/highlight.js-6.2/LICENSE new file mode 100644 index 00000000..fe2f67b1 --- /dev/null +++ b/docs/coverage/lib/highlight.js-6.2/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2006, Ivan Sagalaev +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of highlight.js nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/coverage/lib/highlight.js-6.2/highlight.pack.js b/docs/coverage/lib/highlight.js-6.2/highlight.pack.js new file mode 100644 index 00000000..6687e557 --- /dev/null +++ b/docs/coverage/lib/highlight.js-6.2/highlight.pack.js @@ -0,0 +1 @@ +var hljs=new function(){function m(p){return p.replace(/&/gm,"&").replace(/</gm,"<")}function f(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function b(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function h(t,s){var p="";for(var r=0;r<t.childNodes.length;r++){if(t.childNodes[r].nodeType==3){var q=t.childNodes[r].nodeValue;if(s){q=q.replace(/\n/g,"")}p+=q}else{if(t.childNodes[r].nodeName=="BR"){p+="\n"}else{p+=h(t.childNodes[r])}}}if(/MSIE [678]/.test(navigator.userAgent)){p=p.replace(/\r/g,"\n")}return p}function a(s){var r=s.className.split(/\s+/);r=r.concat(s.parentNode.className.split(/\s+/));for(var q=0;q<r.length;q++){var p=r[q].replace(/^language-/,"");if(e[p]){return p}}}function c(q){var p=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{if(s.childNodes[r].nodeType==1){p.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);p.push({event:"stop",offset:t,node:s.childNodes[r]})}}}}return t})(q,0);return p}function k(y,w,x){var q=0;var z="";var s=[];function u(){if(y.length&&w.length){if(y[0].offset!=w[0].offset){return(y[0].offset<w[0].offset)?y:w}else{return w[0].event=="start"?y:w}}else{return y.length?y:w}}function t(D){var A="<"+D.nodeName.toLowerCase();for(var B=0;B<D.attributes.length;B++){var C=D.attributes[B];A+=" "+C.nodeName.toLowerCase();if(C.value!==undefined&&C.value!==false&&C.value!==null){A+='="'+m(C.value)+'"'}}return A+">"}while(y.length||w.length){var v=u().splice(0,1)[0];z+=m(x.substr(q,v.offset-q));q=v.offset;if(v.event=="start"){z+=t(v.node);s.push(v.node)}else{if(v.event=="stop"){var p,r=s.length;do{r--;p=s[r];z+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);s.splice(r,1);while(r<s.length){z+=t(s[r]);r++}}}}return z+m(x.substr(q))}function j(){function q(x,y,v){if(x.compiled){return}var u;var s=[];if(x.k){x.lR=f(y,x.l||hljs.IR,true);for(var w in x.k){if(!x.k.hasOwnProperty(w)){continue}if(x.k[w] instanceof Object){u=x.k[w]}else{u=x.k;w="keyword"}for(var r in u){if(!u.hasOwnProperty(r)){continue}x.k[r]=[w,u[r]];s.push(r)}}}if(!v){if(x.bWK){x.b="\\b("+s.join("|")+")\\s"}x.bR=f(y,x.b?x.b:"\\B|\\b");if(!x.e&&!x.eW){x.e="\\B|\\b"}if(x.e){x.eR=f(y,x.e)}}if(x.i){x.iR=f(y,x.i)}if(x.r===undefined){x.r=1}if(!x.c){x.c=[]}x.compiled=true;for(var t=0;t<x.c.length;t++){if(x.c[t]=="self"){x.c[t]=x}q(x.c[t],y,false)}if(x.starts){q(x.starts,y,false)}}for(var p in e){if(!e.hasOwnProperty(p)){continue}q(e[p].dM,e[p],true)}}function d(B,C){if(!j.called){j();j.called=true}function q(r,M){for(var L=0;L<M.c.length;L++){if((M.c[L].bR.exec(r)||[null])[0]==r){return M.c[L]}}}function v(L,r){if(D[L].e&&D[L].eR.test(r)){return 1}if(D[L].eW){var M=v(L-1,r);return M?M+1:0}return 0}function w(r,L){return L.i&&L.iR.test(r)}function K(N,O){var M=[];for(var L=0;L<N.c.length;L++){M.push(N.c[L].b)}var r=D.length-1;do{if(D[r].e){M.push(D[r].e)}r--}while(D[r+1].eW);if(N.i){M.push(N.i)}return f(O,M.join("|"),true)}function p(M,L){var N=D[D.length-1];if(!N.t){N.t=K(N,E)}N.t.lastIndex=L;var r=N.t.exec(M);return r?[M.substr(L,r.index-L),r[0],false]:[M.substr(L),"",true]}function z(N,r){var L=E.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(L,P){L=m(L);if(!P.k){return L}var r="";var O=0;P.lR.lastIndex=0;var M=P.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=z(P,M);if(N){x+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=P.lR.lastIndex;M=P.lR.exec(L)}return r+L.substr(O,L.length-O)}function J(L,M){if(M.sL&&e[M.sL]){var r=d(M.sL,L);x+=r.keyword_count;return r.value}else{return F(L,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){y+=L;M.buffer=""}else{if(M.eB){y+=m(r)+L;M.buffer=""}else{y+=L;M.buffer=r}}D.push(M);A+=M.r}function G(N,M,Q){var R=D[D.length-1];if(Q){y+=J(R.buffer+N,R);return false}var P=q(M,R);if(P){y+=J(R.buffer+N,R);I(P,M);return P.rB}var L=v(D.length-1,M);if(L){var O=R.cN?"</span>":"";if(R.rE){y+=J(R.buffer+N,R)+O}else{if(R.eE){y+=J(R.buffer+N,R)+O+m(M)}else{y+=J(R.buffer+N+M,R)+O}}while(L>1){O=D[D.length-2].cN?"</span>":"";y+=O;L--;D.length--}var r=D[D.length-1];D.length--;D[D.length-1].buffer="";if(r.starts){I(r.starts,"")}return R.rE}if(w(M,R)){throw"Illegal"}}var E=e[B];var D=[E.dM];var A=0;var x=0;var y="";try{var s,u=0;E.dM.buffer="";do{s=p(C,u);var t=G(s[0],s[1],s[2]);u+=s[0].length;if(!t){u+=s[1].length}}while(!s[2]);if(D.length>1){throw"Illegal"}return{r:A,keyword_count:x,value:y}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:m(C)}}else{throw H}}}function g(t){var p={keyword_count:0,r:0,value:m(t)};var r=p;for(var q in e){if(!e.hasOwnProperty(q)){continue}var s=d(q,t);s.language=q;if(s.keyword_count+s.r>r.keyword_count+r.r){r=s}if(s.keyword_count+s.r>p.keyword_count+p.r){r=p;p=s}}if(r.language){p.second_best=r}return p}function i(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"<br>")}return r}function n(t,w,r){var x=h(t,r);var v=a(t);var y,s;if(v){y=d(v,x)}else{return}var q=c(t);if(q.length){s=document.createElement("pre");s.innerHTML=y.value;y.value=k(q,c(s),x)}y.value=i(y.value,w,r);var u=t.className;if(!u.match("(\\s|^)(language-)?"+v+"(\\s|$)")){u=u?(u+" "+v):v}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){s=t.parentNode;var p=document.createElement("div");p.innerHTML="<pre><code>"+y.value+"</code></pre>";t=p.firstChild.firstChild;p.firstChild.cN=s.cN;s.parentNode.replaceChild(p.firstChild,s)}else{t.innerHTML=y.value}t.className=u;t.result={language:v,kw:y.keyword_count,re:y.r};if(y.second_best){t.second_best={language:y.second_best.language,kw:y.second_best.keyword_count,re:y.second_best.r}}}function o(){if(o.called){return}o.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p<r.length;p++){var q=b(r[p]);if(q){n(q,hljs.tabReplace)}}}function l(){if(window.addEventListener){window.addEventListener("DOMContentLoaded",o,false);window.addEventListener("load",o,false)}else{if(window.attachEvent){window.attachEvent("onload",o)}else{window.onload=o}}}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=n;this.initHighlighting=o;this.initHighlightingOnLoad=l;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.ER="(?![\\s\\S])";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(r,s){var p={};for(var q in r){p[q]=r[q]}if(s){for(var q in s){p[q]=s[q]}}return p}}();hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:{"font-face":1,page:1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|\\b(case|return|throw)\\b)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",bWK:true,e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.r={dM:{c:[hljs.HCM,{cN:"number",b:"\\b0[xX][0-9a-fA-F]+[Li]?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+(?:[eE][+\\-]?\\d*)?L\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+\\.(?!\\d)(?:i\\b)?",e:hljs.IMMEDIATE_RE,r:1},{cN:"number",b:"\\b\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"keyword",b:"(?:tryCatch|library|setGeneric|setGroupGeneric)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\.",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\d+(?![\\w.])",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\b(?:function)",e:hljs.IMMEDIATE_RE,r:2},{cN:"keyword",b:"(?:if|in|break|next|repeat|else|for|return|switch|while|try|stop|warning|require|attach|detach|source|setMethod|setClass)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"literal",b:"(?:NA|NA_integer_|NA_real_|NA_character_|NA_complex_)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"literal",b:"(?:NULL|TRUE|FALSE|T|F|Inf|NaN)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"identifier",b:"[a-zA-Z.][a-zA-Z0-9._]*\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"<\\-(?!\\s*\\d)",e:hljs.IMMEDIATE_RE,r:2},{cN:"operator",b:"\\->|<\\-",e:hljs.IMMEDIATE_RE,r:1},{cN:"operator",b:"%%|~",e:hljs.IMMEDIATE_RE},{cN:"operator",b:">=|<=|==|!=|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||\\$|:",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"%",e:"%",i:"\\n",r:1},{cN:"identifier",b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[hljs.BE],r:0},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"paren",b:"[[({\\])}]",e:hljs.IMMEDIATE_RE,r:0}]}};hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},a]}]}}}(); diff --git a/docs/coverage/lib/highlight.js-6.2/rstudio.css b/docs/coverage/lib/highlight.js-6.2/rstudio.css new file mode 100644 index 00000000..58de9a9a --- /dev/null +++ b/docs/coverage/lib/highlight.js-6.2/rstudio.css @@ -0,0 +1,81 @@ +code { + line-height: 150%; +} + +pre .operator, +pre .paren { + color: rgb(104, 118, 135) +} + +pre .literal { + color: rgb(88, 72, 246) +} + +pre .number { + color: rgb(0, 0, 205); +} + +pre .comment { + color: rgb(76, 136, 107); + font-style: italic; +} + +pre .keyword, +pre .id { + color: rgb(0, 0, 255); +} + +pre .identifier { + color: rgb(0, 0, 0); +} + +pre .string, +pre .attribute { + color: rgb(3, 106, 7); +} + +pre .doctype { + color: rgb(104, 104, 92); +} + +pre .tag, +pre .title { + color: rgb(4, 29, 140); +} + +pre .value { + color: rgb(13, 105, 18); +} + +.language-xml .attribute { + color: rgb(0, 0, 0); +} + +.language-css .attribute { + color: rgb(110, 124, 219); +} + +.language-css .value { + color: rgb(23, 149, 30); +} + +.language-css .number, +.language-css .hexcolor { + color: rgb(7, 27, 201); +} + +.language-css .function { + color: rgb(61, 77, 113); +} + +.language-css .tag { + color: rgb(195, 13, 25); +} + +.language-css .class { + color: rgb(53, 132, 148); +} + +.language-css .pseudo { + color: rgb(13, 105, 18); +} diff --git a/docs/coverage/lib/htmltools-fill-0.5.8.1/fill.css b/docs/coverage/lib/htmltools-fill-0.5.8.1/fill.css new file mode 100644 index 00000000..841ea9d5 --- /dev/null +++ b/docs/coverage/lib/htmltools-fill-0.5.8.1/fill.css @@ -0,0 +1,21 @@ +@layer htmltools { + .html-fill-container { + display: flex; + flex-direction: column; + /* Prevent the container from expanding vertically or horizontally beyond its + parent's constraints. */ + min-height: 0; + min-width: 0; + } + .html-fill-container > .html-fill-item { + /* Fill items can grow and shrink freely within + available vertical space in fillable container */ + flex: 1 1 auto; + min-height: 0; + min-width: 0; + } + .html-fill-container > :not(.html-fill-item) { + /* Prevent shrinking or growing of non-fill items */ + flex: 0 0 auto; + } +} diff --git a/docs/coverage/lib/htmlwidgets-1.6.4/htmlwidgets.js b/docs/coverage/lib/htmlwidgets-1.6.4/htmlwidgets.js new file mode 100644 index 00000000..1067d029 --- /dev/null +++ b/docs/coverage/lib/htmlwidgets-1.6.4/htmlwidgets.js @@ -0,0 +1,901 @@ +(function() { + // If window.HTMLWidgets is already defined, then use it; otherwise create a + // new object. This allows preceding code to set options that affect the + // initialization process (though none currently exist). + window.HTMLWidgets = window.HTMLWidgets || {}; + + // See if we're running in a viewer pane. If not, we're in a web browser. + var viewerMode = window.HTMLWidgets.viewerMode = + /\bviewer_pane=1\b/.test(window.location); + + // See if we're running in Shiny mode. If not, it's a static document. + // Note that static widgets can appear in both Shiny and static modes, but + // obviously, Shiny widgets can only appear in Shiny apps/documents. + var shinyMode = window.HTMLWidgets.shinyMode = + typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings; + + // We can't count on jQuery being available, so we implement our own + // version if necessary. + function querySelectorAll(scope, selector) { + if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) { + return scope.find(selector); + } + if (scope.querySelectorAll) { + return scope.querySelectorAll(selector); + } + } + + function asArray(value) { + if (value === null) + return []; + if ($.isArray(value)) + return value; + return [value]; + } + + // Implement jQuery's extend + function extend(target /*, ... */) { + if (arguments.length == 1) { + return target; + } + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + target[prop] = source[prop]; + } + } + } + return target; + } + + // IE8 doesn't support Array.forEach. + function forEach(values, callback, thisArg) { + if (values.forEach) { + values.forEach(callback, thisArg); + } else { + for (var i = 0; i < values.length; i++) { + callback.call(thisArg, values[i], i, values); + } + } + } + + // Replaces the specified method with the return value of funcSource. + // + // Note that funcSource should not BE the new method, it should be a function + // that RETURNS the new method. funcSource receives a single argument that is + // the overridden method, it can be called from the new method. The overridden + // method can be called like a regular function, it has the target permanently + // bound to it so "this" will work correctly. + function overrideMethod(target, methodName, funcSource) { + var superFunc = target[methodName] || function() {}; + var superFuncBound = function() { + return superFunc.apply(target, arguments); + }; + target[methodName] = funcSource(superFuncBound); + } + + // Add a method to delegator that, when invoked, calls + // delegatee.methodName. If there is no such method on + // the delegatee, but there was one on delegator before + // delegateMethod was called, then the original version + // is invoked instead. + // For example: + // + // var a = { + // method1: function() { console.log('a1'); } + // method2: function() { console.log('a2'); } + // }; + // var b = { + // method1: function() { console.log('b1'); } + // }; + // delegateMethod(a, b, "method1"); + // delegateMethod(a, b, "method2"); + // a.method1(); + // a.method2(); + // + // The output would be "b1", "a2". + function delegateMethod(delegator, delegatee, methodName) { + var inherited = delegator[methodName]; + delegator[methodName] = function() { + var target = delegatee; + var method = delegatee[methodName]; + + // The method doesn't exist on the delegatee. Instead, + // call the method on the delegator, if it exists. + if (!method) { + target = delegator; + method = inherited; + } + + if (method) { + return method.apply(target, arguments); + } + }; + } + + // Implement a vague facsimilie of jQuery's data method + function elementData(el, name, value) { + if (arguments.length == 2) { + return el["htmlwidget_data_" + name]; + } else if (arguments.length == 3) { + el["htmlwidget_data_" + name] = value; + return el; + } else { + throw new Error("Wrong number of arguments for elementData: " + + arguments.length); + } + } + + // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + function escapeRegExp(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + + function hasClass(el, className) { + var re = new RegExp("\\b" + escapeRegExp(className) + "\\b"); + return re.test(el.className); + } + + // elements - array (or array-like object) of HTML elements + // className - class name to test for + // include - if true, only return elements with given className; + // if false, only return elements *without* given className + function filterByClass(elements, className, include) { + var results = []; + for (var i = 0; i < elements.length; i++) { + if (hasClass(elements[i], className) == include) + results.push(elements[i]); + } + return results; + } + + function on(obj, eventName, func) { + if (obj.addEventListener) { + obj.addEventListener(eventName, func, false); + } else if (obj.attachEvent) { + obj.attachEvent(eventName, func); + } + } + + function off(obj, eventName, func) { + if (obj.removeEventListener) + obj.removeEventListener(eventName, func, false); + else if (obj.detachEvent) { + obj.detachEvent(eventName, func); + } + } + + // Translate array of values to top/right/bottom/left, as usual with + // the "padding" CSS property + // https://developer.mozilla.org/en-US/docs/Web/CSS/padding + function unpackPadding(value) { + if (typeof(value) === "number") + value = [value]; + if (value.length === 1) { + return {top: value[0], right: value[0], bottom: value[0], left: value[0]}; + } + if (value.length === 2) { + return {top: value[0], right: value[1], bottom: value[0], left: value[1]}; + } + if (value.length === 3) { + return {top: value[0], right: value[1], bottom: value[2], left: value[1]}; + } + if (value.length === 4) { + return {top: value[0], right: value[1], bottom: value[2], left: value[3]}; + } + } + + // Convert an unpacked padding object to a CSS value + function paddingToCss(paddingObj) { + return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px"; + } + + // Makes a number suitable for CSS + function px(x) { + if (typeof(x) === "number") + return x + "px"; + else + return x; + } + + // Retrieves runtime widget sizing information for an element. + // The return value is either null, or an object with fill, padding, + // defaultWidth, defaultHeight fields. + function sizingPolicy(el) { + var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']"); + if (!sizingEl) + return null; + var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}"); + if (viewerMode) { + return sp.viewer; + } else { + return sp.browser; + } + } + + // @param tasks Array of strings (or falsy value, in which case no-op). + // Each element must be a valid JavaScript expression that yields a + // function. Or, can be an array of objects with "code" and "data" + // properties; in this case, the "code" property should be a string + // of JS that's an expr that yields a function, and "data" should be + // an object that will be added as an additional argument when that + // function is called. + // @param target The object that will be "this" for each function + // execution. + // @param args Array of arguments to be passed to the functions. (The + // same arguments will be passed to all functions.) + function evalAndRun(tasks, target, args) { + if (tasks) { + forEach(tasks, function(task) { + var theseArgs = args; + if (typeof(task) === "object") { + theseArgs = theseArgs.concat([task.data]); + task = task.code; + } + var taskFunc = tryEval(task); + if (typeof(taskFunc) !== "function") { + throw new Error("Task must be a function! Source:\n" + task); + } + taskFunc.apply(target, theseArgs); + }); + } + } + + // Attempt eval() both with and without enclosing in parentheses. + // Note that enclosing coerces a function declaration into + // an expression that eval() can parse + // (otherwise, a SyntaxError is thrown) + function tryEval(code) { + var result = null; + try { + result = eval("(" + code + ")"); + } catch(error) { + if (!(error instanceof SyntaxError)) { + throw error; + } + try { + result = eval(code); + } catch(e) { + if (e instanceof SyntaxError) { + throw error; + } else { + throw e; + } + } + } + return result; + } + + function initSizing(el) { + var sizing = sizingPolicy(el); + if (!sizing) + return; + + var cel = document.getElementById("htmlwidget_container"); + if (!cel) + return; + + if (typeof(sizing.padding) !== "undefined") { + document.body.style.margin = "0"; + document.body.style.padding = paddingToCss(unpackPadding(sizing.padding)); + } + + if (sizing.fill) { + document.body.style.overflow = "hidden"; + document.body.style.width = "100%"; + document.body.style.height = "100%"; + document.documentElement.style.width = "100%"; + document.documentElement.style.height = "100%"; + cel.style.position = "absolute"; + var pad = unpackPadding(sizing.padding); + cel.style.top = pad.top + "px"; + cel.style.right = pad.right + "px"; + cel.style.bottom = pad.bottom + "px"; + cel.style.left = pad.left + "px"; + el.style.width = "100%"; + el.style.height = "100%"; + + return { + getWidth: function() { return cel.getBoundingClientRect().width; }, + getHeight: function() { return cel.getBoundingClientRect().height; } + }; + + } else { + el.style.width = px(sizing.width); + el.style.height = px(sizing.height); + + return { + getWidth: function() { return cel.getBoundingClientRect().width; }, + getHeight: function() { return cel.getBoundingClientRect().height; } + }; + } + } + + // Default implementations for methods + var defaults = { + find: function(scope) { + return querySelectorAll(scope, "." + this.name); + }, + renderError: function(el, err) { + var $el = $(el); + + this.clearError(el); + + // Add all these error classes, as Shiny does + var errClass = "shiny-output-error"; + if (err.type !== null) { + // use the classes of the error condition as CSS class names + errClass = errClass + " " + $.map(asArray(err.type), function(type) { + return errClass + "-" + type; + }).join(" "); + } + errClass = errClass + " htmlwidgets-error"; + + // Is el inline or block? If inline or inline-block, just display:none it + // and add an inline error. + var display = $el.css("display"); + $el.data("restore-display-mode", display); + + if (display === "inline" || display === "inline-block") { + $el.hide(); + if (err.message !== "") { + var errorSpan = $("<span>").addClass(errClass); + errorSpan.text(err.message); + $el.after(errorSpan); + } + } else if (display === "block") { + // If block, add an error just after the el, set visibility:none on the + // el, and position the error to be on top of the el. + // Mark it with a unique ID and CSS class so we can remove it later. + $el.css("visibility", "hidden"); + if (err.message !== "") { + var errorDiv = $("<div>").addClass(errClass).css("position", "absolute") + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + // setting width can push out the page size, forcing otherwise + // unnecessary scrollbars to appear and making it impossible for + // the element to shrink; so use max-width instead + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + errorDiv.text(err.message); + $el.after(errorDiv); + + // Really dumb way to keep the size/position of the error in sync with + // the parent element as the window is resized or whatever. + var intId = setInterval(function() { + if (!errorDiv[0].parentElement) { + clearInterval(intId); + return; + } + errorDiv + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + }, 500); + } + } + }, + clearError: function(el) { + var $el = $(el); + var display = $el.data("restore-display-mode"); + $el.data("restore-display-mode", null); + + if (display === "inline" || display === "inline-block") { + if (display) + $el.css("display", display); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } else if (display === "block"){ + $el.css("visibility", "inherit"); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } + }, + sizing: {} + }; + + // Called by widget bindings to register a new type of widget. The definition + // object can contain the following properties: + // - name (required) - A string indicating the binding name, which will be + // used by default as the CSS classname to look for. + // - initialize (optional) - A function(el) that will be called once per + // widget element; if a value is returned, it will be passed as the third + // value to renderValue. + // - renderValue (required) - A function(el, data, initValue) that will be + // called with data. Static contexts will cause this to be called once per + // element; Shiny apps will cause this to be called multiple times per + // element, as the data changes. + window.HTMLWidgets.widget = function(definition) { + if (!definition.name) { + throw new Error("Widget must have a name"); + } + if (!definition.type) { + throw new Error("Widget must have a type"); + } + // Currently we only support output widgets + if (definition.type !== "output") { + throw new Error("Unrecognized widget type '" + definition.type + "'"); + } + // TODO: Verify that .name is a valid CSS classname + + // Support new-style instance-bound definitions. Old-style class-bound + // definitions have one widget "object" per widget per type/class of + // widget; the renderValue and resize methods on such widget objects + // take el and instance arguments, because the widget object can't + // store them. New-style instance-bound definitions have one widget + // object per widget instance; the definition that's passed in doesn't + // provide renderValue or resize methods at all, just the single method + // factory(el, width, height) + // which returns an object that has renderValue(x) and resize(w, h). + // This enables a far more natural programming style for the widget + // author, who can store per-instance state using either OO-style + // instance fields or functional-style closure variables (I guess this + // is in contrast to what can only be called C-style pseudo-OO which is + // what we required before). + if (definition.factory) { + definition = createLegacyDefinitionAdapter(definition); + } + + if (!definition.renderValue) { + throw new Error("Widget must have a renderValue function"); + } + + // For static rendering (non-Shiny), use a simple widget registration + // scheme. We also use this scheme for Shiny apps/documents that also + // contain static widgets. + window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || []; + // Merge defaults into the definition; don't mutate the original definition. + var staticBinding = extend({}, defaults, definition); + overrideMethod(staticBinding, "find", function(superfunc) { + return function(scope) { + var results = superfunc(scope); + // Filter out Shiny outputs, we only want the static kind + return filterByClass(results, "html-widget-output", false); + }; + }); + window.HTMLWidgets.widgets.push(staticBinding); + + if (shinyMode) { + // Shiny is running. Register the definition with an output binding. + // The definition itself will not be the output binding, instead + // we will make an output binding object that delegates to the + // definition. This is because we foolishly used the same method + // name (renderValue) for htmlwidgets definition and Shiny bindings + // but they actually have quite different semantics (the Shiny + // bindings receive data that includes lots of metadata that it + // strips off before calling htmlwidgets renderValue). We can't + // just ignore the difference because in some widgets it's helpful + // to call this.renderValue() from inside of resize(), and if + // we're not delegating, then that call will go to the Shiny + // version instead of the htmlwidgets version. + + // Merge defaults with definition, without mutating either. + var bindingDef = extend({}, defaults, definition); + + // This object will be our actual Shiny binding. + var shinyBinding = new Shiny.OutputBinding(); + + // With a few exceptions, we'll want to simply use the bindingDef's + // version of methods if they are available, otherwise fall back to + // Shiny's defaults. NOTE: If Shiny's output bindings gain additional + // methods in the future, and we want them to be overrideable by + // HTMLWidget binding definitions, then we'll need to add them to this + // list. + delegateMethod(shinyBinding, bindingDef, "getId"); + delegateMethod(shinyBinding, bindingDef, "onValueChange"); + delegateMethod(shinyBinding, bindingDef, "onValueError"); + delegateMethod(shinyBinding, bindingDef, "renderError"); + delegateMethod(shinyBinding, bindingDef, "clearError"); + delegateMethod(shinyBinding, bindingDef, "showProgress"); + + // The find, renderValue, and resize are handled differently, because we + // want to actually decorate the behavior of the bindingDef methods. + + shinyBinding.find = function(scope) { + var results = bindingDef.find(scope); + + // Only return elements that are Shiny outputs, not static ones + var dynamicResults = results.filter(".html-widget-output"); + + // It's possible that whatever caused Shiny to think there might be + // new dynamic outputs, also caused there to be new static outputs. + // Since there might be lots of different htmlwidgets bindings, we + // schedule execution for later--no need to staticRender multiple + // times. + if (results.length !== dynamicResults.length) + scheduleStaticRender(); + + return dynamicResults; + }; + + // Wrap renderValue to handle initialization, which unfortunately isn't + // supported natively by Shiny at the time of this writing. + + shinyBinding.renderValue = function(el, data) { + Shiny.renderDependencies(data.deps); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var i = 0; data.evals && i < data.evals.length; i++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]); + } + if (!bindingDef.renderOnNullValue) { + if (data.x === null) { + el.style.visibility = "hidden"; + return; + } else { + el.style.visibility = "inherit"; + } + } + if (!elementData(el, "initialized")) { + initSizing(el); + + elementData(el, "initialized", true); + if (bindingDef.initialize) { + var rect = el.getBoundingClientRect(); + var result = bindingDef.initialize(el, rect.width, rect.height); + elementData(el, "init_result", result); + } + } + bindingDef.renderValue(el, data.x, elementData(el, "init_result")); + evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]); + }; + + // Only override resize if bindingDef implements it + if (bindingDef.resize) { + shinyBinding.resize = function(el, width, height) { + // Shiny can call resize before initialize/renderValue have been + // called, which doesn't make sense for widgets. + if (elementData(el, "initialized")) { + bindingDef.resize(el, width, height, elementData(el, "init_result")); + } + }; + } + + Shiny.outputBindings.register(shinyBinding, bindingDef.name); + } + }; + + var scheduleStaticRenderTimerId = null; + function scheduleStaticRender() { + if (!scheduleStaticRenderTimerId) { + scheduleStaticRenderTimerId = setTimeout(function() { + scheduleStaticRenderTimerId = null; + window.HTMLWidgets.staticRender(); + }, 1); + } + } + + // Render static widgets after the document finishes loading + // Statically render all elements that are of this widget's class + window.HTMLWidgets.staticRender = function() { + var bindings = window.HTMLWidgets.widgets || []; + forEach(bindings, function(binding) { + var matches = binding.find(document.documentElement); + forEach(matches, function(el) { + var sizeObj = initSizing(el, binding); + + var getSize = function(el) { + if (sizeObj) { + return {w: sizeObj.getWidth(), h: sizeObj.getHeight()} + } else { + var rect = el.getBoundingClientRect(); + return {w: rect.width, h: rect.height} + } + }; + + if (hasClass(el, "html-widget-static-bound")) + return; + el.className = el.className + " html-widget-static-bound"; + + var initResult; + if (binding.initialize) { + var size = getSize(el); + initResult = binding.initialize(el, size.w, size.h); + elementData(el, "init_result", initResult); + } + + if (binding.resize) { + var lastSize = getSize(el); + var resizeHandler = function(e) { + var size = getSize(el); + if (size.w === 0 && size.h === 0) + return; + if (size.w === lastSize.w && size.h === lastSize.h) + return; + lastSize = size; + binding.resize(el, size.w, size.h, initResult); + }; + + on(window, "resize", resizeHandler); + + // This is needed for cases where we're running in a Shiny + // app, but the widget itself is not a Shiny output, but + // rather a simple static widget. One example of this is + // an rmarkdown document that has runtime:shiny and widget + // that isn't in a render function. Shiny only knows to + // call resize handlers for Shiny outputs, not for static + // widgets, so we do it ourselves. + if (window.jQuery) { + window.jQuery(document).on( + "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets", + resizeHandler + ); + window.jQuery(document).on( + "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets", + resizeHandler + ); + } + + // This is needed for the specific case of ioslides, which + // flips slides between display:none and display:block. + // Ideally we would not have to have ioslide-specific code + // here, but rather have ioslides raise a generic event, + // but the rmarkdown package just went to CRAN so the + // window to getting that fixed may be long. + if (window.addEventListener) { + // It's OK to limit this to window.addEventListener + // browsers because ioslides itself only supports + // such browsers. + on(document, "slideenter", resizeHandler); + on(document, "slideleave", resizeHandler); + } + } + + var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']"); + if (scriptData) { + var data = JSON.parse(scriptData.textContent || scriptData.text); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var k = 0; data.evals && k < data.evals.length; k++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]); + } + binding.renderValue(el, data.x, initResult); + evalAndRun(data.jsHooks.render, initResult, [el, data.x]); + } + }); + }); + + invokePostRenderHandlers(); + } + + + function has_jQuery3() { + if (!window.jQuery) { + return false; + } + var $version = window.jQuery.fn.jquery; + var $major_version = parseInt($version.split(".")[0]); + return $major_version >= 3; + } + + /* + / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's + / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now + / really means $(setTimeout(fn)). + / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous + / + / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny + / one tick later than it did before, which means staticRender() is + / called renderValue() earlier than (advanced) widget authors might be expecting. + / https://github.com/rstudio/shiny/issues/2630 + / + / For a concrete example, leaflet has some methods (e.g., updateBounds) + / which reference Shiny methods registered in initShiny (e.g., setInputValue). + / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to + / delay execution of those methods (until Shiny methods are ready) + / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268 + / + / Ideally widget authors wouldn't need to use this setTimeout() hack that + / leaflet uses to call Shiny methods on a staticRender(). In the long run, + / the logic initShiny should be broken up so that method registration happens + / right away, but binding happens later. + */ + function maybeStaticRenderLater() { + if (shinyMode && has_jQuery3()) { + window.jQuery(window.HTMLWidgets.staticRender); + } else { + window.HTMLWidgets.staticRender(); + } + } + + if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", function() { + document.removeEventListener("DOMContentLoaded", arguments.callee, false); + maybeStaticRenderLater(); + }, false); + } else if (document.attachEvent) { + document.attachEvent("onreadystatechange", function() { + if (document.readyState === "complete") { + document.detachEvent("onreadystatechange", arguments.callee); + maybeStaticRenderLater(); + } + }); + } + + + window.HTMLWidgets.getAttachmentUrl = function(depname, key) { + // If no key, default to the first item + if (typeof(key) === "undefined") + key = 1; + + var link = document.getElementById(depname + "-" + key + "-attachment"); + if (!link) { + throw new Error("Attachment " + depname + "/" + key + " not found in document"); + } + return link.getAttribute("href"); + }; + + window.HTMLWidgets.dataframeToD3 = function(df) { + var names = []; + var length; + for (var name in df) { + if (df.hasOwnProperty(name)) + names.push(name); + if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof(length) !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; + }; + + window.HTMLWidgets.transposeArray2D = function(array) { + if (array.length === 0) return array; + var newArray = array[0].map(function(col, i) { + return array.map(function(row) { + return row[i] + }) + }); + return newArray; + }; + // Split value at splitChar, but allow splitChar to be escaped + // using escapeChar. Any other characters escaped by escapeChar + // will be included as usual (including escapeChar itself). + function splitWithEscape(value, splitChar, escapeChar) { + var results = []; + var escapeMode = false; + var currentResult = ""; + for (var pos = 0; pos < value.length; pos++) { + if (!escapeMode) { + if (value[pos] === splitChar) { + results.push(currentResult); + currentResult = ""; + } else if (value[pos] === escapeChar) { + escapeMode = true; + } else { + currentResult += value[pos]; + } + } else { + currentResult += value[pos]; + escapeMode = false; + } + } + if (currentResult !== "") { + results.push(currentResult); + } + return results; + } + // Function authored by Yihui/JJ Allaire + window.HTMLWidgets.evaluateStringMember = function(o, member) { + var parts = splitWithEscape(member, '.', '\\'); + for (var i = 0, l = parts.length; i < l; i++) { + var part = parts[i]; + // part may be a character or 'numeric' member name + if (o !== null && typeof o === "object" && part in o) { + if (i == (l - 1)) { // if we are at the end of the line then evalulate + if (typeof o[part] === "string") + o[part] = tryEval(o[part]); + } else { // otherwise continue to next embedded object + o = o[part]; + } + } + } + }; + + // Retrieve the HTMLWidget instance (i.e. the return value of an + // HTMLWidget binding's initialize() or factory() function) + // associated with an element, or null if none. + window.HTMLWidgets.getInstance = function(el) { + return elementData(el, "init_result"); + }; + + // Finds the first element in the scope that matches the selector, + // and returns the HTMLWidget instance (i.e. the return value of + // an HTMLWidget binding's initialize() or factory() function) + // associated with that element, if any. If no element matches the + // selector, or the first matching element has no HTMLWidget + // instance associated with it, then null is returned. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.find = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var el = scope.querySelector(selector); + if (el === null) { + return null; + } else { + return window.HTMLWidgets.getInstance(el); + } + }; + + // Finds all elements in the scope that match the selector, and + // returns the HTMLWidget instances (i.e. the return values of + // an HTMLWidget binding's initialize() or factory() function) + // associated with the elements, in an array. If elements that + // match the selector don't have an associated HTMLWidget + // instance, the returned array will contain nulls. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.findAll = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var nodes = scope.querySelectorAll(selector); + var results = []; + for (var i = 0; i < nodes.length; i++) { + results.push(window.HTMLWidgets.getInstance(nodes[i])); + } + return results; + }; + + var postRenderHandlers = []; + function invokePostRenderHandlers() { + while (postRenderHandlers.length) { + var handler = postRenderHandlers.shift(); + if (handler) { + handler(); + } + } + } + + // Register the given callback function to be invoked after the + // next time static widgets are rendered. + window.HTMLWidgets.addPostRenderHandler = function(callback) { + postRenderHandlers.push(callback); + }; + + // Takes a new-style instance-bound definition, and returns an + // old-style class-bound definition. This saves us from having + // to rewrite all the logic in this file to accomodate both + // types of definitions. + function createLegacyDefinitionAdapter(defn) { + var result = { + name: defn.name, + type: defn.type, + initialize: function(el, width, height) { + return defn.factory(el, width, height); + }, + renderValue: function(el, x, instance) { + return instance.renderValue(x); + }, + resize: function(el, width, height, instance) { + return instance.resize(width, height); + } + }; + + if (defn.find) + result.find = defn.find; + if (defn.renderError) + result.renderError = defn.renderError; + if (defn.clearError) + result.clearError = defn.clearError; + + return result; + } +})(); diff --git a/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.js b/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.js new file mode 100644 index 00000000..fc6c299b --- /dev/null +++ b/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.js @@ -0,0 +1,10881 @@ +/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML <object> elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.6.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.6 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2021-02-16 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + + "<select id='" + expando + "-\r\\' msallowcapture=''>" + + "<option selected=''></option></select>"; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "<a href='' disabled='disabled'></a>" + + "<select disabled='disabled'><option/></select>"; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = "<a href='#'></a>"; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = "<input/>"; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // <object> elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = "<textarea>x</textarea>"; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces <option> tags with their contents when inserted outside of + // the select element. + div.innerHTML = "<option></option>"; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting <tbody> or other required elements. + thead: [ 1, "<table>", "</table>" ], + col: [ 2, "<table><colgroup>", "</colgroup></table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG <use> instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /<script|<style|<link/i, + + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( "<script>" ) + .attr( s.scriptAttrs || {} ) + .prop( { charset: s.scriptCharset, src: s.url } ) + .on( "load error", callback = function( evt ) { + script.remove(); + callback = null; + if ( evt ) { + complete( evt.type === "error" ? 404 : 200, evt.type ); + } + } ); + + // Use native DOM manipulation to avoid our domManip AJAX trickery + document.head.appendChild( script[ 0 ] ); + }, + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +var oldCallbacks = [], + rjsonp = /(=)\?(?=&|$)|\?\?/; + +// Default jsonp settings +jQuery.ajaxSetup( { + jsonp: "callback", + jsonpCallback: function() { + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); + this[ callback ] = true; + return callback; + } +} ); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var callbackName, overwritten, responseContainer, + jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? + "url" : + typeof s.data === "string" && + ( s.contentType || "" ) + .indexOf( "application/x-www-form-urlencoded" ) === 0 && + rjsonp.test( s.data ) && "data" + ); + + // Handle iff the expected data type is "jsonp" or we have a parameter to set + if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { + + // Get callback name, remembering preexisting value associated with it + callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? + s.jsonpCallback() : + s.jsonpCallback; + + // Insert callback into url or form data + if ( jsonProp ) { + s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); + } else if ( s.jsonp !== false ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; + } + + // Use data converter to retrieve json after script execution + s.converters[ "script json" ] = function() { + if ( !responseContainer ) { + jQuery.error( callbackName + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // Force json dataType + s.dataTypes[ 0 ] = "json"; + + // Install callback + overwritten = window[ callbackName ]; + window[ callbackName ] = function() { + responseContainer = arguments; + }; + + // Clean-up function (fires after converters) + jqXHR.always( function() { + + // If previous value didn't exist - remove it + if ( overwritten === undefined ) { + jQuery( window ).removeProp( callbackName ); + + // Otherwise restore preexisting value + } else { + window[ callbackName ] = overwritten; + } + + // Save back as free + if ( s[ callbackName ] ) { + + // Make sure that re-using the options doesn't screw things around + s.jsonpCallback = originalSettings.jsonpCallback; + + // Save the callback name for future use + oldCallbacks.push( callbackName ); + } + + // Call if it was a function and we have a response + if ( responseContainer && isFunction( overwritten ) ) { + overwritten( responseContainer[ 0 ] ); + } + + responseContainer = overwritten = undefined; + } ); + + // Delegate to script + return "script"; + } +} ); + + + + +// Support: Safari 8 only +// In Safari 8 documents created via document.implementation.createHTMLDocument +// collapse sibling forms: the second one becomes a child of the first one. +// Because of that, this security measure has to be disabled in Safari 8. +// https://bugs.webkit.org/show_bug.cgi?id=137337 +support.createHTMLDocument = ( function() { + var body = document.implementation.createHTMLDocument( "" ).body; + body.innerHTML = "<form></form><form></form>"; + return body.childNodes.length === 2; +} )(); + + +// Argument "data" should be string of html +// context (optional): If specified, the fragment will be created in this context, +// defaults to document +// keepScripts (optional): If true, will include scripts passed in the html string +jQuery.parseHTML = function( data, context, keepScripts ) { + if ( typeof data !== "string" ) { + return []; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + + var base, parsed, scripts; + + if ( !context ) { + + // Stop scripts or inline event handlers from being executed immediately + // by using document.implementation + if ( support.createHTMLDocument ) { + context = document.implementation.createHTMLDocument( "" ); + + // Set the base href for the created document + // so any parsed elements with URLs + // are based on the document's URL (gh-2965) + base = context.createElement( "base" ); + base.href = document.location.href; + context.head.appendChild( base ); + } else { + context = document; + } + } + + parsed = rsingleTag.exec( data ); + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[ 1 ] ) ]; + } + + parsed = buildFragment( [ data ], context, scripts ); + + if ( scripts && scripts.length ) { + jQuery( scripts ).remove(); + } + + return jQuery.merge( [], parsed.childNodes ); +}; + + +/** + * Load a url into a page + */ +jQuery.fn.load = function( url, params, callback ) { + var selector, type, response, + self = this, + off = url.indexOf( " " ); + + if ( off > -1 ) { + selector = stripAndCollapse( url.slice( off ) ); + url = url.slice( 0, off ); + } + + // If it's a function + if ( isFunction( params ) ) { + + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( params && typeof params === "object" ) { + type = "POST"; + } + + // If we have elements to modify, make the request + if ( self.length > 0 ) { + jQuery.ajax( { + url: url, + + // If "type" variable is undefined, then "GET" method will be used. + // Make value of this field explicit since + // user can override it through ajaxSetup method + type: type || "GET", + dataType: "html", + data: params + } ).done( function( responseText ) { + + // Save response for use in complete callback + response = arguments; + + self.html( selector ? + + // If a selector was specified, locate the right elements in a dummy div + // Exclude scripts to avoid IE 'Permission Denied' errors + jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : + + // Otherwise use the full result + responseText ); + + // If the request succeeds, this function gets "data", "status", "jqXHR" + // but they are ignored because response was set above. + // If it fails, this function gets "jqXHR", "status", "error" + } ).always( callback && function( jqXHR, status ) { + self.each( function() { + callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); + } ); + } ); + } + + return this; +}; + + + + +jQuery.expr.pseudos.animated = function( elem ) { + return jQuery.grep( jQuery.timers, function( fn ) { + return elem === fn.elem; + } ).length; +}; + + + + +jQuery.offset = { + setOffset: function( elem, options, i ) { + var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, + position = jQuery.css( elem, "position" ), + curElem = jQuery( elem ), + props = {}; + + // Set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + curOffset = curElem.offset(); + curCSSTop = jQuery.css( elem, "top" ); + curCSSLeft = jQuery.css( elem, "left" ); + calculatePosition = ( position === "absolute" || position === "fixed" ) && + ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; + + // Need to be able to calculate position if either + // top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( isFunction( options ) ) { + + // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) + options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + + } else { + curElem.css( props ); + } + } +}; + +jQuery.fn.extend( { + + // offset() relates an element's border box to the document origin + offset: function( options ) { + + // Preserve chaining for setter + if ( arguments.length ) { + return options === undefined ? + this : + this.each( function( i ) { + jQuery.offset.setOffset( this, options, i ); + } ); + } + + var rect, win, + elem = this[ 0 ]; + + if ( !elem ) { + return; + } + + // Return zeros for disconnected and hidden (display: none) elements (gh-2310) + // Support: IE <=11 only + // Running getBoundingClientRect on a + // disconnected node in IE throws an error + if ( !elem.getClientRects().length ) { + return { top: 0, left: 0 }; + } + + // Get document-relative position by adding viewport scroll to viewport-relative gBCR + rect = elem.getBoundingClientRect(); + win = elem.ownerDocument.defaultView; + return { + top: rect.top + win.pageYOffset, + left: rect.left + win.pageXOffset + }; + }, + + // position() relates an element's margin box to its offset parent's padding box + // This corresponds to the behavior of CSS absolute positioning + position: function() { + if ( !this[ 0 ] ) { + return; + } + + var offsetParent, offset, doc, + elem = this[ 0 ], + parentOffset = { top: 0, left: 0 }; + + // position:fixed elements are offset from the viewport, which itself always has zero offset + if ( jQuery.css( elem, "position" ) === "fixed" ) { + + // Assume position:fixed implies availability of getBoundingClientRect + offset = elem.getBoundingClientRect(); + + } else { + offset = this.offset(); + + // Account for the *real* offset parent, which can be the document or its root element + // when a statically positioned element is identified + doc = elem.ownerDocument; + offsetParent = elem.offsetParent || doc.documentElement; + while ( offsetParent && + ( offsetParent === doc.body || offsetParent === doc.documentElement ) && + jQuery.css( offsetParent, "position" ) === "static" ) { + + offsetParent = offsetParent.parentNode; + } + if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { + + // Incorporate borders into its offset, since they are outside its content origin + parentOffset = jQuery( offsetParent ).offset(); + parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); + parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); + } + } + + // Subtract parent offsets and element margins + return { + top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), + left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) + }; + }, + + // This method will return documentElement in the following cases: + // 1) For the element inside the iframe without offsetParent, this method will return + // documentElement of the parent window + // 2) For the hidden or detached element + // 3) For body or html element, i.e. in case of the html node - it will return itself + // + // but those exceptions were never presented as a real life use-cases + // and might be considered as more preferable results. + // + // This logic, however, is not guaranteed and can change at any point in the future + offsetParent: function() { + return this.map( function() { + var offsetParent = this.offsetParent; + + while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { + offsetParent = offsetParent.offsetParent; + } + + return offsetParent || documentElement; + } ); + } +} ); + +// Create scrollLeft and scrollTop methods +jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { + var top = "pageYOffset" === prop; + + jQuery.fn[ method ] = function( val ) { + return access( this, function( elem, method, val ) { + + // Coalesce documents and windows + var win; + if ( isWindow( elem ) ) { + win = elem; + } else if ( elem.nodeType === 9 ) { + win = elem.defaultView; + } + + if ( val === undefined ) { + return win ? win[ prop ] : elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : win.pageXOffset, + top ? val : win.pageYOffset + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length ); + }; +} ); + +// Support: Safari <=7 - 9.1, Chrome <=37 - 49 +// Add the top/left cssHooks using jQuery.fn.position +// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 +// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 +// getComputedStyle returns percent when specified for top/left/bottom/right; +// rather than make the css module depend on the offset module, just check for it here +jQuery.each( [ "top", "left" ], function( _i, prop ) { + jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, + function( elem, computed ) { + if ( computed ) { + computed = curCSS( elem, prop ); + + // If curCSS returns percentage, fallback to offset + return rnumnonpx.test( computed ) ? + jQuery( elem ).position()[ prop ] + "px" : + computed; + } + } + ); +} ); + + +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + jQuery.each( { + padding: "inner" + name, + content: type, + "": "outer" + name + }, function( defaultExtra, funcName ) { + + // Margin is only for outerHeight, outerWidth + jQuery.fn[ funcName ] = function( margin, value ) { + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); + + return access( this, function( elem, type, value ) { + var doc; + + if ( isWindow( elem ) ) { + + // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) + return funcName.indexOf( "outer" ) === 0 ? + elem[ "inner" + name ] : + elem.document.documentElement[ "client" + name ]; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + doc = elem.documentElement; + + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], + // whichever is greatest + return Math.max( + elem.body[ "scroll" + name ], doc[ "scroll" + name ], + elem.body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + } + + return value === undefined ? + + // Get width or height on the element, requesting but not forcing parseFloat + jQuery.css( elem, type, extra ) : + + // Set width or height on the element + jQuery.style( elem, type, value, extra ); + }, type, chainable ? margin : undefined, chainable ); + }; + } ); +} ); + + +jQuery.each( [ + "ajaxStart", + "ajaxStop", + "ajaxComplete", + "ajaxError", + "ajaxSuccess", + "ajaxSend" +], function( _i, type ) { + jQuery.fn[ type ] = function( fn ) { + return this.on( type, fn ); + }; +} ); + + + + +jQuery.fn.extend( { + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? + this.off( selector, "**" ) : + this.off( types, selector || "**", fn ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + +jQuery.each( + ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( _i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + } +); + + + + +// Support: Android <=4.0 only +// Make sure we trim BOM and NBSP +var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + +// Bind a function to a context, optionally partially applying any +// arguments. +// jQuery.proxy is deprecated to promote standards (specifically Function#bind) +// However, it is not slated for removal any time soon +jQuery.proxy = function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; +}; + +jQuery.holdReady = function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } +}; +jQuery.isArray = Array.isArray; +jQuery.parseJSON = JSON.parse; +jQuery.nodeName = nodeName; +jQuery.isFunction = isFunction; +jQuery.isWindow = isWindow; +jQuery.camelCase = camelCase; +jQuery.type = toType; + +jQuery.now = Date.now; + +jQuery.isNumeric = function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); +}; + +jQuery.trim = function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); +}; + + + +// Register as a named AMD module, since jQuery can be concatenated with other +// files that may use define, but not via a proper concatenation script that +// understands anonymous AMD modules. A named AMD is safest and most robust +// way to register. Lowercase jquery is used because AMD module names are +// derived from file names, and jQuery is normally delivered in a lowercase +// file name. Do this after creating the global so that if an AMD module wants +// to call noConflict to hide this version of jQuery, it will work. + +// Note that for maximum portability, libraries that are not jQuery should +// declare themselves as anonymous modules, and avoid setting a global if an +// AMD loader is present. jQuery is a special case. For more information, see +// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon + +if ( typeof define === "function" && define.amd ) { + define( "jquery", [], function() { + return jQuery; + } ); +} + + + + +var + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$; + +jQuery.noConflict = function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; +}; + +// Expose jQuery and $ identifiers, even in AMD +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (#13566) +if ( typeof noGlobal === "undefined" ) { + window.jQuery = window.$ = jQuery; +} + + + + +return jQuery; +} ); diff --git a/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.min.js b/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.min.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); diff --git a/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.min.map b/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.min.map new file mode 100644 index 00000000..7d86eb16 --- /dev/null +++ b/docs/coverage/lib/jquery-3.6.0/jquery-3.6.0.min.map @@ -0,0 +1 @@ +{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"}
\ No newline at end of file |